SpringBoot整合JdbcTemplate

124 阅读5分钟

SpringBoot整合JdbcTemplate

1.前言☕

大家好,我是Leo哥🫣🫣🫣,今天给大家带来关于精品SpringBoot专栏,暂且就给他起名为循序渐进学SpringBoot,这里我参考了我上一个专栏:循序渐进学SpringSecurity6。有需要的朋友可以抓紧学习来哈,带你从SpringSecurity从零到实战项目。好了,我们进入正题,为什么会有SpringBoot这个专栏呢,是这样的,今年Leo哥也是正在重塑知识体系,从基础到框架,而SpringBoot又是我们框架中的核心,我觉得很有必要通过以博客的形式将我的知识系列进行输出,同时也锻炼一下自己的写作能力,如果能帮到大家那就更好啦!!!本地系列教程会从SpringBoot基础讲起,会以知识点+实例+项目的学习模式由浅入深对Spring Boot框架进行学习&使用。好了,话不多说让我们开始吧😎😎😎。

2.概述

一般持久化的操作都是有一些专门来做持久化的框架来完成的,比如原始一些的JDBC, 老牌劲旅JPA(hibernate), 还有现在用的比较或的mybatis和MybatisPlus, 而SpringBoot中我们也是先要选择要使用的持久层框架,然后使用SpringBoot进行集成。而集成的步骤由于SpringBoot的自动化配置功能而大大简化。

今天我们先来搞个简单点的,先来个JdbcTemplate, 这个是Spring基于Jdbc而封装的一个持久层框架,致力于轻量、便捷地操作数据库。他的操作很简单,但是不如mybatis和jpa功能全面,但是比原生jdbc强点,说实话,实战中用的也比较少。

3.JdbcTemplate的特点

  • 速度快,相对于ORM框架,JDBC的方式是最快的。
  • 配置简单,Spring封装的,除了数据库连接之外,几乎没有额外的配置。
  • 使用方便,就像DBUtils工具类,只需注入JdbcTemplate对象即可。

4.JdbcTemplate的几种类型的方法

JdbcTemplate虽然简单,功能却非常强大。它提供了非常丰富、实用的方法,归纳起来主要有以下几种类型的方法:

(1)execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句。

(2)update、batchUpdate方法:用于执行新增、修改与删除等语句。

(3)query和queryForXXX方法:用于执行查询相关的语句。

(4)call方法:用于执行 数据库存储 过程和函数相关的语句。

总的来说,新增、删除与修改三种类型的操作主要使用update和batchUpdate方法来完成。query和queryForObject方法中主要用来完成查询功能。execute方法可以用来执行任意的SQL、call方法来调用存储过程。

5.Spring Boot集成JdbcTemplate

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

5.1 创建SpringBoot项目

我们这里还是采用Maven的方式创建SpringBoot项目,这里就不做过多赘述了。

5.2 添加POM依赖

不仅要加入jdbc依赖,还要加入数据库驱动依赖(这里加入mysql)以及lombok

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--引入jdbc stater 目的是使用JDBC模板接口-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
    </dependencies>

5.3 添加实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

    private String name;

    private Integer age;

    private String sex;

    private String address;


    private String avatar;

}

5.4 添加配置类

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/leo-springboot-tutorial?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
    username: root
    password: root  #数据库名、用户名和密码改为自己的
    driver-class-name: com.mysql.cj.jdbc.Driver

5.5 添加测试类

1. 注册JdbcTemplate

 @Autowired
 JdbcTemplate jdbcTemplate;

2. 两种添加方法

	/**
     *  用于测试: 添加方法01
     */
    @Test
    public void test01() {
        String sql = "insert into user (id, name, age,sex,address,avatar) values (?, ?,?,?,?,?)";
        User user = new User();
        user.setId(1);
        user.setName("Leo哥");
        user.setAge(18);
        user.setSex("男");
        user.setAddress("北京朝阳");
        user.setAvatar("https://www.javatop.cn/images/logo.png");
        int update = jdbcTemplate.update(sql, user.getId(),user.getName(),user.getAge(), user.getSex(),user.getAddress(),user.getAvatar());
        System.out.println("update = " + update);
    }

image-20240302143953359

image-20240302143938219

下面的方法通过GeneratedKeyHolder可以拿到在插入数据库数据之后,数据库分配给此项数据的ID,并返回给后台

	/**
     * 用于测试: 添加方法02
     */
    @Test
    public void test02() {
        GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
        User user = new User();
        user.setId(3);
        user.setName("lifi2");
        user.setAge(20);
        user.setSex("女");
        user.setAddress("湖南漳州");
        user.setAvatar("https://www.javatop.cn/images/logo.png");
        int update = jdbcTemplate.update(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
                String sql = "insert into user (id, name, age,sex,address,avatar) values (?, ?,?,?,?,?)";
                PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
                ps.setObject(1, user.getId());
                ps.setObject(2, user.getName());
                ps.setObject(3, user.getAge());
                ps.setObject(4, user.getSex());
                ps.setObject(5, user.getAddress());
                ps.setObject(6, user.getAvatar());
                return ps;
            }
        }, keyHolder);
        System.out.println("主键ID = " + keyHolder.getKey().intValue());
        user.setId(keyHolder.getKey().intValue());
    }

可以在添加用户的时候直接获取到我们的主键ID并返回。

image-20240302144500431

image-20240302144526197

3. 删除方法

    /**
     *  用于测试: 删除方法
     */
    @Test
    public void test03() {
        String sql = "delete from user where id = ?";
        Integer id = 3;
        int update = jdbcTemplate.update(sql, id);
        System.out.println("受影响的行数" + update);
    }

可以看到我们受影响的行数为1。

image-20240302144757107

ID为3的用户也被删除了。

image-20240302144828611

4. 修改方法

 	/**
     *  用于测试: 修改方法
     */
    @Test
    public void test04() {
        String sql = "update user set name = ? where id = ?";
        int update = jdbcTemplate.update(sql, "张三", 2);
        System.out.println("受影响的行数" + update);
    }

可以看到我们受影响的行数为1。

image-20240302145006843

ID为2的用户lifi被改为了张三。

image-20240302145100770

5. 查询方法

/**
     *  用于测试: 查询方法
     */
    @Test
    public void test05() {
        List<User> list = jdbcTemplate.query("select * from user", new RowMapper<User>() {
            @Override
            public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                User user = new User();
                Integer id = rs.getInt("id");
                String name = rs.getString("name");
                Integer age = rs.getInt("age");
                String sex = rs.getString("sex");
                String address = rs.getString("address");
                String avatar = rs.getString("avatar");
                user.setId(id);
                user.setName(name);
                user.setAge(age);
                user.setSex(sex);
                user.setAddress(address);
                user.setAvatar(avatar);
                System.out.println("user = " + user);
                return user;
            }
        });
    }

image-20240302145624764

6.总结

在大部分情况下,我们都会直接使用更加强大的持久化框架来访问数据库,比如MyBatis、Hibernate或者Spring Data JPA,我们这里讲解JdbcTemplate的整合,只是告诉大家有这么一种操作数据库的方式。

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。

本文由博客一文多发平台 OpenWrite 发布!