Spring中使用JdbcTemplate操作数据库(增删改查以及批量操作)附带源码解释【超详细】

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Spring中使用JdbcTemplate操作数据库(增删改查以及批量操作)附带源码解释【超详细】

JdbcTemplate概述


Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作。


JdbcTemplate准备工作


引入相关 jar 包


1.png


如果是maven项目,使用pom.xml代替引入jar包的过程(注意)


pom.xml:


<?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.Keafmd</groupId>
    <artifactId>day04_eesy_01jdbctemplate</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>7</source>
                    <target>7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.2.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.9</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

maven项目的代码结构:

1.png


配置xml配置文件


在 spring 配置文件配置数据库连接池,配置 JdbcTemplate 对象,注入 DataSource。配置时用的是引用外部配置文件,所以还需要引入外部的属性文件,同时创建对象时是基于注解的所以还要开启组件扫描。


bean1.xml:


<?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:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util"
       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/util http://www.springframework.org/schema/util/spring-util.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--开启组件扫描-->
    <context:component-scan base-package="com.Keafmd"></context:component-scan>
    <!--引入外部的属性文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!--配置连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driverClass}"></property>
        <property name="url" value="${jdbc.url}" ></property>
        <property name="username" value="${jdbc.username}" ></property>
        <property name ="password" value="${jdbc.password}" ></property>
    </bean>
    <!--创建jdbcTemplate对象-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--注入DataSource-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
</beans>

jdbc.properties:


jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/user_db?characterEncoding=utf8&useUnicode=true&useSSL=false
jdbc.username=root
jdbc.password=root

JdbcTemplate 操作数据库


相关的操作及注释都在代码中,请看代码。


准备好数据库uset_db创建一个t_user表

1.png


对应数据库创建User实体类


User类:


package com.Keafmd.spring5.entity;
/**
 * Keafmd
 *
 * @ClassName: User
 * @Description: 数据库对应user实体类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-19 10:07
 */
public class User {
    private String userId;
    private String username;
    private String ustatus;
    public User() {
    }
    public User(String userId, String username, String ustatus) {
        this.userId = userId;
        this.username = username;
        this.ustatus = ustatus;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public void setUstatus(String ustatus) {
        this.ustatus = ustatus;
    }
    public String getUserId() {
        return userId;
    }
    public String getUsername() {
        return username;
    }
    public String getUstatus() {
        return ustatus;
    }
    @Override
    public String toString() {
        return "User{" +
                "userId='" + userId + '\'' +
                ", username='" + username + '\'' +
                ", ustatus='" + ustatus + '\'' +
                '}';
    }
}

创建UserDao接口并创建UserDaoImpl类


在UserDaoImpl类注入jdbcTemplate。


UserDao接口:


package com.Keafmd.spring5.dao;
import com.Keafmd.spring5.entity.User;
import java.util.List;
/**
 * Keafmd
 *
 * @ClassName: UserDao
 * @Description:
 * @author: 牛哄哄的柯南
 * @date: 2021-01-19 9:56
 */
public interface UserDao {
    //添加方法
    void add(User user);
    //修改方法
    void updateUser(User user);
    //删除方法
    void delete(String id);
    //查询记录数
    int selectCount();
    //查询返回对象
    User findUserInfo(String id);
    //查询集合
    List<User> findAllUser();
    //批量添加
    void batchAddUser(List<Object[]> batchArgs);
    //批量修改
    void batchUpdateUser(List<Object[]> batchArgs);
  //批量删除
    void batchDeleteUser(List<Object[]> batchArgs);
}

UserDaoImpl类:


package com.Keafmd.spring5.dao;
import com.Keafmd.spring5.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.Arrays;
import java.util.List;
/**
 * Keafmd
 *
 * @ClassName: UserDaoImpl
 * @Description: UserDao实现类
 * @author: 牛哄哄的柯南
 * @date: 2021-01-19 9:56
 */
@Repository
public class UserDaoImpl implements UserDao {
    //注入jdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;
    //添加的方法
    @Override
    public void add(User user) {
        //创建sql语句
        String sql=" INSERT INTO t_user (user_id, username, ustatus) VALUES (?, ?, ?) ";
        // 调用方法实行
        int updat = jdbcTemplate.update(sql,user.getUserId(),user.getUsername(),user.getUstatus());
        // 返回成功的条数
        System.out.println(updat);
    }
    //修改
    @Override
    public void updateUser(User user) {
        String sql = "UPDATE   user_db.t_user SET   username = ?,  ustatus = ? WHERE user_id = ?";
        Object[] args = {user.getUsername(),user.getUstatus(),user.getUserId()};
        int updat = jdbcTemplate.update(sql,args);
        System.out.println(updat);
    }
    //删除
    @Override
    public void delete(String id) {
        String sql ="DELETE FROM user_db.t_user WHERE user_id = ?";
        int updat = jdbcTemplate.update(sql,id);
        System.out.println(updat);
    }
    //查询记录数
    @Override
    public int selectCount() {
        String sql ="SELECT COUNT(*) FROM t_user";
        Integer count = jdbcTemplate.queryForObject(sql,Integer.class);
        return count;
    }
    //返回对象
    @Override
    public User findUserInfo(String id) {
        String sql ="SELECT * FROM t_user where user_id = ?";
        User user = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),id);
        return user;
    }
    //返回集合对象
    @Override
    public List<User> findAllUser() {
        String sql = "select * from t_user";
        List<User> userList =jdbcTemplate.query(sql,new BeanPropertyRowMapper<User>(User.class));
        return userList;
    }
    //批量添加
    @Override
    public void batchAddUser(List<Object[]> batchArgs) {
        String sql=" INSERT INTO t_user (user_id, username, ustatus) VALUES (?, ?, ?) ";
        int []ints = jdbcTemplate.batchUpdate(sql,batchArgs);
        System.out.println(Arrays.toString(ints));
    }
    //批量修改
    @Override
    public void batchUpdateUser(List<Object[]> batchArgs) {
        String sql = "UPDATE   user_db.t_user SET   username = ?,  ustatus = ? WHERE user_id = ?";
        int []ints = jdbcTemplate.batchUpdate(sql,batchArgs);
        System.out.println(Arrays.toString(ints));
    }
    //批量删除
    @Override
    public void batchDeleteUser(List<Object[]> batchArgs) {
        String sql ="DELETE FROM user_db.t_user WHERE user_id = ?";
        int []ints = jdbcTemplate.batchUpdate(sql,batchArgs);
        System.out.println(Arrays.toString(ints));
    }
}

