持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情
前言:
无论何种框架或程序,数据操作都是必不可少的。Spring JDBC 是 Spring 所提供的持久层技术。主要目的是降低使用 JDBC API 使用的复杂度,以一种更直接、更简洁的方式使用 JDBC API 。
Spring 重新对 JDBC 做了封装,像资源获取、Statement 创建、资源释放以及异常处理等工作都可以交给 Spring JDBC 完成,大大简化了 JDBC 操作步骤,提高了开发效率。让开发者避免每次都进行重复的、普通的开发,而是集中精力去处理具体业务逻辑。
虽然 ORM 的框架已经非常好用,就像之前的 MyBatis,但 JDBC 的灵活直接的特性,依然让它拥有自己的用武之地。
在 Spring API 中,提供了四大块用于完成 Spring JDBC 操作,分别是:
- org.springframework.jdbc.core 基础类包
- org.springframework.jdbc.datasource 数据库访问配置
- org.springframework.jdbc.object 对对象进行 CRUD 及存储过程的操作
- org.springframework.jdbc.support 支持操作的接口和工具类
JdbcTemplate 的基本使用
在 Spring JDBC 中,最常使用的是 JdbcTemplate,它是 Spring 支持 JDBC 的核心类。JdbcTemplate 完成了 JDBC 资源的创建以及释放工作,从而简化了对 JDBC 的使用。JdbcTemplate 模板使用可以避免忘记关闭数据库连接等常见错误问题。
JdbcTemplate 使用 Spring 的注入功能,可以把 DataSource 注入到 JdbcTemplate 之中。JdbcTemplate 类是存在 org.springframework.jdbc.core 包中,它的父类 org.springframework.jdbc.support.JdbcAccessor 是个抽象类。
JdbcTemplate 主要提供以下五类方法:
- execute 方法:可以用于执行任何 SQL 语句,一般用于执行 DDL 语句。
- update 方法:用于执行新增、修改、删除等语句。
- batchUpdate 方法:用于执行批处理相关语句。
- query 或 queryForXXX 方法:用于执行查询相关语句。
- call 方法:用于执行查询相关语句,执行存储过程、函数相关语句。
第一步:准备数据库
create database springjdbc;
show databases;
use springjdbc;
create table users(
user_id int auto_increment primary key,
user_name varchar(20) not null,
user_type varchar(20)
);
insert users(user_name,user_type) values ('Tom','超级会员');
insert users(user_name,user_type) values ('Rose','普通会员');
insert users(user_name,user_type) values ('Tina','VVVip会员');
commit;
第二步,创建maven文件并且引入spring的配置
- pom文件
。。。。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.14</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
- 项目
update
update 方法主要是完成对数据表进行添加、修改、删除操作。
我们可以看一下 JdbcTemplate API 中的方法:
其中 update(String sql, Object... args) 方法用得比较多,参数 sql 就是所书写的 DML 语句不能为 null,参数 args 就是需要进行添加、修改、删除的数据信息,update 方法返回值类型是 int ,返回的是与数据库交互的行数,当返回值为 0 时,说明 SQL 语句执行未成功。
接下来我们来完成添加用户的功能。
- 在
pojo目录中创建Users.java源文件,对应于users数据库表。
package com.yamiya.pojo;
public class Users {
private Integer userId;
private String userName;
private String userType;
/**
* 无参构造器
*/
public Users(){
}
/**
* 带参数构造器
* @param userId 用户编号
* @param userName 用户名
* @param userType 用户类型
*/
public Users(Integer userId, String userName, String userType) {
this.userId = userId;
this.userName = userName;
this.userType = userType;
}
set/get方法
@Override
public String toString() {
return "Users [userId=" + userId + ", userName=" + userName + ", userType=" + userType + "]";
}
}
Users 类就是一个普通的数据 Bean,用来进行数据传递使用。
- 在
dao目录下,创建接口IUserDAO.java和实现类UserDAOImpl.java,来完成业务逻辑功能操作。
实现类中首先需要注入
JdbcTemplate 实例对象,否则无法调用该类中 update 方法进行添加操作。
- 需要修改
applicationContext.xml配置文件,进行DataSource、JdbcTemplate的配置,还需要开启注解扫描到接口实现类。
DataSource 我们采用 Spring 自带的数据源 DriverManagerDataSource 进行配置
文件内容如下:
在 resources 目录下创建 database.properties 属性文件,存放数据库连接的必要数据信息。
# mysql
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/springjdbc?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=zhuangsan(这个是自己账号密码)
配置 DataSource 需要注入四部分数据,driverClassName 数据库驱动类,url 数据库访问路径,username 和 password 数据库访问的用户名和密码,才能进行数据库交互。对于 JdbcTemplate 的配置需要注入 DataSource 对象,才能实例化 JdbcTemplate 进行使用。
4. 在测试类
TestSpring 中添加测试方法 testInsertUser() 进行检测。
@Test
public void testInsertUser(){
ClassPathXmlApplicationContext context= new ClassPathXmlApplicationContext("applicationContext.xml");
IUserDAO iud = context.getBean(IUserDAO.class);
Users user = new Users();
user.setUserName("Mark");
user.setUserType("超级会员");
assertTrue(iud.insertUser(user));
iud = null;
context.close();
}
JdbcTemplate 中 query 方法
- 修改
IUserDAO.java,添加queryUsers()和queryTotalRecords()业务逻辑方法。
- 修改
UserDAOImpl.java,实现queryUsers()和queryTotalRecords()业务逻辑方法。
从实现类中我们使用
query(String sql, RowMapper<T> rowMapper) 方法来查询所有用户信息,参数 sql 是查询语句,参数 rowMapper 提供 RowMapper 接口实例,该接口中 mapRow() 方法提供了回调处理,通过 ResultSet 结果集获取表中的数据信息。代码中我们采用了 RowMapper 接口的实现类 BeanPropertyRowMapper<T> ,进行数据表和数据 Bean 进行一一对象数据注入操作,query 方法返回的是 List 集合对象,来存储所有用户信息并获取信息的功能。
另一个方法是 queryForObject(String sql, Class<T> requiredType) ,通过该方法获取某一种对象数据,参数 sql 还是查询语句,参数 requiredType 是返回数据的数据类型。我们需要查询用户总记录数,所以设定返回类型为 Integer 。
- 在测试类
TestSpring中添加测试方法 List list = iud.queryUsers();
for (Users users : list) {
System.out.println(users);
}