JdbcTemplate
Ⅰ 准备工作
JdbcTemplate 属于 Spring 模块中我圈起来的那个模块。
Spring 框架对 JDBC 进行了封装,使用 JdbcTemplate 方便实现对数据库操作。
需要的 jar 包如下:
对应的 Maven pom文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tyz</groupId>
<artifactId>SpringDemo4</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aopalliance/com.springsource.org.aopalliance -->
<dependency>
<groupId>org.aopalliance</groupId>
<artifactId>com.springsource.org.aopalliance</artifactId>
<version>1.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
</project>
我先创建一个数据库 book
。
接着我们需要在配置文件中配置数据库连接池。
关于数据库连接池的配置,在我的 Spring IOC 引入外部属性文件 模块,有更详细的讲解,这里不再赘述。
下一步,我们需要配置 JdbcTemplate 对象,注入 DataSource。
我们点进 JdbcTemplate 的源码,可以看到一个单参的构造方法
现在我们就需要注入 DataSource
。它其实就是我们上面配置的数据库连接池。
接着我们需要开启组件扫描。注意需要在配置文件中增加 context 命名空间。
为了更清楚一点,我将上面的配置直接贴上来。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
我们现在写一个简单的 Service 层和 Dao 层。 我们需要在 Dao 层注入 JdbcTemplate 对象。
我们先在 Service 中加一个 Service 注解。
然后在 Dao 的实现类上也加一个创建对象的注解。
在 BookService
中注入 BookDao
。
然后在 BookDaoImpl
中注入 JdbcTemplate。
这里的注入将会把我们在配置文件中创建的 JdbcTemplate 对象注入进来。
Ⅱ JdbcTemplate 操作数据库
A. 增 & 删 & 改
首先我先在我的数据库中建立一张表 user_infor
。
对应的,我们来建立一个实体类并完成它们的 Setter 方法。
现在我们在 BookService
中写一个向数据库添加数据的方法。
添加的方法通过调用 BookDao
的 add()
方法完成,那么相应的我们需要在 BookDao
中添加 add()
方法并在实现类 BookDaoImpl
中实现。
在实现类中,我们就要调用 jdbcTemplate
来向数据库添加数据了。
要实现数据的插入,需要使用 update()
方法,第一个是插入的 SQL 语句,第二个是可变参,是要SQL 中要插入的数据。
然后我们写一个测试来验证一下。
显示测试通过了,我们再来看一下数据库。
确实已经写入了。
这里如果大家遇到数据库的连接错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client
可以参考下面这篇文章修改👇
接着我们再来看删除、修改操作,它们和增加的方法是很类似的。
首先还是在 BookService
中增加相应的删除和更新方法,通过调用 BookDao
的方法来完成。
接着,在 BookDao
中增加这两个方法并在实现类中实现。
我们做一下测试。
可以看到都成功了。
B. 查询
a. 查询返回某个值
比如我们现在要查询表中的记录数,还是先在 BookService
中增加一个查询方法。
最后我们在 BookDaoImpl
中实现它,我们需要调用的是queryForObject
方法,它有两个参数,第一个还是 SQL 语句,第二是返回值的类型。
测试结果如下:
b. 查询返回对象
比如我们要查询一本书的详细信息,这时要返回的就是一个对象。
在实现类中我们要调用 jdbcTemplate
的是下面这个方法。
其中第一个参数还是 sql 语句;
第二个参数是一个接口,作用是返回不同类型的数据,使用这个接口的实现类完成数据的封装。我们可以自己实现这个接口但是没有必要,Spring里已经有实现类封装得很好了;
第三个参数是传递给 sql 语句中的问号的值。
具体的用法如下,我们需要在第二个参数 new 一个 BeanPropertyRowMapper
类,在泛型的括号中写需要返回的数据类型,在圆括号中写这个类型的 class。
注意这里的查询对象,最终是调用实体类 Book
中的 set 方法进行属性注入的,所以实体类的属性名需要和数据库中的字段名相匹配。
c. 查询返回集合
比如我们要查询图书列表分页。
在实现类中我们调用的是 query
方法
可以看到测试成功了。
C. JdbcTemplate 批量操作
在前面的操作中,我们不管是修改也好添加也好,都是对一条记录在做操作,现在我们再来看一下如何同时对多条记录进行操作。
a. 批量添加
实现批量操作非常简单,我们只需要写一条添加的语句,然后调用已经封装好的方法 batchUpdate
。
最后我们再输出一行影响的行数。
然后我们做一下测试。
可以看到测试成功,并且数据全都正常插入了。
b. 批量修改
批量修改只需要修改 SQL 语句即可。
测试结果如下
c. 批量删除
测试结果如下:
关于 Spring 中的 JdbcTemplate 我就大概介绍完了。