Spring Boot 3.2 新特性之 JdbcClient

news/2025/2/22 0:10:52/

SpringBoot 3.2引入了新的 JdbcClient 用户数据库操作,JdbcClient对JdbcTemplate进行了封装,采用了 fluent API 的风格,可以进行链式调用。

自此,spring自带的数据库操作有了4种方式:JdbcTemplate、JdbcClient、SpringDataJdbc、SpringDataJpa。

对于不适合使用复杂的ORM框架,或者需要编写复杂的SQL的场景,可以使用JdbcClient自己编写SQL来操作数据库。不过JdbcClient不支持数据的批量操作和存储过程调用,对于这种情况就需要使用JdbcTemplate。

具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-data-jdbc-client

一、概述

JdbcClient是一个轻量的数据库操作框架,采用 fluent API 风格,简单灵活,易于阅读和维护,支持编写复杂的SQL。

二、引入 JdbcClient

首先引入 spring-data-jdbc 依赖。

在 build.gradle 中增加一行代码:

implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'

在Service中直接注入JdbcClient即可:

@Component
public class DbService {@Autowiredprivate JdbcClient jdbcClient;
}

三、查询操作

通过JdbcClient,可以按照主键查数据,也可以按照自定义查询条件查数据。

按照主键查数据:

public MyData findDataById(Long id) {return jdbcClient.sql("select * from my_data where id = ?").params(id).query(MyData.class).single();}

按照自定义查询条件查数据:

public List<MyData> findDataByName(String name) {return jdbcClient.sql("select * from my_data where name = ?").params(name).query(MyData.class).list();}

以上两种查询方式,查询条件中的变量使用的是占位符,JdbcClient也支持按照参数名进行查询:

public Integer insertDataWithNamedParam(MyData myData) {Integer rowsAffected = jdbcClient.sql("insert into my_data values(:id,:name) ").param("id", myData.id()).param("name", myData.name()).update();return rowsAffected;}

当参数比较多时,可以将参数放到一个Map中,用Map进行查询:

public List<MyData> findDataByParamMap(Map<String, ?> paramMap) {return jdbcClient.sql("select * from my_data where name = :name").params(paramMap).query(MyData.class).list();}

当查询返回的结果不能简单的映射到一个类时,可以编写RowMapper,适用于SQL语句比较复杂的场景:

public List<MyData> findDataWithRowMapper() {return jdbcClient.sql("select * from my_data").query((rs, rowNum) -> new MyData(rs.getLong("id"), rs.getString("name"))).list();}

同时也支持查询记录数:

public Integer countByName(String name) {return jdbcClient.sql("select count(*) from my_data where name = ?").params(name).query(Integer.class).single();}

四、插入数据

可以使用 JdbcClient 的 update 方法进行数据的插入和更新。

通过占位符参数插入数据:

public Integer insertDataWithParam(MyData myData) {Integer rowsAffected = jdbcClient.sql("insert into my_data values(?,?) ").param(myData.id()).param(myData.name()).update();return rowsAffected;}

通过命名参数插入数据:

public Integer insertDataWithNamedParam(MyData myData) {Integer rowsAffected = jdbcClient.sql("insert into my_data values(:id,:name) ").param("id", myData.id()).param("name", myData.name()).update();return rowsAffected;}

直接插入整个对象:

public Integer insertDataWithObject(MyData myData) {Integer rowsAffected = jdbcClient.sql("insert into my_data values(:id,:name) ").paramSource(myData).update();return rowsAffected;}

五、总结

通过上述的示例,可以看到基本的数据库操作都可以用 JdbcClient 实现,避免了复杂的ORM框架的使用,切操作要比ORM框架简单灵活的多。fluent API 的风格也更容易编写和阅读。

完整的数据库操作方法的调用演示:

@Slf4j
@SpringBootApplication
public class Application implements CommandLineRunner {@Autowiredprivate DbService dbService;@Overridepublic void run(String... args) {MyData myData = new MyData(1L, "test");log.info("insert rows: {}", dbService.insertDataWithObject(myData));MyData myData2 = new MyData(2L, "test");dbService.insertDataWithParam(myData2);MyData myData3 = new MyData(3L, "author");dbService.insertDataWithNamedParam(myData3);log.info("findDataById: {}", dbService.findDataById(1L));log.info("findDataByName: {}", dbService.findDataByName("test"));log.info("findDataWithRowMapper: {}", dbService.findDataWithRowMapper());log.info("findDataByParamMap: {}", dbService.findDataByParamMap(Map.of("name", "author")));log.info("countByName: {}", dbService.countByName("test"));}public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

http://www.ppmy.cn/news/1244847.html

相关文章

CMAKE的学问

cmake&#xff1a;指定install的安装目录 在执行 cmake 命令时指定 cmake -DCMAKE_INSTALL_PREFIX<你想要安装的路径>在CMakeLists.txt设置 CMAKE_INSTALL_PREFIX 变量 SET(CMAKE_INSTALL_PREFIX <install_path>) INSTALL(TARGETS test DESTINATION bin)要加在PR…

python:使用for循环与while循环打印九九乘法表

python&#xff1a;使用for循环与while循环打印九九乘法表 在编程中&#xff0c;for循环和while循环是两种常用的循环结构&#xff0c;它们可以用来实现各种不同的功能和逻辑。其中&#xff0c;九九乘法表是一个经典的例子&#xff0c;可以用来展示for循环和while循环的使用方…

数据资产入表在即,企业要从数据治理入手

数据是驱动数字经济发展的核心生产要素&#xff0c;数据资产化是释放数据要素价值的重要方式。2024年1月1日&#xff0c;《企业数据资源相关会计处理暂行规定》将正式实施。企业数据资产入表已进入倒计时&#xff0c;企业作如何充分发挥海量规模数据和应用场景等优势&#xff0…

qInstallMessageHandler的学习

背景&#xff1a;需要做一个日志系统。 把信息重定向到txt文件中。 参考&#xff1a; QT 调试信息如何输出到文件&#xff08;qDebug/qWarning/qCritical/qFatal&#xff09;-CSDN博客 Qt 之 qInstallMessageHandler&#xff08;重定向至文件&#xff09;-CSDN博客 demo…

Gitee上传代码教程

1. 本地安装git 官网下载太慢&#xff0c;我们也可以使用淘宝镜像下载&#xff1a;CNPM Binaries Mirror 安装成功以后电脑会有Git Bush标识&#xff0c;空白处右键也可查看。 2. 注册gitee账号&#xff08;略&#xff09; 3. 创建远程仓库 4. 上传代码 4.1 在项目文件目录…

WEB渗透—反序列化(七)

Web渗透—反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩哔_…

【腾讯云云上实验室】向量数据库+LangChain+LLM搭建智慧辅导系统实践

目录 一、搭建智慧辅导系统——向量数据库实践指南1.1、创建向量数据库并新建集合1.2、使用 TKE 快速部署 ChatGLM1.3、部署 LangChain PyPDFVectorDB等组件1.4、配置知识库语料1.5、基于 VectorDB LLM 的智能辅导助手 二、LLM时代的次世代引擎——向量数据库2.1、向量数据库L…

MySQL-03-索引

索引是提高MySQL查询性能的一个重要途径&#xff0c;但过多的索引可能会导致过高的磁盘使用率以及过高的内存占用&#xff0c;从而影响应用程序的整体性能。应当尽量避免事后才想起添加索引&#xff0c;因为事后可能需要监控大量的SQL才能定位到问题所在&#xff0c;而且添加索…