关于Spring JDBC

262 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;

image.png

第二步,创建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>
- 项目

image.png

update

update 方法主要是完成对数据表进行添加、修改、删除操作。

我们可以看一下 JdbcTemplate API 中的方法:

图片描述

其中 update(String sql, Object... args) 方法用得比较多,参数 sql 就是所书写的 DML 语句不能为 null,参数 args 就是需要进行添加、修改、删除的数据信息,update 方法返回值类型是 int ,返回的是与数据库交互的行数,当返回值为 0 时,说明 SQL 语句执行未成功。

接下来我们来完成添加用户的功能。

  1. 在 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,用来进行数据传递使用。

  1. 在 dao 目录下,创建接口 IUserDAO.java 和实现类 UserDAOImpl.java,来完成业务逻辑功能操作。 image.png

image.png 实现类中首先需要注入 JdbcTemplate 实例对象,否则无法调用该类中 update 方法进行添加操作。

  1. 需要修改 applicationContext.xml 配置文件,进行 DataSourceJdbcTemplate 的配置,还需要开启注解扫描到接口实现类。

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 进行使用。

image.png 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 方法

  1. 修改 IUserDAO.java ,添加 queryUsers() 和 queryTotalRecords() 业务逻辑方法。

image.png

  1. 修改 UserDAOImpl.java ,实现 queryUsers() 和 queryTotalRecords() 业务逻辑方法。

image.png 从实现类中我们使用 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 。

  1. 在测试类 TestSpring 中添加测试方法 List list = iud.queryUsers();

for (Users users : list) {

System.out.println(users);

}