JdbcTemplate-课堂笔记
一、元数据(了解)
- 什么是元数据
- 元数据:MetaData,定义数据的数据。在数据库里,指数据库、表、字段等等的定义信息
- JDBC里的元数据有:
- DatabaseMetaData:数据库的元数据,定义了数据库的名称、类型、版本等等信息
- ParameterMetaData:预编译对象中,SQL参数的个数、类型等等定义信息
- ResultSetMetaData:结果集的元数据,定义了结果集对象中,列的个数、名称、类型等等信息
- ParameterMetaData
- 如何获取:preparedStatement.getParameterMetaData()
- 有何作用:
- 可以获取预编译SQL中,参数的个数:getParameterCount()
- 可以获取预编译SQL中,某个参数的类型:getParameterType(int 参数序号)
注意:并非所有数据库,都可以从ParameterMetaData中获取参数的类型,比如:MySql
- ResultSetMetaData
- 如何获取:resultSet.getMetaData()
- 有何作用:
- 可以获取结果集中,列的个数:getColumnCount()
- 可以获取结果集中,列的名称:getColumnName(int 列序号)
- 可以获取结果集中,列的类型:getColumnType(int 列序号)
二、自定义JDBCTemplate
- JdbcTemplate简介
- JdbcTemplate:是Spring框架的一部分,把JDBC操作进行了简化封装。我们要执行SQL语句,只需要提供SQL和参数,就可以得到结果了。
- 相关的jar包:
- 使用的步骤
- 导入jar包:数据库驱动包, 连接池的包,JDBCTemplate的jar包
- 准备工具类(工具类里有连接池),及工具类使用的配置文件
- 编写代码,使用JdbcTemplate操作数据库
- 创建JdbcTemplate对象:new JdbcTemplate(DataSource dataSource)
- 执行SQL语句:
- execute(sql):执行任意语句,但是没有返回值。通常用于执行DDL
- update(sql, params):执行DML语句,返回int 表示影响的行数
- queryxxx():执行DQL语句,方法比较多,单独讲
三、JdbcTemplate的使用
- 执行任意语句:execute()
-
方法:execute(String sql)
-
参数:
- sql:要执行的SQL语句
-
返回值:无void
-
示例:
/** * 创建一张表:emp,有字段:主键id, 员工姓名ename, 员工性别sex,员工生日birthday */ @Test public void test(){ JdbcTemplate jdbcTemplate = new JdbcTemplate(JdbcUtils.getDataSource()); String sql = "CREATE TABLE emp(\n" + "\tid INT PRIMARY KEY AUTO_INCREMENT,\n" + "\tename VARCHAR(20),\n" + "\tsex CHAR(1),\n" + "\tbirthday DATE\n" + ")"; jdbcTemplate.execute(sql); }
- 执行DML语句:update()
- 方法:update(String sql, Object… params)
- 参数:
- sql:要执行的SQL语句
- params:执行SQL语句需要的参数值
- 返回值:
- int,表示影响的行数
- 示例:
public class Demo02JdbcTemplateUpdate {
private JdbcTemplate jdbcTemplate = new JdbcTemplate(JdbcUtils.getDataSource());
/**
* 向emp表插入一条记录
*/
@Test
public void insert(){
int update = jdbcTemplate.update(“insert into emp (id,ename,sex,birthday) values (?,?,?,?)”, null, “大郎”, “男”,
“2000-01-01”);
System.out.println(“影响行数:” + update);
}/**
* 修改emp表里,大郎 的性别
*/
@Test
public void update(){
int update = jdbcTemplate.update(“update emp set sex = ? where ename = ?”, “女”, “大郎”);
System.out.println(“影响行数:” + update);
}/**
* 删除emp表里的数据:大郎
*/
@Test
public void delete(){
int update = jdbcTemplate.update(“delete from emp where ename = ?”, “大郎”);
System.out.println(“影响行数:” + update);
}
}
- 执行DQL语句:queryxxx()
3.1 方法介绍
- queryForObject(String sql, Class resultType, Object… params):用于查询一个值,比如:查询数量
- 参数:
- sql:要执行的SQL语句
- resultType:想要的结果类型。比如:Integer.class,方法就得到Integer类型的结果
- params:执行SQL语句需要的参数值
- 返回值:
- 由参数resultType决定的
- 参数:
- queryForMap(String sql, Object… params):用于查询一条记录,得到Map
- 参数:
- sql:要执行的SQL语句
- params:执行SQL语句需要的参数值
- 返回值:
- Map<String, Object>, 即是:Map<字段名,字段值>
- 参数:
- queryForList(String sql, Object… params):用于查询多条记录,得到List
- 参数:
- sql:要执行的SQL语句
- params:执行SQL语句需要的参数值
- 返回值:
- List<Map<String, Object>>,即是:List<Map<字段名,字段值>>
- 参数:
- query(String sql, RowMapper rowMapper, Object… params):用于查询多条记录,得到JavaBean的集合
- 参数:
- sql:要执行的SQL语句
- rowMapper:用来设置表字段 和 JavaBean的属性对应关系,即:把一个字段的值,设置给JavaBean的哪个属性
- params:执行SQL语句,需要的参数值
- 返回值:
- List<JavaBean对象>:每条记录封装成一个JavaBean对象,所有JavaBean对象放在一个List里
- 参数:
- queryForObject(String sql, RowMapper rowMapper, Object… params):查询一条记录,封装成JavaBean对象
- 参数:
- sql:要执行的SQL语句
- rowMapper:用来设置表字段 和 JavaBean的属性对应关系,即:把一个字段的值,设置给JavaBean的哪个属性
- params:执行SQL语句,需要的参数值
- 返回值:
- 一个JavaBean对象
- 参数:
3.2 queryForObject()查询数量
- 需求:查询emp表的数量 queryForObject(sql, resultType, params)
/**
* 1. 查询emp表里数量:queryForObject
/
@Test
public void queryCount(){
Integer count = jdbcTemplate.queryForObject("select count() from emp", Integer.class);//Long count = jdbcTemplate.queryForObject(“select count(*) from emp”, Long.class);
//int count = jdbcTemplate.queryForObject(“select count(*) from emp”, int.class);
System.out.println(“数量:” + count);
}
3.3 queryForMap()查询一条,得到Map
- 需求:查询姓名为大郎 的员工信息,得到Map queryForMap(sql, params)
/**
* 2. 查询emp表里ename为大郎的员工,得到Map
*/
@Test
public void queryMap(){
Map<String, Object> map = jdbcTemplate.queryForMap(“select * from emp where ename = ?”, “大郎”);
System.out.println(map);
}
3.4 queryForList()查询多条,得到List
- 需求:查询emp表里所有男性员工,得到List queryForList(sql, params)
/**
* 3. 查询emp表里所有男性员工,得到List
*/
@Test
public void queryList(){
List<Map<String, Object>> mapList = jdbcTemplate.queryForList(“select * from emp where sex = ?”, “男”);
for (Map<String, Object> map : mapList) {
System.out.println(map);
}
}
3.5 query()查询多条,得到JavaBean集合
- 需求:查询emp表里所有男性员工,得到List
- query(sql, new BeanPropertyRowMapper<>(JavaBean类名.class), params)
@Test
public void queryEmpList2(){
List empList = jdbcTemplate.query(“select * from emp where sex = ?”, new BeanPropertyRowMapper<>(Emp.class), “男”);for (Emp emp : empList) {
System.out.println(emp);
}
}
3.6 queryForObject()查询一条,得到一个JavaBean对象
- 需求:查询ename为大郎的员工信息,得到一个Emp对象
- queryForObject(sql, new BeanPropertyRowMapper<>(JavaBean类名.class), params)
/**
* 5. 查询mep表里ename为大郎的员工,得到Emp对象
*/
@Test
public void queryOneEmp(){
Emp emp = null;
try {
emp = jdbcTemplate.queryForObject(“select * from emp where ename = ?”, new BeanPropertyRowMapper<>(Emp.class), “大郎111”);
//ctrl + alt + b:显示出来选中类的所有实现类
} catch (EmptyResultDataAccessException e) {
e.printStackTrace();
}System.out.println(emp);
}
注意:使用queryForObject查询一条记录,得到一个JavaBean对象时,应该使用try…catch,捕获EmptyResultDataAccessExcpetion
内容回顾
- 了解元数据
- 掌握JdbcTemplate执行SQL语句的方法
- 步骤:
- 导入jar包:数据库驱动包,连接池的jar包,JdbcTemplate的jar包
- 提供配置文件和工具类(工具类里主要是提供了一个获取DataSource的方法)
- 编写代码,使用JdbcTemplate
- 常用执行SQL语句的方法
- 查询数量:queryForObject(sql, resultType, params)
- 查询一条记录得到Map:queryForMap(sql, params)
- 查询多条记录得到List:queryForList(sql, params)
- 查询多条记录得到JavaBean的集合:query(sql,new BeanPropertyRowMapper<>(JavaBean类名.class), params)
- 查询一条记录得到JavaBean对象:queryForObject(sql,new BeanPropertyRowMapper<>(JavaBean类名.class), params)
- 步骤:
- Java开发的三层架构:放到JSP/EL/JSTL讲JavaEE三层架构