创建UserService类并在其中注入UserDao


UserService类:


package com.Keafmd.spring5.service;
import com.Keafmd.spring5.dao.UserDao;
import com.Keafmd.spring5.dao.UserDaoImpl;
import com.Keafmd.spring5.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * Keafmd
 *
 * @ClassName: BookService
 * @Description:
 * @author: 牛哄哄的柯南
 * @date: 2021-01-19 9:55
 */
@Service
public class UserService {
    //注入dao
    @Autowired
    private UserDao userDao;
    //添加的方法
    public void addUser(User user){
        userDao.add(user);
    }
    //修改的方法
    public void updateUser(User user){
        userDao.updateUser(user);
    }
    //删除的方法
    public void deleteUser(String id){
        userDao.delete(id);
    }
    //查询表中的记录数
    public int findCount(){
        return userDao.selectCount();
    }
    //查询返回对象
    public User findOne(String id){
        return userDao.findUserInfo(id);
    }
    //查询返回集合
    public List<User> findAll(){
        return userDao.findAllUser();
    }
    //批量添加
    public void batchAdd(List<Object[]> batchArgs){
        userDao.batchAddUser(batchArgs);
    }
    //批量修改
    public void batchUpdate(List<Object[]> batchArgs){
        userDao.batchUpdateUser(batchArgs);
    }
    //批量删除
    public void batchDelete(List<Object[]> batchArgs){
        userDao.batchDeleteUser(batchArgs);
    }
}

编写测试类进行测试


TestUser :


package com.Keafmd.spring5.test;
import com.Keafmd.spring5.entity.User;
import com.Keafmd.spring5.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.ArrayList;
import java.util.List;
/**
 * Keafmd
 *
 * @ClassName: TestUser
 * @Description:
 * @author: 牛哄哄的柯南
 * @date: 2021-01-19 10:35
 */
public class TestUser {
    @Test
    public void testJdbcTemplate(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
        //添加
        /*User user = new User("001","Keafmd","11");
        userService.addUser(user);*/
        //更新
        /*User user1 = new User("001","Keafmd","2");
        userService.updateUser(user1);*/
        //删除
        /*String id = "2";
        userService.deleteUser(id);*/
        //返回总条数
        int count = userService.findCount();
        System.out.println(count);
        // 返回对象
        User user = userService.findOne("1");
        System.out.println(user);
        // 返回集合对象
        List<User> userList =userService.findAll();
        System.out.println(userList);
        //批量添加
        /*List<Object[]> batchArgs = new ArrayList<>();
        Object[]o1 = {"7","77","7"};
        Object[]o2 = {"8","88","8"};
        Object[]o3 = {"9","99","9"};
        batchArgs.add(o1);
        batchArgs.add(o2);
        batchArgs.add(o3);
        userService.batchAdd(batchArgs);*/
        //批量修改
        /*List<Object[]> batchArgs = new ArrayList<>();
        Object[]o11 = {"tt","2","7"};
        Object[]o22 = {"uu","2","8"};
        Object[]o33 = {"ii","2","9"};
        batchArgs.add(o11);
        batchArgs.add(o22);
        batchArgs.add(o33);
        userService.batchUpdate(batchArgs);*/
        //批量删除
        List<Object[]> batchArgs = new ArrayList<>();
        Object[]o1 = {"7"};
        Object[]o2 = {"8"};
        Object[]o3 = {"9"};
        batchArgs.add(o1);
        batchArgs.add(o2);
        batchArgs.add(o3);
        userService.batchDelete(batchArgs);
    }
}

