前言
SpringBoot 3.2 引入了JdbcClient API组件,该组件用于数据库操作,实际上JdbcClient是在JdbcTemplate的基础上进行了一层封装。
SpringBoot 3.2推出了新的JdbcClient用于数据库操作,JdbcClient对JdbcTemplate进行了封装,并采用了fluent API风格,使得可以进行链式调用。
自此,Spring框架自带的数据库操作方式增加到了四种。
JdbcTemplate
JdbcClient
SpringDataJdbc
SpringDataJpa
对于那些不适合采用复杂ORM框架,或者需要手动编写精细SQL语句的场景,可以选择使用JdbcClient来直接操作数据库。但需要注意的是,JdbcClient目前并不支持数据的批量处理以及存储过程的调用。在这些特定需求下,就需要转而使用JdbcTemplate。
JdbcClient是一个轻量级的数据库操作工具,它采用了fluent API的设计风格,使得操作既简单又灵活,同时代码更加易于阅读和维护,完全支持用户编写复杂的SQL语句。
代码示例
引入 JDBCCLIENT
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
直接在Service中注入JdbcClient
@Component
public class DbService {
@Autowired
private 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();
}
同时dbcClient也支持按照参数名进行数据查询
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 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框架来说更为简单且灵活。JdbcClient所采用的fluent API风格也使得编写和阅读代码变得更加容易。
完整的数据库操作方法示例方法:
@Slf4j
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
private DbService dbService;
@Override
public 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);
}
}