前面介绍了 Mybatis 数据持久化框架,Mybatis 虽然功能强大,但是,使用起来还是比较复杂的。所以接下来介绍一个简单的数据持久化框架——JdbcTemplate。
JDBC 作为 Java 访问数据库的 API 规范,统一了各种数据库的访问方式。但是,直接在 Java 程序中使用 JDBC 还是非常复杂和繁琐的。所以 Spring 对 JDBC 进行了更深层次的封装,而 JdbcTemplate 就是 Spring 提供的一个操作数据库的便捷工具。它主要是实现了数据库连接的管理,我们可以借助 JdbcTemplate 来执行所有数据库操作,例如插入、更新、删除和从数据库中检索数据,并且有效避免直接使用 JDBC 带来的烦琐编码。
Spring Boot 作为 Spring 的集大成者,自然会将 JdbcTemplate 集成进去。Spring Boot 针对 JDBC 的使用提供了对应的 Starter 包:spring-boot-starter-jdbc,它其实就是在 Spring JDBC 上做了进一步的封装,方便在 Spring Boot 项目中更好地使用 JDBC。
1、JdbcTemplate 的特点
- 速度快,相对于 ORM 框架,JDBC 的方式是最快的。
- 配置简单,Spring 封装的,除了数据库连接之外,几乎没有额外的配置。
- 使用方便,就像 DBUtils 工具类,只需注入 JdbcTemplate 对象即可。
2、JdbcTemplate 的几种类型的方法
JdbcTemplate 虽然简单,功能却非常强大。它提供了非常丰富、实用的方法,归纳起来主要有以下几种类型的方法:
(1)execute 方法:可以用于执行任何 SQL 语句,一般用于执行 DDL 语句。
(2)update、batchUpdate 方法:用于执行新增、修改与删除等语句。
(3)query 和 queryForXXX 方法:用于执行查询相关的语句。
(4)call 方法:用于执行数据库存储过程和函数相关的语句。
总的来说,新增、删除与修改三种类型的操作主要使用 update 和 batchUpdate 方法来完成。query 和 queryForObject 方法中主要用来完成查询功能。execute 方法可以用来执行任意的 SQL、call 方法来调用存储过程。
Spring Boot 集成 JDBC 很简单,需要引入依赖并做基础配置即可。接下来,我们就以一个具体的例子来学习如何利用 Spring 的 JdbcTemplate 进行数据库操作。
第一步,添加依赖配置
首先,项目 pom.xml 配置文件中增加 JDBC 等相关依赖:
上面的示例,在 pom.xml 文件中引入 spring-boot-starterjdbc 依赖。同时,项目中使用 MySQL 作为数据库,因此项目中需要引入 MySQL 驱动包。spring-boot-starter-jdbc 则直接依赖于 HikariCP 和 spring-jdbc。
- HikariCP 是 Spring Boot 2.0 默认使用的数据库连接池,也是传说中最快的数据库连接池。
- spring-jdbc 是 Spring 封装对 JDBC 操作的工具包。
第二步,创建数据库及表结构
首先创建 jdbctest 测试数据库,然后再创建 student 表。包括 id、name、sex、age 等字段,对应的 SQL 脚本如下:
第三步,配置数据源
在 application.properties 配置 MYSQL 数据库连接相关配置。具体配置如下:
上面的示例,数据库连接配置非常简单,包括数据库连接地址、数据库用户名、密码以及数据驱动,无需其他额外配置。在 Spring Boot 2.0 中,com.mysql.jdbc.Driver 已经过期,推荐使用 com.mysql.cj.jdbc.Driver。
第四步,使用 JdbcTemplate
上面已经就把 JdbcTemplate 整合到 Spring Boot 项目中,并创建好数据。接下来创建一个单元测试类 JdbcTests,验证 JdbcTemplate 操作数据库。示例代码如下:
上面是简单使用 JdbcTemplate 的测试示例,Spring 的 JdbcTemplate 是自动配置的。使用 @Autowired 将 JdbcTemplate 注入到需要的 bean 中即可直接调用。
运行 Run Test 或在方法上右键 | Run ‘querytest’,运行测试方法。运行结果如下图所示:
如上图所示,单元测试方法 queryTest 运行成功,并输出相应的结果。说明 JdbcTemplate 已经连接上数据库,并成功执行了数据查询操作。
以上就把 JdbcTemplate 整合到 Spring Boot 项目中了。
第一步,创建实体类
根据之前创建的 Student 表结构,创建对应的实体类 Student。具体代码如下:
需要注意,实体类的数据类型要和数据库字段一一对应。
第二步,封装 Repository 实现增删改查
首先,创建 StudentRepository 接口并定义常用的增删改查的接口方法,示例代码如下:
上面的示例,在 StudentRepository 中定义了 save、update、delete、findAll 和 findById 等常用方法。
然后,创建 StudentRepositoryImpl 类,继承 StudentRepository 接口,实现接口中的增删改查等方法,示例代码如下:
上面的示例,在 StudentRepositoryImpl 类上使用 @Repository 注解用于标注数据访问组件 JdbcTemplate,同时在类中注入 JdbcTemplate 实例。接下来逐个实现对应的增删查改方法。
(1)新增
在 StudentRepositoryImpl 类中实现 StudentRepository 接口中的 save() 方法。示例代码如下:
在 JdbcTemplate 中,除了查询有几个 API 之外,新增、删除与修改统一都使用 update 来操作,传入 SQL 即可。update 方法的返回值就是 SQL 执行受影响的行数。
(2)修改
更新和新增类似,在 StudentRepositoryImpl 类中实现 StudentRepository 接口的 update() 方法。示例代码如下:
(3)删除
通过用户 id 删除用户信息,在 StudentRepositoryImpl 类中实现 StudentRepository 接口的 update() 方法。示例代码如下:
看到这里大家可能会有疑问:怎么新增、修改、删除,都调用 update 方法,这跟其他的框架不一样?严格来说,新增、修改、删除都属于数据写入,通过 update 执行对应的 SQL 语句,实现对数据库中数据的变更。
(4)查询
根据用户 id 查询用户信息,同样在 StudentRepositoryImpl 类中实现 StudentRepository 接口的 findById () 方法。示例代码如下:
上面的示例,JdbcTemplate 执行查询相关的语句使用 query 方法及 queryForXXX 方法。查询对象使用 queryForObject 方法。JdbcTemplate 支持将查询结果转换为实体对象,使用 new BeanPropertyRowMapper<\Student>(Student.class) 对返回的数据进行封装,它通过名称匹配的方式,自动将数据列映射到指定类的实体类中。
在执行查询操作时,需要有一个 RowMapper 将查询出来的列和实体类中的属性一一对应起来:
- 如果列名和属性名都是相同的,那么可以直接使用 BeanPropertyRowMapper。
- 如果列名和属性名不同,就需要开发者自己实现 RowMapper 接口,将数据列与实体类属性字段映射。
第三步,调用测试
接下来对封装好的 StudentRepository 进行测试,测试 StudentRepository 中的各个方法是否正确。创建 StudentRepositoryTests 类,将 studentRepository 注入到测试类中。
如上面的测试示例,我们依次执行测试方法,执行成功后会在数据库查看数据是否符合预期。测试执行正常,则表明 StudentRepository 中方法正确。
推荐阅读:
- Spring Boot 入门系列(十九)集成 mybatis,使用注解实现动态 Sql、参数传递等常用操作!
- Spring Boot 入门系列(十八)mybatis 使用注解实现增删改查,无需 xml 文件
- Spring Boot 入门系列(十七)Mybatis 创建自定义 mapper 实现多表关联查询!
- Spring Boot 入门系列(十六)整合 pagehelper,一秒实现分页功能!
- Spring Boot 入门系列(十五) SpringBoot 开发环境热部署的配置
- Spring Boot 入门系列(十三)统一日志处理!
- Spring Boot 入门系列(十一)如何整合 Mybatis,实现增删改查【XML 配置版】
- Spring Boot 入门系列(十)如何使用拦截器,一学就会!
- SpringBoot 入门系列(三)SpringBoot 资源文件属性配置
- SpringBoot 入门系列(二)Controller 介绍及如何返回 json 数据
- SpringBoot 入门系列(一)如何快速创建 SpringBoot 项