Jdbctemplate
一、元数据(了解)
1. 什么是元数据
-
元数据:MetaData,定义数据的数据。在数据库里,指数据库、表、字段等等的定义信息
-
JDBC里有哪些常见的元数据对象:
-
DatabaseMetaData
:定义数据库的信息,名称、类型、版本等等 -
ParameterMetaData
:定义预编译对象的信息,包含了预编译的SQL中,参数的个数、类型等等 -
ResultSetMetaData
:定义结果集对象的信息,包含查询结果集里,列的个数、名称、类型等等
-
2. ParameterMetaData
-
怎样获取:
preparedStatement.getParameterMetaData()
-
使用的API:
-
获取预编译SQL中,参数个数:
getParameterCount()
-
获取预编译SQL中,参数类型:
getParamteType(int 参数序号)
注意:并非所有数据库都可以获取SQL中参数类型,比如:MySql
-
3. ResultSetMetaData
-
怎样获取:
resultSet.getMetadata()
-
使用的API:
-
获取结果集中,列的个数:
getColumnCount()
-
获取结果集中,列的名称:
getColumnName(int 列序号)
-
获取结果集中,列的类型:
getColumnType(int 列序号)
-
二、自定义JdbcTemplate
三、==jdbcTemplate的使用==
1. 什么是JdbcTemplate
-
JdbcTemplate:是Spring框架的一部分,封装简化了JDBC的操作,帮我们处理了资源的获取和释放。我们只要提供sql语句和参数,就可以得到执行的结果了
-
相关的jar包:
-
常用方法:
-
构造方法:
JdbcTemplate(DataSource dataSource)
-
执行任意语句:
execute(sql)
,此方法没有返回值 -
执行DML语句:
update(String sql, Object... params)
,返回int,影响行数 -
执行DQL语句:
queryxxx()
方法多,单独讲解
-
2. 使用JdbcTemplate
2.1 执行任意语句execute
方法(了解)
-
方法:
jdbcTemplate.execute(sql)
-
参数:要执行的SQL
-
返回值:无
-
2.2 进行增、删、改操作
-
方法:
jdbcTemplate.update(String sql, Object... params)
-
参数:
-
sql:要执行的SQL语句。如果有参数,必须是?处理过的
-
params:执行SQL语句需要的参数值
-
-
返回值:
-
int,表示影响的行数
-
-
2.3 进行查询操作
2.3.1 ==查询一个值==:
-
方法:
queryForObject(String sql, Class resultType, Object... params)
-
参数:
-
sql:要执行的sql语句
-
resultType:想要什么类型的结果,比如:Integer.class, String.class
-
params:执行SQL语句需要的参数值
-
-
返回值:
-
一个值,类型是由参数resultType决定的
通常用于查询数量,结果是一个值,类型通常是Integer
-
-
示例:
public void queryOne(){
//Integer count = jdbcTemplate.queryForObject("select count(*) from user", Integer.class);
Integer count = jdbcTemplate.queryForObject("select count(*) from user where sex = ?", Integer.class, "男");
System.out.println("user表里的数量:" + count);
}
2.3.2 查询一条记录Map:
-
方法:
queryForMap(String sql, Object... params)
-
参数:
-
sql:要执行的SQL语句
-
params:执行SQL语句需要的参数值
-
-
返回值:
-
Map<String, Object>
是Map<字段名, 字段值>
-
-
示例:
/**
* 查询姓名是 大郎 的用户信息,得到Map<字段名,字段值>
*/
2.3.3 查询多条记录List:
-
方法:
queryForList(String sql, Object... params)
-
参数:
-
sql:要执行的SQL语句
-
params:执行SQL语句需要的参数值
-
-
返回值:
-
List<Map<String,Object>>
:每条记录是一个Map,把所有记录的Map放到List里
-
-
示例:
/**
* 查询性别为男的所有用户,得到List
*/
2.3.4 ==查询多条记录,得到JavaBean对象的集合==:
-
方法:
query(String sql, RowMapper rowMapper, Object.. params)
-
参数:
-
sql:要执行的SQL语句
-
rowMapper:用于设置结果集中列的数据,对应到JavaBean哪个属性上,是设置对应关系的
-
可以简化写成:
new BeanPropertyRowMapper<>(JavaBean名称.class)
-
-
params:执行SQL语句需要的参数值
-
-
返回值:
-
List<JavaBean对象>
。List里每个JavaBean,是一条记录的数据封装成的对象
-
-
JavaBean:有特定结构的简单Java类。数据库里每张表,都可以有一个对应的JavaBean;表里每条记录,都对应一个JavaBean的对象。
-
类里要有私有属性
-
类里要有无参构造
-
每个属性要有public的get/set方法
-
-
示例:查询所有用户,得到用户集合
List<User>
/**
* JavaBean:一种特殊结构的简单Java类,要求:
* 1. 类里要有private的属性
* 2. 每个属性要有public的get/set方法
* 3. 要有无参构造
* 4. 建议每个属性的类型,写成包装类,而不要写成基本数据类型
*/
public class User {
private Integer id;
private String username;
private String password;
private String sex;
private Date birthday;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
/*
查询所有性别为的用户,得到List<User>
*/
2.3.5 ==查询一条记录,得到JavaBean对象==:
-
方法:
queryForObject(String sql, RowMapper rowMapper, Object.. params)
注意:如果找不到数据,方法会抛异常
EmptyResultDataAccessException
。我们认为是正常的,应该try..catch,让异常不影响后边代码的继续执行
-
参数:
-
sql:要执行的SQL语句
-
rowMapper:用于设置结果集中列的数据,对应到JavaBean哪个属性上,是设置对应关系的
-
可以简写成:
new BeanPropertyRowMapper<>(JavaBean类名.class)
-
-
params:执行SQL语句需要的参数值
-
-
返回值:
-
List<JavaBean对象>
。List里每个JavaBean,是一条记录的数据封装成的对象
-
-
示例
/**
* 查询用户名为 大朗 的信息,得到一个User对象
*/
内容总结
-
了解元数据
-
理解自定义MyJdbcTemplate的过程原理
-
使用JDBCTemplate执行SQL语句:
-
导入jar包:JDBCTemplate的5个包,c3p0连接池的包,数据库驱动包
-
创建JDBCTemplate对象:
new JdbcTemplate(DataSource dataSource)
-
使用方法,执行SQL语句
-
execute()
:执行任意SQL语句,但是没有返回值 -
==
update(sql, params)
:执行DML语句,返回int,表示影响行数== -
==
queryForObject(sql, resultType, params)
:查询一个值,比如:查询数量== -
queryForMap(sql, params)
:查询一条记录,得到Map<字段名String,字段值Object>
-
queryForList(sql, params)
:查询多条记录,得到List<Map<String,Object>>
-
==
query(sql, new BeanPropertyRowMapper<>(JavaBean类名.class), params)
:查询多条记录,得到JavaBean的集合== -
==
queryForObject(sql, new BeanPropertyRowMapper<>(JavaBean类名.class), params)
:查询一条记录,得到一个JavaBean对象==
-
-
-
分层开发:JSP/EL/JSTL 这天讲分层开发:JavaEE的三层架构
-