第07章JdbcTemplate

1. 概述

为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架。

作为Spring JDBC框架的核心,JDBC模板的设计目的是为不同类型的JDBC操作提供模板方法,通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低。

可以将Spring的JdbcTemplate看作是一个小型的轻量级持久化层框架,和我们之前使用过的DBUtils风格非常接近。

2. 环境准备
2.1 导入JAR包

①IOC容器所需要的JAR包

commons-logging-1.1.1.jar

spring-beans-4.0.0.RELEASE.jar

spring-context-4.0.0.RELEASE.jar

spring-core-4.0.0.RELEASE.jar

spring-expression-4.0.0.RELEASE.jar

②JdbcTemplate所需要的JAR包

spring-jdbc-4.0.0.RELEASE.jar

spring-orm-4.0.0.RELEASE.jar

spring-tx-4.0.0.RELEASE.jar

③数据库驱动和数据源

c3p0-0.9.1.2.jar

mysql-connector-java-5.1.7-bin.jar

2.2 创建连接数据库基本信息属性文件

user=root

password=root

jdbcUrl=jdbc:mysql:///query_data

driverClass=com.mysql.jdbc.Driver

initialPoolSize=30

minPoolSize=10

maxPoolSize=100

acquireIncrement=5

maxStatements=1000

maxStatementsPerConnection=10

2.3 在Spring配置文件中配置相关的bean

①数据源对象

<context:property-placeholder location="classpath:jdbc.properties"/>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

<property name="user" value="${user}"/>

<property name="password" value="${password}"/>

<property name="jdbcUrl" value="${jdbcUrl}"/>

<property name="driverClass" value="${driverClass}"/>

<property name="initialPoolSize" value="${initialPoolSize}"/>

<property name="minPoolSize" value="${minPoolSize}"/>

<property name="maxPoolSize" value="${maxPoolSize}"/>

<property name="acquireIncrement" value="${acquireIncrement}"/>

<property name="maxStatements" value="${maxStatements}"/>

<property name="maxStatementsPerConnection" value="${maxStatementsPerConnection}"/>

</bean>

②JdbcTemplate对象

<bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">

<property name="dataSource" ref="dataSource"/>

</bean>

3. 持久化操作
3.1 增删改

JdbcTemplate.update(String, Object...)

3.2 批量增删改

JdbcTemplate.batchUpdate(String, List<Object[]>)

Object[]封装了SQL语句每一次执行时所需要的参数

List集合封装了SQL语句多次执行时的所有参数

3.3 查询单行

JdbcTemplate.queryForObject(String, RowMapper<Department>, Object...)

3.4 查询多行

JdbcTemplate.query(String, RowMapper<Department>, Object...)

RowMapper对象依然可以使用BeanPropertyRowMapper

3.5 查询单一值

JdbcTemplate.queryForObject(String, Class, Object...)

4. 使用具名参数的JdbcTemplate
4.1关于具名参数

在Hibernate的HQL查询中我们体验过具名参数的使用,相对于基于位置的参数,具名参数具有更好的可维护性,在SQL语句中参数较多时可以考虑使用具名参数。

在Spring中可以通过NamedParameterJdbcTemplate类的对象使用带有具名参数的SQL语句。

4.2 通过IOC容器创建NamedParameterJdbcTemplate对象

<!-- 配置可以使用具名参数的JDBCTemplate类对象 -->

<bean

id="namedTemplate"

class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">

<!-- 没有无参构造器,必须传入数据源或JdbcTemplate对象 -->

<constructor-arg ref="dataSource"/>

</bean>

4.3 具名参数在SQL语句中的格式

INSERT INTO depts (dept_name) VALUES (:deptName)

4.4 具名参数传入

①通过Map对象传入

NamedParameterJdbcTemplate.update(String, Map<String, ?>)

Map的键是参数名,值是参数值

②通过SqlParameterSource对象传入

String sql = "INSERT INTO depts (dept_name) VALUES (:deptName)";

Department department = new Department(null, "YYY", null);

SqlParameterSource sqlParameterSource =

new BeanPropertySqlParameterSource(department);

namedTemplate.update(sql, sqlParameterSource);

5. 使用JdbcTemplate实现Dao
5.1 通过IOC容器自动注入

JdbcTemplate类是线程安全的,所以可以在IOC容器中声明它的单个实例,并将这个实例注入到所有的Dao实例中。

@Repository

public class EmployeeDao {

@Autowired

private JdbcTemplate jdbcTemplate;

public Employee get(Integer id){

//…

}

}

5.2 扩展JdbcDaoSupport类

/**

* 不推荐

*/

@Repository

public class DepartmentDao extends JdbcDaoSupport{

@Autowired

public void setDataSource2(DataSource dataSource){

//父类提供的setDataSource()方法是final修饰的,不能通过覆盖的方式注入dataSource

setDataSource(dataSource);

}

public Department get(Integer id){

String sql = "SELECT id, dept_name name FROM departments WHERE id = ?";

RowMapper<Department> rowMapper = new BeanPropertyRowMapper<>(Department.class);

return getJdbcTemplate().queryForObject(sql, rowMapper, id);

}

}

最新文章

  1. Two Sum (c#)
  2. Lodop6 以上打印控件使用,详参考自带说明文档,打印样式及文字大小要特殊设置一下
  3. JavaWeb---总结(十二)Session
  4. 10个超级有用、必须收藏的PHP代码样例
  5. C++ STL find
  6. MVC6与Asp.net5
  7. disucz!NT 3.5.0 验证码点击不能变化只是样式变化
  8. openerp经典收藏 OpenERP库存管理的若干概念讲解(新增库存价值)(转载)
  9. javascript应用:页面解析list和map封装后的json数据
  10. UVA 10585 Center of symmetry
  11. 如何让低版本的IE浏览器(IE6/IE7/IE8)支持HTML5 header等新标签
  12. [转载]你需要知道的 16 个 Linux 服务器监控命令
  13. iOS开发-使用Storyboard进行界面跳转及传值
  14. Using Qt to build an Omi App for iOS (and Android)
  15. CF Round #353 Div.2
  16. window环境下npm install node-sass报错
  17. xshell连接虚拟机Ubuntu问题
  18. SharePoint 2013 图文开发系列之入门教程
  19. ko.js学习一
  20. A Nice Paper About Mobile Data Offloading

热门文章

  1. JS基础入门篇(三十四)— 面向对象(一)
  2. [BZOJ5428][九省联考2018]双木棋
  3. 【学习笔记】可持久化并查集(BZOJ3673)
  4. substr()、substring()、slice()
  5. SpringBoot---概述
  6. Python中的&quot;Special Method&quot;
  7. find命令进阶用法(一)
  8. mobx学习笔记01——什么是mobx?
  9. 本地项目关联到远程git仓库
  10. window安装activemq