SpringBoot整合JdbcTemplate(五)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 整合JdbcTemplate, 完成基本的CRUD操作
二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。

上一章简单介绍了SpringBoot的热布署和多环境配置(四)如果没有看过,请观看上一章

一. SpringBoot 使用 JdbcTemplate

JdbcTemplate 实际上是 Spring 时就拥有的。 具体可以看,老蝴蝶以前写的 Spring系列文章 Spring的JdbcTemplate的简单使用(七)

在 SpringBoot 时,继续讲解 JdbcTemplate, 一方面是扩展其用法,另一方面,是为了知识的完整性,引出 Jpa,Mybatis,MybatisPlus 等数据库框架,Druid数据库连接池配置。

老蝴蝶按照上一章节的方式,创建了 JdbcTemplate的项目,添加了热布署等依赖信息。

一.一 在 pom.xml 文件里面添加依赖

一.一.一 添加数据库驱动依赖

这儿使用 Mysql 数据库进行讲解

<!--引入MySql的驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

默认引入的是 8.0.18 版本。

一.一.二 添加 springboot整合jdbc的依赖

<!--引入springboot与jdbc整合的依赖,spring-boot-starter-jdbc-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>

注意,引入的是 spring-boot-starter-jdbc, 并不是 spring-jdbc

一.二 application.yml 中配置数据库连接信息

# 引入 数据库的相关配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false
    username: root
    password: abc123

一.三 注入 JdbcTemplate 模板对象

@SpringBootTest
@Log4j2
public class JdbcApplicationTests {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Test
    void contextLoads() {
        log.info("输出数据库jdbcTemplate连接信息,{}",jdbcTemplate);
    }
}

运行 contextLoads() 测试方法,可以发现, JdbcTemplate对象,注入成功。

在这里插入图片描述

老蝴蝶展示出 数据库元信息,让大家看一下。

  @Test
    void metaDataTest() throws Exception {
        //获取 DataSource 对象
        DataSource dataSource=jdbcTemplate.getDataSource();
        //获取 DatabaseMetaData 数据库元数据
        DatabaseMetaData databaseMetaData = dataSource.getConnection().getMetaData();
        log.info("用户名是{}",databaseMetaData.getUserName());
        log.info("url是{}",databaseMetaData.getURL());
        log.info("数据库类型是{}",databaseMetaData.getDatabaseProductName());

    }

运行 metaDataTest() 测试方法,打印出了数据库的元信息

在这里插入图片描述

注意,这儿引入的是 HikariPool 连接池,以后,我们会用 Druid 连接池替换它。

一.四 引入 jdbc驱动,却不配置数据库连接信息

如果忘记了 一.二 步骤中的内容,即在配置文件里面,没有配置相关的数据库连接信息。

启动的时候,测试会报错。

在这里插入图片描述

主方法 JdbcApplication.java 运行时,也会报错

@SpringBootApplication
public class JdbcApplication {
    public static void main(String[] args) {

        SpringApplication.run(JdbcApplication.class,args);
        System.out.println("运行 JdbcTemplate 配置文件");
    }
}

在这里插入图片描述

依赖里面检测到了 jdbc的依赖,但是没有添加 jdbc的配置信息,所以会报错。

需要在启动时,在 @SpringBootApplication 注解时,排除掉 DataSource配置的依赖

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})

这样,才启动的时候,就不检查 数据库的配置信息了。 主要针对的是,从网上找的项目,里面放置上大量的第三方依赖,而又不想手动从pom.xml中移除依赖的情况,如 RedisTemplate,RestTemplate 等。

二. JdbcTemplate 的详细用法

JdbcTemplate 里面封装了大量的方法,我们可以直接使用,简化我们的开发。

二.一 使用前准备

二.一.一 数据库准备

准备一个 user 表。

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(15) DEFAULT NULL,
  `sex` varchar(20) DEFAULT NULL,
  `age` int(6) DEFAULT NULL,
  `description` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

二.一.二 实体准备

在pojo 包下,创建一个 User 类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    /**
     * @param id id编号
     * @param name 姓名
     * @param sex 性别
     * @param age 年龄
     * @param description 描述
     */
    private Integer id;
    private String name;
    private String sex;
    private Integer age;
    private String description;
}

二.一.三 业务层接口和实现准备

public interface UserService {
}
@Service
public class UserServiceImpl implements UserService {
     @Autowired
    private JdbcTemplate jdbcTemplate;
}

二.一.四 测试类准备

