SpringBoot整合JdbcTemplate快速开发数据访问层

 更新时间:2026年04月03日 09:29:23   作者:希望永不加班  
文章介绍了SpringBoot中使用JdbcTemplate操作数据库的优势、使用场景、引入依赖、配置方式、常用方法、封装Service层和Controller接口等内容,并提供了简单的示例代码,最后总结了JdbcTemplate与MyBatis的选择原则和注意事项,需要的朋友可以参考下

很多人一提到 SpringBoot 操作数据库,就只想到 MyBatis、JPA,其实在很多简单业务、小工具项目、后台管理模块里,根本没必要上重型框架。JdbcTemplate 才是轻量、简单、开箱即用的神器,没有复杂配置、没有 XML、没有各种插件,几行代码就能完成增删改查,非常适合快速开发。

一、JdbcTemplate 适合什么场景?

  • 单表简单业务,不想写 MyBatis XML/注解
  • 微服务内部小模块、轻量接口
  • 快速原型开发、临时数据处理
  • 对 SQL 可控,但又不想引入复杂 ORM

优点:

  • 极轻量,无额外依赖
  • 直接写原生 SQL,灵活直观
  • 性能接近原生 JDBC,无损耗
  • Spring 自带,自动整合事务

二、引入依赖

只需要 web + jdbc + mysql 驱动即可:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

三、application.yml 配置

和 MyBatis 数据源配置完全一样:

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

不需要任何额外配置,启动项目自动装配 JdbcTemplate

四、建表 SQL

