一、JdbcTemplate概述##
- 为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架。
- JdbcTemplate是Spring JDBC框架的核心,其设计目的是为不同类型的JDBC操作提供模板方法,每个模板方法都能够控制整个过程,并允许覆盖过程中的特定任务。通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低。
二、JdbcTemplate的使用
-
使用JdbcTemplate更新数据库
① 单个更新:使用
int jdbcTemplate.update(String sql, Object... args)
方法。
② 批量更新:使用
int[] jdbcTemplate.batchUpdate(String sql, List<Object[]> batchArgs)
方法。
③ 举个例子:
//单个更新 String sql = "update employee set name = ? where id = ?"; jdbcTemplate.update(sql, "33", 3);
//批量更新 String sql = "insert into employee(last_name, email, dept_id) values(?,?,?)"; List<Object[]> batchArgs = new ArrayList<Object[]>(); batchArgs.add(new Object[]{"testA","[email protected]",1}); batchArgs.add(new Object[]{"testB","[email protected]",2}); batchArgs.add(new Object[]{"testC","[email protected]",3}); //执行批量insert操作 jdbcTemplate.batchUpdate(sql, batchArgs);
-
使用JdbcTemplate查询数据库
① 查询单行:使用
T JdbcTemplate.queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)
方法
② 查询多行:使用
List<T> JdbcTemplate.query(String sql, RowMapper<Employee> rowMapper, Object... args)
方法
③ 查询单列:使用
方法T JdbcTemplate.queryForObject(String sql, Class<Long> requiredType)
//查询单行 String sql = "select id, last_name lastName, email from employee where id = ?"; RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class); Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, 1); System.out.println(employee);
//查询多行 String sql = "select id, last_name lastName, email from employee where id > ?"; RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class); List<Employee> employees = jdbcTemplate.query(sql, rowMapper, 4); System.out.println(employees);
//查询单列 String sql = "select count(id) from employee"; long count = jdbcTemplate.queryForObject(sql, Long.class); System.out.println(count);
-
简化JDBC模板查询
为了避免每次使用都创建一个新的JdbcTemplate实例,可以在Spring IOC容器中声明一个JdbcTemplate的单个实例的Bean(需要注入数据源),并注入到DAO层中JdbcTemplate的对象中。
<!-- 配置Spring的JdbcTemplate --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean>
-
JdbcDaoSupport简介
Spring还提供了一个JdbcDaoSupport类来简化DAO操作。该类声明了jdbcTemplate属性,它可以从IOC容器中注入,或者自动从数据源中创建 。
三、NamedParameterJdbcTemplate的使用
- 经典的JDBC用法中,SQL参数是用占位符 ? 表示,并受到顺序的限制,当参数个数比较多时,占位符的顺序就容易出错,而且一旦参数顺序发生变化,就要改变参数绑定。
- 在Spring JDBC框架中,可以使用具名参数(named parameter)解决这一问题。
- 具名参数:SQL按名称(需要以冒号开头)指定。易于维护,提升了可读性。具名参数有框架类在运行时用占位符取代。
-
NamedParameterJdbcTemplate 中可以使用具名参数。
① 在SPringle IOC容器中声明一个NamedParameterJdbcTemplate单实例的Bean。
② 在SQL语句中使用具名参数时,可以声明一个Map,将SQL的参数名作为key,参数值作为value
优点:直接对参数名,不用管顺序,便于维护。
缺点:较为麻烦。
③ 也可以使用 SqlParameterSource 的实现类 BeanPropertySqlParameterSource作为参数。
④ 举个例子:
/**
* 使用具名参数: 声明一个Map作为参数
*/
String sql = "insert into employee(last_name, email, dept_id)
values(:ln, :email, :deptId)";
Map<String,Object> paramMap = new HashMap<String, Object>();
paramMap.put("ln", "Mike");
paramMap.put("email", "[email protected]");
paramMap.put("deptId", "3");
namedParameterJdbcTemplate.update(sql, paramMap);
/**
* 使用具名参数: 使用 SqlParameterSource作为参数
*/
String sql = "insert into employee(last_name, email, dept_id)
values(:lastName, :email, :deptId)";
Employee employee = new Employee();
employee.setLastName("Jack");
employee.setEmail("[email protected]");
employee.setDeptId(2);
SqlParameterSource sqlParameterSource = new BeanPropertySqlParameterSource(employee);
namedParameterJdbcTemplate.update(sql, sqlParameterSource);