@SpringBootTest
@Log4j2
public class CrudJdbcApplicationTests {
    @Autowired
    private UserService userService;
   
}

二.二 增删改 基本用法

均省略 UserService接口中的方法。

在这里插入图片描述

增,删,改,调用的都是 update 方法, 可以进行单条数据更新,也可以进行批量数据的更新。

二.二.一 添加数据

二.二.一.一 测试方法

   @Test
    public void addTest(){
        //1. 构建对象
        User user=new User();
        user.setName("欢欢");
        user.setAge(22);
        user.setSex("女");
        user.setDescription("一个非常可爱的女孩纸");
        //2. 添加方法
        userService.addUser(user);

    }

二.二.一.二 实现方法

 @Override
    public void addUser(User user) {
        //1.sql语句
        String sql="insert into user(name,sex,age,description) values(?,?,?,?) ";
        //2.调用 update语句,执行方法
        jdbcTemplate.update(sql,user.getName(),user.getSex(),user.getAge(),
                user.getDescription());
    }

二.二.一.三 查看数据结果

在这里插入图片描述

可以发现,数据被插入到数据库里面了。

二.二.二 修改数据

二.二.二.一 测试方法

   @Test
    public void updateTest(){
        //1. 构建对象
        User user=new User();
        user.setId(2);
        user.setName("欢欢");
        user.setDescription("岳泽霖最好的朋友");
        //2. 修改方法
        userService.updateUser(user);
    }

二.二.二二 实现方法

 @Override
    public void updateUser(User user) {
        //1.sql语句
        String sql="update user set name=?,description=? where id=?  ";
        //2.调用 update语句,执行方法
        jdbcTemplate.update(sql,user.getName(),user.getDescription(),user.getId());
    }

二.二.二.三 查看数据结果

在这里插入图片描述

数据修改成功。

二.二.三 删除数据

老蝴蝶不想删除 欢欢这条数据,所以新添加一条 岳泽霖的数据,将岳泽霖进行删除,欢欢保留在数据库里面。

在这里插入图片描述

二.二.三.一 测试方法

 @Test
    public void deleteTest(){
        userService.deleteUser(3);
    }

二.二.三.二 实现方法

@Override
    public void deleteUser(Integer id) {
        String sql="delete from user where id=?";
        jdbcTemplate.update(sql,id);
    }

二.二.三.三 查看数据结果

在这里插入图片描述

数据删除成功。

二.二.四 批量数据

二.二.四.一 测试方法

  @Test
    public void batchAddTest(){
        //1. 构建对象
        User user=new User();
        user.setName("小欢欢");
        user.setAge(22);
        user.setSex("女");
        user.setDescription("一个小坏蛋");

        User user1=new User();
        user1.setName("小泽霖");
        user1.setAge(25);
        user1.setSex("男");
        user1.setDescription("一个大坏蛋");
        //2. 放置到集合里面
        List<User> userList=new ArrayList<>();
        userList.add(user);
        userList.add(user1);
        userService.batchAddUser(userList);
    }

二.二.四.二 实现方法

   @Override
    public void batchAddUser(List<User> userList) {
        //1.sql语句
        String sql="insert into user(name,sex,age,description) values(?,?,?,?) ";
        //2. 构建参数集合信息
        List<Object[]> objects=new ArrayList<>();
        for(User user:userList){
            Object[] obj=new Object[4];
            obj[0]=user.getName();
            obj[1]=user.getSex();
            obj[2]=user.getAge();
            obj[3]=user.getDescription();
            objects.add(obj);
        }
        //3.调用 batchUpdate 批量更新,执行方法
        jdbcTemplate.batchUpdate(sql,objects);
    }

二.二.五.三 查看数据结果

在这里插入图片描述

数据批量添加成功,批量修改与批量删除,也是相同的用法。

三 查询的基本用法

新建一个 QueryJdbcApplicationTests 测试类,用于测试查询的相关方法。

三.一 queryForObject 方法

三.一.一 方法重载

image-20210425134740067

通常使用的是

<T> T queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args)

方法

三.一.二 举例,根据 Id进行查询单个对象信息

三.一.二.一 测试方法

   @Test
    public void queryByIdTest(){
        User user=userService.queryById(2);
        log.info(user);
    }