CREATE TABLE `user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

五、实体类 User

package com.demo.entity;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class User {
    private Long id;
    private String username;
    private Integer age;
    private String email;
    private LocalDateTime createTime;
}

六、直接使用 JdbcTemplate(最简洁方式)

JdbcTemplate 常用方法:

  • update():增、删、改
  • queryForObject():查询单个对象
  • query():查询列表
  • batchUpdate():批量操作

1. 新增

@Autowired
private JdbcTemplate jdbcTemplate;
public int addUser(User user) {
    String sql = "insert into user(username, age, email) values(?, ?, ?)";
    return jdbcTemplate.update(
            sql,
            user.getUsername(),
            user.getAge(),
            user.getEmail()
    );
}

2. 删除

public int deleteById(Long id) {
    String sql = "delete from user where id=?";
    return jdbcTemplate.update(sql, id);
}

3. 修改

public int updateUser(User user) {
    String sql = "update user set username=?, age=?, email=? where id=?";
    return jdbcTemplate.update(
            sql,
            user.getUsername(),
            user.getAge(),
            user.getEmail(),
            user.getId()
    );
}

4. 根据 ID 查询单个对象

public User findById(Long id) {
    String sql = "select * from user where id=?";
    return jdbcTemplate.queryForObject(
            sql,
            new BeanPropertyRowMapper<>(User.class),
            id
    );
}

5. 查询列表

public List<User> findAll() {
    String sql = "select * from user";
    return jdbcTemplate.query(
            sql,
            new BeanPropertyRowMapper<>(User.class)
    );
}

6. 带条件查询

public List<User> findByAge(Integer age) {
    String sql = "select * from user where age=?";
    return jdbcTemplate.query(
            sql,
            new BeanPropertyRowMapper<>(User.class),
            age
    );
}

7. 统计数量

public Long count() {
    String sql = "select count(*) from user";
    return jdbcTemplate.queryForObject(sql, Long.class);
}

8. 批量插入

public void batchAdd(List<User> userList) {
    String sql = "insert into user(username, age, email) values(?,?,?)";
    jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps, int i) throws SQLException {
            User user = userList.get(i);
            ps.setString(1, user.getUsername());
            ps.setInt(2, user.getAge());
            ps.setString(3, user.getEmail());
        }
        @Override
        public int getBatchSize() {
            return userList.size();
        }
    });
}

七、封装成标准 Service 层

@Service
public class UserService {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    // 新增
    @Transactional(rollbackFor = Exception.class)
    public boolean add(User user) {
        String sql = "insert into user(username,age,email) values(?,?,?)";
        return jdbcTemplate.update(sql, user.getUsername(), user.getAge(), user.getEmail()) > 0;
    }
    // 删除
    @Transactional
    public boolean delete(Long id) {
        String sql = "delete from user where id=?";
        return jdbcTemplate.update(sql, id) > 0;
    }
    // 修改
    @Transactional
    public boolean update(User user) {
        String sql = "update user set username=?,age=?,email=? where id=?";
        return jdbcTemplate.update(sql,
                user.getUsername(),
                user.getAge(),
                user.getEmail(),
                user.getId()) > 0;
    }
    // 根据ID查询
    public User findById(Long id) {
        String sql = "select * from user where id=?";
        try {
            return jdbcTemplate.queryForObject(
                    sql,
                    new BeanPropertyRowMapper<>(User.class),
                    id);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }
    // 查询全部
    public List<User> list() {
        String sql = "select * from user";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    }
}

注意:
queryForObject 查询不到会抛异常,必须 try-catch 处理。

八、Controller 接口

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @PostMapping("/add")
    public Result add(@RequestBody User user) {
        userService.add(user);
        return Result.success("添加成功");
    }
    @DeleteMapping("/delete/{id}")
    public Result delete(@PathVariable Long id) {
        userService.delete(id);
        return Result.success("删除成功");
    }
    @PutMapping("/update")
    public Result update(@RequestBody User user) {
        userService.update(user);
        return Result.success("修改成功");
    }
    @GetMapping("/{id}")
    public Result findById(@PathVariable Long id) {
        return Result.success(userService.findById(id));
    }
    @GetMapping("/list")
    public Result list() {
        return Result.success(userService.list());
    }
}

九、JdbcTemplate 事务支持

直接使用 @Transactional 即可,和 MyBatis 完全一致:

@Transactional(rollbackFor = Exception.class)
public void testTransaction() {
    // 两次修改,要么都成功,要么都回滚
    jdbcTemplate.update("update user set age=20 where id=1");
    int i = 1 / 0; // 模拟异常
    jdbcTemplate.update("update user set age=30 where id=2");
}

十、JdbcTemplate 与 MyBatis 如何选择?

  • 简单单表、快速开发 → JdbcTemplate
  • 复杂查询、多表关联、动态SQL → MyBatis
  • 企业后台管理系统 → MyBatis 更易维护
  • 小接口、轻量服务 → JdbcTemplate 更清爽

十一、注意事项

1. 查询不到数据报错
queryForObject 无数据会抛异常,需要捕获 EmptyResultDataAccessException

2. 类型不匹配
数据库日期、数字类型要与实体类对应

3. SQL 注入风险
必须使用 ? 占位符,不要字符串拼接

4. 批量操作性能
大量数据建议分批插入,避免一次过大

十二、总结

SpringBoot 整合 JdbcTemplate 可以说是最简单的数据层方案
只需要引入 spring-boot-starter-jdbc,自动装配,直接写 SQL 就能完成所有操作。

没有配置、没有 XML、没有学习成本,非常适合小项目、快速开发场景,也是 Spring 生态最原生的数据访问方式。

以上就是SpringBoot整合JdbcTemplate快速开发数据访问层的详细内容,更多关于SpringBoot JdbcTemplate数据访问层的资料请关注脚本之家其它相关文章!

相关文章

  • java中treemap和treeset实现红黑树

    java中treemap和treeset实现红黑树

    这篇文章主要为大家详细介绍了java中treemap和treeset实现红黑树,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Java JDBC基本使用方法详解

    Java JDBC基本使用方法详解

    这篇文章主要介绍了Java JDBC基本使用方法,结合实例形式详细分析了java JDBC基本原理、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • Java 变量类型及其实例

    Java 变量类型及其实例

    这篇文章主要讲解Java中变量的类型以及实例,希望能给大家做一个参考
    2017-04-04
  • SpringBoot集成quartz实现定时任务

    SpringBoot集成quartz实现定时任务

    这篇文章主要介绍了如何使用SpringBoot整合Quartz,并将定时任务写入库中(持久化存储),还可以任意对定时任务进行如删除、暂停、恢复等操作,需要的可以了解下
    2023-09-09
  • Spring IOC与DI核心深入理解

    Spring IOC与DI核心深入理解

    IOC也是Spring的核心之一了,之前学的时候是采用xml配置文件的方式去实现的,后来其中也多少穿插了几个注解,但是没有说完全采用注解实现。那么这篇文章就和大家分享一下,全部采用注解来实现IOC+DI
    2023-02-02
  • spring mvc @PathVariable绑定URI模板变量值方式

    spring mvc @PathVariable绑定URI模板变量值方式

    这篇文章主要介绍了spring mvc @PathVariable绑定URI模板变量值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java 中的 equals 和 hashCode 方法关系与正确重写实践案例

    Java 中的 equals 和 hashCode 方法关系与正确重写

    在Java中,equals和 hashCode方法是Object类的核心方法,广泛用于对象比较和哈希集合(如 HashMap、HashSet)的操作,本文深入剖析equals和hashCode方法的关系、契约、正确重写方式及实践案例,感兴趣的朋友一起看看吧
    2025-09-09
  • SpringMVC上传图片与访问

    SpringMVC上传图片与访问

    这篇文章主要介绍了SpringMVC上传图片与访问的相关资料,需要的朋友可以参考下
    2016-01-01
  • spring中REST和RESTful的区别以及基本实现

    spring中REST和RESTful的区别以及基本实现

    本文主要介绍了spring中REST和RESTful的区别以及基本实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • jdk同时安装多个版本并自由切换的技巧总结

    jdk同时安装多个版本并自由切换的技巧总结

    在我们开发过程有时候为了了解不同版本jdk的框架源码,这时候我们需要安装不同版本的JDK来满足我们开发的需求,这篇文章主要介绍了jdk同时安装多个版本并自由切换技巧的相关资料,需要的朋友可以参考下
    2025-07-07

最新评论