
01 引言
企业中直接使用JDBC的进行CRUD操作的可能比较少,但是很多框架底层或者测试的时候可能用的比较多,因为Spring官方自带,注入可以直接使用,无需三方依赖。
因为直接使用的比较少,所以关注的人可能不是很多。在浏览Spring Framework时,发现了新的JDBC客户端,函数式操作CRUD相当丝滑,整理一下分享给大家。
02 JDBC客户端
在介绍JdbcClient客户端之前,我们先来了解一下老牌的客户端:
JdbcTemplateNamedParameterJdbcTemplate
JdbcTemplate是Spring 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)
NamedParameterJdbcTemplate是Spring 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将是你的不二选择。