三.一.二.二 实现方法

 @Override
    public User queryById(Integer id) {
        String sql="select id,name,sex,age,description from user where id=?";
        //用 RowMapper 进行封装对象信息
        User user=jdbcTemplate.queryForObject(sql, new RowMapper<User>() {
            @Override
            public User mapRow(ResultSet resultSet, int num) throws SQLException {
                //根据resultSet 表示结果集, num 表示索引行
                User tempUser=new User();
                tempUser.setId(resultSet.getInt("id"));
                tempUser.setName(resultSet.getString("name"));
                tempUser.setSex(resultSet.getString("sex"));
                tempUser.setAge(resultSet.getInt("age"));
                tempUser.setDescription(resultSet.getString("description"));
                return tempUser;
            }
        },id);

        jdbcTemplate.queryForObject
        return user;
    }

三.一.二.三 查看数据结果

image-20210425135054929

三.二 query方法

三.二.一 方法重载

image-20210425135248063

通常使用的是

 <T> List<T> query(String sql, RowMapper<T> rowMapper, @Nullable Object... args)

方法。

三.二.二 举例,查询全部数据

三.二.二.一 测试方法

@Test
    public void queryAllTest(){
        List<User> userList=userService.queryForAll();
        userList.forEach(n->log.info(n));
    }

三.二.二.二 实现方法

    @Override
    public List<User> queryForAll() {
        String sql="select id,name,sex,age,description from user ";
        List<User> userList=jdbcTemplate.query(sql, new RowMapper<User>() {
            @Override
            public User mapRow(ResultSet resultSet, int num) throws SQLException {
                //根据resultSet 表示结果集, num 表示索引行
                User tempUser=new User();
                tempUser.setId(resultSet.getInt("id"));
                tempUser.setName(resultSet.getString("name"));
                tempUser.setSex(resultSet.getString("sex"));
                tempUser.setAge(resultSet.getInt("age"));
                tempUser.setDescription(resultSet.getString("description"));
                return tempUser;
            }
        });
        return userList;
    }

三.二.二.三 查看数据结果

image-20210425135551589

三.三 queryForMap方法

三.三.一 方法重载

image-20210425144657358

通常使用的是

Map<String, Object> queryForMap(String sql, @Nullable Object... args)

方法。

三.三.二 举例,查询全部数据

三三.二.一 测试方法

  @Test
    public void queryForMapTest(){
        Map<String,Object> userMap=userService.queryForMapById(2);
        log.info(userMap);
    }

三.三.二.二 实现方法

  @Override
    public Map<String, Object> queryForMapById(Integer id) {
        String sql="select id,name,sex,age,description from user where id=?";
        Map<String,Object> map=jdbcTemplate.queryForMap(sql,id);
        return map;
    }

三.三.二.三 查看数据结果

image-20210425144903892

三.四 queryForObject方法

三.四.一 方法重载

image-20210425134740067

三.四.二 举例,查询全部数据

三四.二.一 测试方法

 @Test
    public void queryForSingleTest(){
        Integer count=userService.countAll();
        log.info("查询总数目,{}",count);
    }

三.四.二.二 实现方法

   @Override
    public Integer countAll() {
        String sql="select count(1) from user";
        Integer count=jdbcTemplate.queryForObject(sql,Integer.class);
        return count;
    }

三.四.二.三 查看数据结果

image-20210425145146907

三.五 queryForList方法

三.五.一 方法重载

image-20210425145259485

三.五.二 举例,查询全部数据

三.五.二.一 测试方法

   @Test
    public void queryForIdsTest(){
        List<Integer> idList=userService.queryForIdList();
        log.info(idList);
    }

三.五.二.二 实现方法

   @Override
    public List<Integer> queryForIdList() {
        String sql="select id from user";
        List<Integer> idList=jdbcTemplate.queryForList(sql,Integer.class);
        return idList;
    }

三.五.二.三 查看数据结果

image-20210425145412651

三.六 execute 方法

三.六.一 方法重载

image-20210425145537293

三.六.二.一 测试方法

  @Test
    public void executeTest(){
        userService.createTable();
    }

三.六.二.二 实现方法

 @Override
    public void createTable() {
        String sql="create table dept(id int(11),name varchar(200))";
        jdbcTemplate.execute(sql);
    }

三.六.二.三 查看数据结果

dept 部门表 创建成功。

image-20210425145648306

三.七 query 方法

三.七.一 方法重载

image-20210425135248063

三.七.二.一 测试方法

 @Test
    public void beanTest(){
        List<User> userList=userService.queryBeanForAll();
        userList.forEach(n->log.info(n));
    }

