第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. bzoj 1003物流运输 区间dp+spfa

    基本思路: 一开始确实没什么思路,因为觉得怎么着都会超时,然后看一下数据范围,呵,怎么都不会超时. 思路: 1.看到能改变线路,想到可以用以下区间dp,区间dp的话,先枚举长度,枚举开始位置,然后枚举 ...

  2. hdu 1695: GCD 【莫比乌斯反演】

    题目链接 这题求[1,n],[1,m]gcd为k的对数.而且没有顺序. 设F(n)为公约数为n的组数个数 f(n)为最大公约数为n的组数个数 然后在纸上手动验一下F(n)和f(n)的关系,直接套公式就 ...

  3. mui滚动区域的实现

    mui框架实现页面中间区域滚动,头部和底部固定不动,要滚动的区域一定要有mui-scroll-wrapper 和 mui-scroll 包裹 <div class="mui-conte ...

  4. Linux系统重要文件(三)

    一系统运行级别文件 文件路径:/etc/inittab 文件作用说明:定义系统启动后,自动开启哪些软件程序系统 runlevel 查看当前运行级别 centos6系统运行级别: 7个级别      0 ...

  5. 接口参数校验之@Valid与BindingResult

    接口方法往往需要对入参做一些校验,从而判断入参是否合格,而javax.validation包为我们提供了一些常用的参数校验注解,使用起来很方便. 下面这个示例是检验入参对象中的password是否为空 ...

  6. 别人的双11 & 程序员的双11~

    双11,致敬所有的程序员欧巴! 愿代码的世界,只有爱,没有伤害!! ​ 点此参加阿里云双十一拼团活动:https://m.aliyun.com/act/team1111/ 阅读原文

  7. SpringMvc Filter的使用

    一:Filter过滤器. 先自定义一个过滤器. package com.jbj.filter; import org.springframework.web.filter.OncePerRequest ...

  8. mybatis用distinct进行查询的问题

    一:mybatis进行distinct进行查询的时候,数据库中可能有值为null的. 如果直接这样写,这个null的都给计算出来了. select DISTINCT b.b_city from bui ...

  9. 从React Native到微服务,落地一个全栈解决方案

    Poplar是一个社交主题的内容社区,但自身并不做社区,旨在提供可快速二次开发的开源基础套件.前端基于React Native与Redux构建,后端由Spring Boot.Dubbo.Zookeep ...

  10. 4412 SPI驱动

    1.Linux主机驱动和外设驱动分离思想(I2C驱动里有) SPI驱动总线架构:SPI核心层(x),SPI控制器驱动层(x),SPI设备驱动层(√).前面两个设备驱动搞明白了可以去看 2.教程中介绍: ...