输出结果:


一月 19, 2021 4:05:28 下午 com.alibaba.druid.pool.DruidDataSource info
信息: {dataSource-1} inited
9
User{userId='1', username='Keafmd', ustatus='2'}
[User{userId='1', username='Keafmd', ustatus='2'}, User{userId='2', username='aa', ustatus='1'}, User{userId='3', username='bb', ustatus='1'}, User{userId='4', username='cc', ustatus='1'}, User{userId='5', username='dd', ustatus='1'}, User{userId='6', username='ee', ustatus='1'}, User{userId='7', username='tt', ustatus='2'}, User{userId='8', username='uu', ustatus='2'}, User{userId='9', username='ii', ustatus='2'}]
[1, 1, 1]
Process finished with exit code 0

1.png

上面两行红色的是日志信息,不是报错,不用担心。


JdbcTemplate源码解释


jdbcTemplate.update(增删改操作)


在增删改操作中调用的jdbcTemplate.update(sql,id);中有两个参数。

源码:

public int update(String sql, @Nullable Object... args) throws DataAccessException {
    return this.update(sql, this.newArgPreparedStatementSetter(args));
}

第一个参数:sql 语句。

第二个参数:可变参数,设置 sql 语句值。


jdbcTemplate.queryForObject(返回记录条数)


在查询记录数操作中调用的jdbcTemplate.queryForObject(sql,Integer.class);中有两个参数。


源码:


public <T> T queryForObject(String sql, Class<T> requiredType) throws DataAccessException {
    return this.queryForObject(sql, this.getSingleColumnRowMapper(requiredType));
}

两个参数:

第一个参数:sql 语句。

第二个参数:返回类型 Class。


jdbcTemplate.queryForObject(返回对象)


在返回对象中调用的jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper(User.class),id);中有三个参数。

源码:


public <T> T queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args) throws DataAccessException {
    List<T> results = (List)this.query((String)sql, (Object[])args, (ResultSetExtractor)(new RowMapperResultSetExtractor(rowMapper, 1)));
    return DataAccessUtils.nullableSingleResult(results);
}

有三个参数 :

第一个参数:sql 语句。

第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成数据封装。

第三个参数:sql 语句值。


jdbcTemplate.query(返回对象集合)


在返回对象集合中调用的jdbcTemplate.query(sql,newBeanPropertyRowMapper(User.class));中有两个参数。


源码:


public <T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException {
    return (List)result(this.query((String)sql, (ResultSetExtractor)(new RowMapperResultSetExtractor(rowMapper))));
}

有两个个参数 :

第一个参数:sql 语句。

第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成数据封装。


jdbcTemplate.batchUpdate(批量操作)


在批量操作中调用的jdbcTemplate.batchUpdate(sql,batchArgs);有两个参数。


源码:


public int[] batchUpdate(String sql, List<Object[]> batchArgs) throws DataAccessException {
    return this.batchUpdate(sql, batchArgs, new int[0]);
}

有两个参数 :

第一个参数:sql 语句。

第二个参数:List 集合,添加多条记录数据。


以上就是Spring中使用JdbcTemplate操作数据库(增删改查以及批量操作)附带源码解释的全部内容。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
16天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
45 2
|
1月前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
22天前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
45 9
|
27天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,并与使用 RPM 包安装进行了对比。通过具体案例,读者可以了解如何准备环境、下载源码、编译安装、配置服务及登录 MySQL。编译源码安装虽然复杂,但提供了更高的定制性和灵活性,适用于需要高度定制的场景。
77 3
|
27天前
|
PHP 数据库 数据安全/隐私保护
布谷直播源码部署服务器关于数据库配置的详细说明
布谷直播系统源码搭建部署时数据库配置明细!
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
87 2
|
2月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
120 5
|
2月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置服务等,并与使用 RPM 包安装进行了对比,帮助读者根据需求选择合适的方法。编译源码安装虽然复杂,但提供了更高的定制性和灵活性。
262 2
|
3月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
187 2