三.七.二.二 实现方法

 @Override
    public List<User> queryBeanForAll() {
        String sql="select id,name,sex,age,description from user ";
        List<User> userList=jdbcTemplate.query(sql,new MyUserMapper());
        return userList;
    }
    class MyUserMapper implements RowMapper<User>{

        @Override
        public User mapRow(ResultSet resultSet, int num) throws SQLException {
            //根据resultSet 表示结果集, num 表示索引行
            User tempUser=new User();
            tempUser.setId(resultSet.getInt("id"));
            tempUser.setName(resultSet.getString("name"));
            tempUser.setSex(resultSet.getString("sex"));
            tempUser.setAge(resultSet.getInt("age"));
            tempUser.setDescription(resultSet.getString("description"));
            return tempUser;
        }
    }

三.七.二.三 查看数据结果

image-20210425145949183

三.八 queryForRowSet 方法

三.七.一 方法重载

image-20210425150044533

三.七.二.一 测试方法

 @Test
    public void rowSetTest(){
        List<User> userList=userService.queryRowSetForAll();
        userList.forEach(n->log.info(n));
    }

三.七.二.二 实现方法

@Override
    public List<User> queryRowSetForAll() {
        String sql="select id,name,sex,age,description from user ";
        SqlRowSet sqlRowSet=jdbcTemplate.queryForRowSet(sql);
        List<User> userList=new ArrayList<>();
        while(sqlRowSet.next()){
            User tempUser=new User();
            tempUser.setId(sqlRowSet.getInt("id"));
            tempUser.setName(sqlRowSet.getString("name"));
            tempUser.setSex(sqlRowSet.getString("sex"));
            tempUser.setAge(sqlRowSet.getInt("age"));
            tempUser.setDescription(sqlRowSet.getString("description"));
            userList.add(tempUser);
        }
        return userList;
    }

三.七.二.三 查看数据结果

image-20210425150138923

本章节的代码放置在 github 上:

https://github.com/yuejianli/springboot/tree/develop/JdbcTemplate

谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
93 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
6月前
|
Java 关系型数据库 数据库连接
SpringBoot(八)之JdbcTemplate
在 application.properties 或 application.yml 文件中配置数据库连接信息。
281 0
|
Java 数据库连接 数据库
SpringBoot整合持久层技术之搭建JDBCTemplate项目实战
现在有了MyBatis之后很少人使用JDBCTemplate来整合项目了,要么就是JPA技术,要么就是Mybatis来操作数据库,今天我搭建一个springboot的template项目,看看其和JPA、Mybatis有什么不同的地方,方便大家一起学习。
80 0
|
7月前
|
Java 关系型数据库 MySQL
Spring Boot使用JdbcTemplate操作mysql数据库实战(附源码 超详细)
Spring Boot使用JdbcTemplate操作mysql数据库实战(附源码 超详细)
277 0
|
Java 数据库连接 测试技术
微服务技术系列教程(03) - SpringBoot - 整合各种数据源(JdbcTemplate、MyBatis、JPA)
微服务技术系列教程(03) - SpringBoot - 整合各种数据源(JdbcTemplate、MyBatis、JPA)
61 0
|
Oracle NoSQL 关系型数据库
SpringBoot-13-使用JdbcTemplate链接Mysql数据库
在企业项目开发者,数据库的使用是必不可少的一部分,常用的数据库有mysql、oracle、sqlserver、redis等,我们接下来的几章会介绍SpringBoot中如何使用数据库,本章就介绍使用JdbcTemplate链接mysql。
129 0
|
SQL 存储 druid
Spring Boot数据持久化之JdbcTemplate
Spring Boot数据持久化之JdbcTemplate
|
SQL Java 关系型数据库
Spring Boot常用数据库开发技术总结:JDBCTemplate、JPA、Mybatis
1.概述 数据库开发一直是JAVA开发的核心之一,作为现在JAVA EE的基石框架,Spring Boot自身携带了一个JDBCTemplate框架,其对JDBC进行了基础的封装,使得Spring Boot原生就支持据库开发。同时Spring Boot也不排斥其它优秀的持久层框架,允许他们以极低的代价平滑的接入。 本文主要介绍最常用到的三个持久层框架,JdbcTemplate、JPA、mybatis如何接入Spring Boot并在其上进行开发。
332 0
|
XML Java 关系型数据库
SpringBoot 整合 JdbcTemplate|学习笔记
快速学习 SpringBoot 整合 JdbcTemplate
103 0
SpringBoot 整合 JdbcTemplate|学习笔记
|
Java 关系型数据库 MySQL
SpringBoot整合JdbcTemplate连接Mysql
SpringBoot整合JdbcTemplate连接Mysql
168 0