概述
为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架。
作为Spring JDBC框架的核心,JDBC模板的设计目的是为不同类型的JDBC操作提供模板方法,通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低。
可以将Spring的JdbcTemplate看作是一个小型的轻量级持久化层框架,和我们之前使用过的DBUtils风格非常接近。
环境准备
导包
1) IOC容器所需jar包
1 | commons-logging-1.1.1.jar |
2) jdbcTemplate所需的jar包
1 | spring-jdbc-4.0.0.RELEASE.jar |
3) 数据库驱动和数据源
1 | c3p0-0.9.1.2.jar |
3) 数据库基本信息文件db.properties
1 | jdbc.user=root |
4) Spring配置文件
1 | <context:property-placeholder location="classpath:db.properties"/> |
持久化操作
- 增删改
JdbcTemplate.update(String, Object…)1
String sql = "UPDATE employee set salary=? WHERE emp_id=?;";int a = template.update(sql, 1345.00, 4);
- 批量增删改
- Object[]封装了SQL语句每一次执行时所需要的参数
- List集合封装了SQL语句多次执行时的所有参数
JdbcTemplate.batchUpdate(String, List<Object[]>)1
2
3
4
5
6
7JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
String sql = "INSERT INTO employee(emp_name,salary) VALUES(?,?)";
List<Object[]> batchArgs = new ArrayList<>();
batchArgs.add(new Object[] {"boby",11120.00});
batchArgs.add(new Object[] {"GGBound",10202.00});
int[] res = bean.batchUpdate(sql, batchArgs);
System.out.println(Arrays.asList(res));
- 查询单行
- 封装成java对象返回
JdbcTemplate.queryForObject(String, RowMapper, Object…) 1
2String sql = "SELECT emp_id, emp_name, salary from employee WHERE emp_id=?";
Object forObject = bean.queryForObject(sql, new BeanPropertyRowMapper(Employee.class), 5);
- 查询多行
- RowMapper对象依然可以使用BeanPropertyRowMapper
JdbcTemplate.query(String, RowMapper, Object…) 1
2String sql = "SELECT emp_id, emp_name, salary from employee WHERE salary>?";
List query = bean.query(sql, new BeanPropertyRowMapper(Employee.class), 4000);
- 查询单一值
- 查询没结果时会报错
JdbcTemplate.queryForObject(String, Class, Object…)1
2String sql = "SELECT MAX(salary) FROM employee";
Object forObject = bean.queryForObject(sql, Double.class);使用具名参数的JdbcTemplate
关于具名参数
在Hibernate的HQL查询中我们体验过具名参数的使用,相对于基于位置的参数,具名参数具有更好的可维护性,在SQL语句中参数较多时可以考虑使用具名参数。
在Spring中可以通过NamedParameterJdbcTemplate类的对象使用带有具名参数的SQL语句。容器创建具名参数的JDBCTemplate对象
1
2
3<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
</bean>具名参数传入
①通过Map对象传入
- Map的键是参数名,值是参数值
NamedParameterJdbcTemplate.update(String, Map<String, ?>)
1 | String sql = "INSERT INTO employee(emp_name,salary) VALUES(:empName, :salary)"; |
②通过SqlParameterSource对象传入
1 | NamedParameterJdbcTemplate bean = ioc.getBean(NamedParameterJdbcTemplate.class); |
数据库
1 | /* |