第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);

}

}

第07章 JdbcTemplate的更多相关文章

  1. suse 12 二进制部署 Kubernetets 1.19.7 - 第07章 - 部署kube-controller-manager组件

    文章目录 1.7.部署kube-controller-manager 1.7.0.创建kube-controller-manager请求证书 1.7.1.生成kube-controller-manag ...

  2. 第07章-Spring MVC 的高级技术

    Spring MVC 的高级技术 1. Spring MVC配置的替代方案 1.1 自定义DispatcherServlet配置 AbstractAnnotationConfigDispatcherS ...

  3. 第07章:MongoDB-CRUD操作--文档--创建

    ①语法 insert() save()  --有修改没有新增 insertOne() [3.2版本新增]向指定集合中插入一条文档数据 insertMany() [3.2版本新增]向指定集合中插入多条文 ...

  4. java oop第07章_集合框架

    一. 什么是集合: 在Java中提供了一些可以保存同一数据类型的数据集称为集合,就是规定了一些集合的规范(接口.抽象类.实现类)及方法, 方便我们程序在保存数据时进行增.删.改.查操作,编程更加高效. ...

  5. MySQL 07章_子查询

    子查询就是查询中还可以嵌套其他的查询,通常是内层查询的结果作为外层查询的条件来使用 执行循序,自内向外依次执行 一.内层查询返回“单列单行”的结果 -- 1.查询宋江的出生日期 SELECT TIME ...

  6. 异步编程系列第01章 Async异步编程简介

    p { display: block; margin: 3px 0 0 0; } --> 2016.10.11补充 三个月过去了,回头来看,我不得不承认这是一系列失败的翻译.过段时间,我将重新翻 ...

  7. 异步编程系列第02章 你有什么理由使用Async异步编程

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  8. 异步编程系列第04章 编写Async方法

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  9. 异步编程系列第05章 Await究竟做了什么?

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

随机推荐

  1. python request post请求body中有json数组

    今天被这个卡了好久,最后解决发现是个小问题,哈哈 记录: 用request发送post请求,原来当body都是普通的字符串和数字时一切顺利,今天遇到了body里面有json数组,结果就是报参数错误 解 ...

  2. restful风格接口类型和优点

    从事web开发工作有一小段时间,REST风格的接口,这样的词汇总是出现在耳边,然后又没有完全的理解,您是不是有和我相同的疑问呢?那我们一起来一探究竟吧! 就是用URL定位资源,用HTTP描述操作. 知 ...

  3. "||" 在sql中有什么用

    双竖线表示字符串拼接 比如: 'abc' || 'cba' 结果: 'abccba'

  4. head、tail 命令和实时(real-time)更新

    head.tail 命令和实时(real-time)更新 head filename: 输出 filename 文件的前10项 tail filename: 输出 filename 文件的后10项 即 ...

  5. 【Java】时间戳与Date相互转换

    时间戳转Date public static void main(String[] args) { // 10位的秒级别的时间戳 long time1 = 1527767665; String res ...

  6. LOJ 2303 「NOI2017」蚯蚓排队——链表+哈希表

    题目:https://loj.ac/problem/2303 想到合并的时候可以只考虑接口附近的50个,但不太会分析复杂度,而且没有清楚地想到用哈希值对应个数. 看了题解才会…… 一直想用 splay ...

  7. url 上回调函数(JSONP原理)

    1.JSONP原理:就是跨域的 js程序(get请求对应url,获取到文本数据,在script标签中,就是按照 js 程序执行,)执行时  调用  当前程序中写好的函数,并且把跨域的数据(即参数),传 ...

  8. 韩老师CCNA学习笔记

    1.MSCONFIG服务里面可以选择隐藏Windows服务,就能看出程序安装的服务.即使显示已停止,仍可能在运行 2.命令行输入netstat -anbo ,显示当前连接和端口,数字显示,以及程序的路 ...

  9. python中socket理论

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单 ...

  10. SQL 关键字的使用顺序

    1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 select --> from --> where --> group by --> having --> or ...