SpringBoot从入门到精通(三十)如何使用JdbcTemplate操作数据库?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 前面介绍了Mybatis数据持久化框架,Mybatis虽然功能强大,但是,使用起来还是比较复杂的。所以接下来介绍一个简单的数据持久化框架——JdbcTemplate。

前面介绍了Mybatis数据持久化框架,Mybatis虽然功能强大,但是,使用起来还是比较复杂的。所以接下来介绍一个简单的数据持久化框架——JdbcTemplate。

一、什么是JdbcTemplate

JDBC作为Java访问数据库的API规范,统一了各种数据库的访问方式。但是,直接在Java程序中使用JDBC还是非常复杂和繁琐的。所以Spring对JDBC进行了更深层次的封装,而JdbcTemplate就是Spring提供的一个操作数据库的便捷工具。


JdbcTemplate实现了数据库连接的管理,我们可以借助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集成JdbcTemplate

Spring Boot集成JDBC很简单,需要引入依赖并做基础配置即可。接下来,我们就以一个具体的例子来学习如何利用Spring的JdbcTemplate进行数据库操作。


第一步,添加依赖配置

首先,项目pom.xml 配置文件中增加 JDBC等相关依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

上面的示例,在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脚本如下:

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
          `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
          `name` varchar(32) DEFAULT NULL COMMENT '姓名',
          `sex` int DEFAULT NULL,
          `age` int DEFAULT NULL,
          PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


第三步,配置数据源

在application.properties配置MYSQL数据库连接相关配置。具体配置如下:

spring.datasource.url=jdbc:mysql://localhost:3306/jdbctest?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

上面的示例,数据库连接配置非常简单,包括数据库连接地址、数据库用户名、密码以及数据驱动,无需其他额外配置。在Spring Boot 2.0中,com.mysql.jdbc.Driver已经过期,推荐使用com.mysql.cj.jdbc.Driver。


第四步,使用JdbcTemplate

上面已经就把JdbcTemplate整合到Spring Boot项目中,并创建好数据。接下来创建一个单元测试类JdbcTests,验证JdbcTemplate操作数据库。示例代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest
class JdbcTests {
    @Autowired
    JdbcTemplate jdbcTemplate;
    @Test
    void querytest() throws SQLException {
        List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from student ");
        System.out.println(list.size());
        Assert.assertNotNull(list);
        Assert.assertEquals(1,list.size());
    }
}

上面是简单使用JdbcTemplate的测试示例,Spring的JdbcTemplate是自动配置的。使用@Autowired将JdbcTemplate注入到需要的bean中即可直接调用。


运行Run Test或在方法上右键|Run ‘querytest’,运行测试方法。运行结果如下图所示:

image.png

如上图所示,单元测试方法queryTest运行成功,并输出相应的结果。说明JdbcTemplate已经连接上数据库,并成功执行了数据查询操作。

以上就把JdbcTemplate整合到Spring Boot 项目中了。


三、封装Repository类

第一步,创建实体类

根据之前创建的Student表结构,创建对应的实体类Student。具体代码如下:

public class Student {
    private Long id;
    private String name;
    private int sex;
    private int age;
    public Student(){
    }
    public Student(String name, int sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    //省略get、set方法
}

需要注意,实体类的数据类型要和数据库字段一一对应。


第二步,封装Repository实现增删改查

首先,创建StudentRepository接口并定义常用的增删改查的接口方法,示例代码如下:

public interface StudentRepository {
    int save(Student student);
    int update(Student student);
    int delete(long id);
    Student findById(long id);
}

上面的示例,在StudentRepository中定义了save、update、delete、findAll和findById等常用方法。


然后,创建StudentRepositoryImpl类,继承StudentRepository接口,实现接口中的增删改查等方法,示例代码如下:

@Repository
public class StudentRepositoryImpl implements StudentRepository {
    @Autowired
    private JdbcTemplate jdbcTemplate;
}

上面的示例,在StudentRepositoryImpl类上使用 @Repository 注解用于标注数据访问组件JdbcTemplate,同时在类中注入 JdbcTemplate实例。接下来逐个实现对应的增删查改方法。


四、实现数据增删改查

(1)新增

在StudentRepositoryImpl类中实现StudentRepository接口中的save()方法。示例代码如下:

@Override
public int save(Student student) {
    return jdbcTemplate.update("INSERT INTO Student(name, sex, age) values(?, ?, ?)",
            student.getName(),student.getSex(),student.getAge());
}

在JdbcTemplate中,除了查询有几个API之外,新增、删除与修改统一都使用update来操作,传入SQL即可。update方法的返回值就是SQL执行受影响的行数。


(2)修改

更新和新增类似,在StudentRepositoryImpl类中实现StudentRepository接口的update()方法。示例代码如下:

@Override
public int update(Student student) {
    return jdbcTemplate.update("UPDATE Student SET name = ? , password = ? , age = ?  WHERE id=?", student.getName(),student.getSex(),student.getAge(),student.getId());
}

(3)删除

通过用户id删除用户信息,在StudentRepositoryImpl类中实现StudentRepository接口的update()方法。示例代码如下:

@Override
public int delete(long id) {
    return jdbcTemplate.update("DELETE FROM Student where id = ? ",id);
}

看到这里大家可能会有疑问:怎么新增、修改、删除,都调用update方法,这跟其他的框架不一样?严格来说,新增、修改、删除都属于数据写入,通过update执行对应的SQL语句,实现对数据库中数据的变更。


(4)查询

根据用户id查询用户信息,同样在StudentRepositoryImpl类中实现StudentRepository接口的findById ()方法。示例代码如下:

@Override
public Student findById(long id) {
    return jdbcTemplate.queryForObject("SELECT * FROM Student WHERE id=?", new Object[] { id }, new BeanPropertyRowMapper<Student>(Student.class));
}

上面的示例,JdbcTemplate执行查询相关的语句使用query方法及queryForXXX方法。查询对象使用queryForObject 方法。JdbcTemplate支持将查询结果转换为实体对象,使用new BeanPropertyRowMapper<Student>(Student.class)对返回的数据进行封装,它通过名称匹配的方式,自动将数据列映射到指定类的实体类中。


在执行查询操作时,需要有一个RowMapper将查询出来的列和实体类中的属性一一对应起来:

l 如果列名和属性名都是相同的,那么可以直接使用BeanPropertyRowMapper。

l 如果列名和属性名不同,就需要开发者自己实现 RowMapper 接口,将数据列与实体类属性字段映射。


五、如何调用

接下来对封装好的StudentRepository进行测试,测试StudentRepository中的各个方法是否正确。创建StudentRepositoryTests类,将studentRepository注入到测试类中。

@SpringBootTest
class StudentRepositoryImplTest {
    @Autowired
    private StudentRepository studentRepository;
    @Test
    void save() {
        Student student =new Student("weiz",1,30);
        studentRepository.save(student);
    }
    @Test
    void update() {
        Student student =new Student("weiz",1,18);
        student.setId(1L);
        studentRepository.update(student);
    }
    @Test
    void delete() {
        studentRepository.delete(1L);
    }
    @Test
    void findById() {
        Student student = studentRepository.findById(1L);
        System.out.println("student == " + student.toString());
    }
}

如上面的测试示例,我们依次执行测试方法,执行成功后会在数据库查看数据是否符合预期。测试执行正常,则表明StudentRepository中方法正确。

image.png



最后

以上,我们就把Spring Boot使用JdbcTemplate的问题介绍完了。



推荐阅读:

SpringBoot从入门到精通(二十九)使用Redis实现分布式Session共享

SpringBoot从入门到精通(二十八)JPA 的实体映射关系,一对一,一对多,多对多关系映射!

SpringBoot从入门到精通(二十七)JPA实现自定义查询,完全不需要写SQL!

SpringBoot从入门到精通(二十六)超级简单的数据持久化框架!Spring Data JPA 的使用!

SpringBoot从入门到精通(二十五)搞懂自定义系统配置

SpringBoot从入门到精通(二十四)3分钟搞定Spring Boot 多环境配置!

SpringBoot从入门到精通(二十三)Mybatis系列之——实现Mybatis多数据源配置

SpringBoot从入门到精通(二十二)使用Swagger2优雅构建 RESTful API文档

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
SQL 数据库
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
这篇文章是Spring5框架的实战教程,深入讲解了如何使用JdbcTemplate进行数据库的批量操作,包括批量添加、批量修改和批量删除的具体代码实现和测试过程,并通过完整的项目案例展示了如何在实际开发中应用这些技术。
Spring5入门到实战------13、使用JdbcTemplate操作数据库(批量增删改)。具体代码+讲解 【下篇】
|
3天前
|
SQL 存储 关系型数据库
数据库SQL入门指南
数据库SQL入门指南
|
3天前
|
前端开发 JavaScript Java
SpringBoot+Vue+token实现(表单+图片)上传、图片地址保存到数据库。上传图片保存位置自己定义、图片可以在前端回显(一))
这篇文章详细介绍了在SpringBoot+Vue项目中实现表单和图片上传的完整流程,包括前端上传、后端接口处理、数据库保存图片路径,以及前端图片回显的方法,同时探讨了图片资源映射、token验证、过滤器配置等相关问题。
|
3天前
|
前端开发 数据库
SpringBoot+Vue+token实现(表单+图片)上传、图片地址保存到数据库。上传图片保存位置到项目中的静态资源下、图片可以在前端回显(二))
这篇文章是关于如何在SpringBoot+Vue+token的环境下实现表单和图片上传的优化篇,主要改进是将图片保存位置从磁盘指定位置改为项目中的静态资源目录,使得图片资源可以跨环境访问,并在前端正确回显。
|
3天前
|
XML 数据库 数据格式
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
这篇文章是Spring5框架的实战教程的终结篇,介绍了如何使用注解而非XML配置文件来实现JdbcTemplate的数据库操作,包括增删改查和批量操作,通过创建配置类来注入数据库连接池和JdbcTemplate对象,并展示了完全注解开发形式的项目结构和代码实现。
Spring5入门到实战------14、完全注解开发形式 ----JdbcTemplate操作数据库(增删改查、批量增删改)。具体代码+讲解 【终结篇】
|
3天前
|
SQL XML Java
Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
这篇文章是Spring5框架的实战教程,详细讲解了如何使用JdbcTemplate进行数据库的增删改查操作,包括在项目中引入依赖、配置数据库连接池、创建实体类、定义DAO接口及其实现,并提供了具体的代码示例和测试结果,最后还提供了完整的XML配置文件和测试代码。
Spring5入门到实战------12、使用JdbcTemplate操作数据库(增删改查)。具体代码+讲解 【上篇】
|
4天前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
14 0
SpringBoot整合JdbcTemplate(五)下
SpringBoot整合JdbcTemplate(五)
241 0
SpringBoot整合JdbcTemplate(五)下
|
Java 数据库
SpringBoot整合JdbcTemplate(五)中
SpringBoot整合JdbcTemplate(五)
201 0
SpringBoot整合JdbcTemplate(五)中
|
druid Java 关系型数据库
SpringBoot整合JdbcTemplate(五)上
SpringBoot整合JdbcTemplate(五)
156 0
SpringBoot整合JdbcTemplate(五)上