网站设计公司建设网站,网站举报有奖平台,广州市比较大型的网站建设公司,电子商务网站建设花费SpringBoot 3.2引入了新的 JdbcClient 用户数据库操作#xff0c;JdbcClient对JdbcTemplate进行了封装#xff0c;采用了 fluent API 的风格#xff0c;可以进行链式调用。
自此#xff0c;spring自带的数据库操作有了4种方式#xff1a;JdbcTemplate、JdbcClient、Sprin…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 ListMyData 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 ListMyData findDataByParamMap(MapString, ? paramMap) {return jdbcClient.sql(select * from my_data where name :name).params(paramMap).query(MyData.class).list();}当查询返回的结果不能简单的映射到一个类时可以编写RowMapper适用于SQL语句比较复杂的场景
public ListMyData 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);}
}