SpringBoot3.2新特性:JdbcClient

发布于:2025-06-07 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、简介

Spring 6.1 中新添加了 JdbcClient 接口,它提供了 Fluent 风格的 API,统一了 JdbcTemplate 和 NamedParameterJdbcTemplate 的 Facade,支持链式操作。

有了 JdbcClient 后就可以使用 Fluent 风格的 API 定义查询、设置参数以及执行数据库操作了。

该功能简化了 JDBC 操作,使其更易读、更易懂。然而,对于 JDBC 批处理操作和存储过程的调用,仍然需要使用 JdbcTemplate 和 NamedParameterJdbcTemplate 类。

SpringBoot3.2中也集成了JdbcClient ,配置也很简单,只要引入相关包,Spring Boot 框架会自动发现 application.properties 中的 DB 连接属性,并在应用启动时创建 JdbcClient Bean。之后,JdbcClient Bean 可以在任何类中注入、使用。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
@Component
public class DbService {
   
	// 直接使用即可
    @Autowired
    private JdbcClient jdbcClient;
}

二、使用

1、支持隐式位置参数

使用占位符 ? 来通过位置绑定 SQL 参数。

List<Student> getStudentsOfGradeStateAndGenderWithPositionalParams(int grade, String state, String gender) {
   
    String sql = "select student_id, student_name, age, grade, gender, state from student"
            + " where grade = ? and state = ? and gender = ?";
    return jdbcClient.sql(sql)
      .param(grade)
      .param(state)
      .param(gender)
      .query(new StudentRowMapper()).list();
}

@Test
void givenJdbcClient_whenQueryWithPositionalParams_thenSuccess() {
   
    List<Student> students = studentDao.getStudentsOfGradeStateAndGenderWithPositionalParams(1, "New York", "Male");
    assertEquals(6, students.size());
}

在上述方法中,参数 grade、state 和 gender 是按照方法 param() 的调用顺序隐式注册的。最后,当调用 query() 方法时,语句将被执行,并通过 RowMapper 转换、获取结果,和 JdbcTemplate 一样。

query() 方法还支持 ResultSetExtractor 和 RowCallbackHandler 参数。

在调用 list() 方法之前,不会检索到任何结果。此外,还支持其他获取结果的操作,如 optional()、set()、single() 和 stream()。

还可以通过 params 方法使用可变参数来设置 SQL 参数:

Student getStudentsOfGradeStateAndGenderWithParamsInVarargs(int grade, String state, String gender) {
   
    String sql = "select student_id, student_name, age, grade, gender, state from student"
      + " where grade = ? and state = ? and gender = ? limit 1";
    return jdbcClient.sql(sql)
      .params(grade, state, gender)
      .query(new StudentRowMapper()).single();
}

@Test
void givenJdbcClient_whenQueryWithParamsInVarargs_thenSuccess() {
   
    Student student = studentDao.getStudentsOfGradeStateAndGenderWithParamsInVarargs(1, "New York", "Male");
    assertNotNull(student);
}

如上所示,使用 params() 方法替换了 param() 方法,后者使用可变参数。最后通过 single() 方法来检索一条记录。

params() 方法还有一个重载版本,可以接收一个参数 List。

Optional<

网站公告

今日签到

点亮在社区的每一天
去签到