Spring 6.1新核心:JdbcClient,统一JdbcTemplate两套API的终极方案

01 引言

企业中直接使用JDBC的进行CRUD操作的可能比较少,但是很多框架底层或者测试的时候可能用的比较多,因为Spring官方自带,注入可以直接使用,无需三方依赖。

因为直接使用的比较少,所以关注的人可能不是很多。在浏览Spring Framework时,发现了新的JDBC客户端,函数式操作CRUD相当丝滑,整理一下分享给大家。

02 JDBC客户端

在介绍JdbcClient客户端之前,我们先来了解一下老牌的客户端:

  • JdbcTemplate
  • NamedParameterJdbcTemplate

JdbcTemplateSpring 1.0的时候引入的,参数通过?占位符占位,然后顺序传递。

java 复制代码
String sql = "SELECT * FROM user_info WHERE id = ?";
UserInfo userInfo = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(UserInfo.class), 10002);
System.out.println("jdbcTemplate:" + userInfo);
// jdbcTemplate:UserInfo(id=10002, name=王二狗, age=54, sex=null, job=null, birthday=null, createdTime=2025-08-15 15:39:28.0, updateTime=null)

NamedParameterJdbcTemplateSpring 2.0引入的,通过:name 占位符,然后通过占位符的名称传递参数,不受顺序的限制。

java 复制代码
String sql = "SELECT * FROM user_info WHERE id = :id";
MapSqlParameterSource params = new MapSqlParameterSource().addValue("id", 10002);
UserInfo userInfo = namedParameterJdbcTemplate.queryForObject(sql, params, new BeanPropertyRowMapper<>(UserInfo.class));
System.out.println("MapSqlParameterSource:" + userInfo);
// MapSqlParameterSource:UserInfo(id=10002, name=王二狗, age=54, sex=null, job=null, birthday=null, createdTime=2025-08-15 15:39:28.0, updateTime=null)

这两种客户端虽然可以满足基本的操作,但是不够流畅。随着函数式编程、Lamada表达式被广大开发者接受,这两种客户端的操作方式,可能会被大家一直嫌弃。

03 JdbcClient

JdbcClient是在Spring 6.1引入的,结合两款老牌的端的参数传递的形式,又加入链式编程,以方面开发者的使用。JdbcClient可以完全取代老牌的客户端。

JdbcClient是 Spring 对 JDBC 访问的现代化改进,提供了更简洁、流畅的 API,统一了位置参数和命名参数的使用方式,减少了样板代码,更好地支持现代 Java 特性(Record、Optional等)。

官方地址:https://docs.spring.io/spring-framework/reference/data-access/jdbc/core.html#jdbc-JdbcClient

3.1 查询

java 复制代码
String sql = "SELECT * FROM user_info WHERE id = :id";
String sql2 = "SELECT * FROM user_info WHERE id = ?";

@Test
void test01() {
    UserInfo userInfo = jdbcClient.sql(sql)
        .param("id", 10002)
        .query(UserInfo.class)
        .single();
    System.out.println("sql:" + userInfo);
    System.out.println("--------------------");

    UserInfo userInfo2 = jdbcClient.sql(sql2)
        .param(10002)
        .query(UserInfo.class)
        .single();
    System.out.println("sql2:" + userInfo2);
}

执行结果

3.2 更新

java 复制代码
String sql = "SELECT * FROM user_info WHERE id = :id";
String updateSql = "update user_info set name = :name where id = :id";

@Test
void test02() {
    jdbcClient.sql(updateSql)
            .param("name", "刘十三")
            .param("id", 10002)
            .update();
    UserInfo userInfo = jdbcClient.sql(sql)
            .param("id", 10002)
            .query(UserInfo.class)
            .single();
    System.out.println("sql:" + userInfo);
}

执行结果

3.3 新增

java 复制代码
@Test
void test03() {
    jdbcClient.sql("INSERT INTO user_info(name, age) VALUES(:name, :age)")
            .param("name", "归海一刀")
            .param("age", "200")
            .update();

    UserInfo userInfo = jdbcClient.sql("SELECT * FROM user_info WHERE name = ?")
            .param("归海一刀")
            .query(UserInfo.class)
            .single();
    System.out.println("sql:" + userInfo);
}

执行结果

04 小结

JdbcClient相比之前的客户端确实简洁了不少,如果项目中需要使用jdbc客户端,JdbcClient将是你的不二选择。

相关推荐
迦蓝叶9 天前
JDBC元数据深度实战:企业级数据资源目录系统构建指南
java·jdbc·企业级·数据资源·数据血缘·数据元管理·构建指南
Chloeis Syntax25 天前
MySQL初阶学习日记(8)--- JDBC
java·数据库·笔记·学习·mysql·jdbc
蟹至之1 个月前
【MySQL】JDBC的使用(万字解析)
java·数据库·mysql·jdbc
自在极意功。2 个月前
深入解析JDBC:Java数据库操作的基础
java·开发语言·数据库·jdbc
教练、我想打篮球2 个月前
117 javaweb servlet+jsp 项目中修改了 数据库连接配置, 却怎么都不生效
java·servlet·jdbc·jsp
安冬的码畜日常3 个月前
【JUnit实战3_31】第十九章:基于 JUnit 5 + Hibernate + Spring 的数据库单元测试
spring·单元测试·jdbc·hibernate·orm·junit5
安冬的码畜日常3 个月前
【JUnit实战3_24】 第十四章:JUnit 5 扩展模型(Extension API)实战(下)
测试工具·junit·单元测试·jdbc·junit5扩展·junit extension
安冬的码畜日常3 个月前
【JUnit实战3_23】 第十四章:JUnit 5 扩展模型(Extension API)实战(上)
测试工具·junit·单元测试·jdbc·h2·extension模型·junit5扩展
Scigar3 个月前
JDBC 全解析:从入门到实战,掌握数据库交互核心技术
jdbc·事务管理·sql 注入·java 数据库连接·预编译 statement