Spring Boot 3.2 新特性:JdbcClient
共 10468字,需瀏覽 21分鐘
·
2024-07-29 15:30
來源:springcamp.cn/spring-boot-jdbc-client/
?? 歡迎加入小哈的星球,你將獲得: 專屬的項目實戰(zhàn) / 1v1 提問 / Java 學(xué)習(xí)路線 / 學(xué)習(xí)打卡 / 每月贈書 / 社群討論
新項目:《從零手?jǐn)]:仿小紅書(微服務(wù)架構(gòu))》 正在持續(xù)爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 點擊查看項目介紹; 《從零手?jǐn)]:前后端分離博客項目(全棧開發(fā))》 2期已完結(jié),演示鏈接:http://116.62.199.48/; 截止目前,累計輸出 50w+ 字,講解圖 2200+ 張,還在持續(xù)爆肝中.. 后續(xù)還會上新更多項目,目標(biāo)是將 Java 領(lǐng)域典型的項目都整一波,如秒殺系統(tǒng), 在線商城, IM 即時通訊,Spring Cloud Alibaba 等等,戳我加入學(xué)習(xí),解鎖全部項目,已有1800+小伙伴加入
![]()
-
一、概述 -
二、引入 JdbcClient -
三、查詢操作 -
四、插入數(shù)據(jù) -
五、總結(jié)
SpringBoot 3.2引入了新的 JdbcClient 用于數(shù)據(jù)庫操作,JdbcClient對JdbcTemplate進行了封裝,采用了 fluent API 的風(fēng)格,可以進行鏈?zhǔn)秸{(diào)用。
自此,spring自帶的數(shù)據(jù)庫操作有了4種方式:JdbcTemplate、JdbcClient、SpringDataJdbc、SpringDataJpa。
對于不適合使用復(fù)雜的ORM框架,或者需要編寫復(fù)雜的SQL的場景,可以使用JdbcClient自己編寫SQL來操作數(shù)據(jù)庫。不過JdbcClient不支持?jǐn)?shù)據(jù)的批量操作和存儲過程調(diào)用,對于這種情況就需要使用JdbcTemplate。
具體的代碼參照示例項目:https://github.com/qihaiyan/springcamp/tree/master/spring-data-jdbc-client
一、概述
JdbcClient是一個輕量的數(shù)據(jù)庫操作框架,采用 fluent API 風(fēng)格,簡單靈活,易于閱讀和維護,支持編寫復(fù)雜的SQL。
二、引入 JdbcClient
首先引入 spring-data-jdbc 依賴。
在 build.gradle 中增加一行代碼:
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
在Service中直接注入JdbcClient即可:
@Component
public class DbService {
@Autowired
private JdbcClient jdbcClient;
}
三、查詢操作
通過JdbcClient,可以按照主鍵查數(shù)據(jù),也可以按照自定義查詢條件查數(shù)據(jù)。
按照主鍵查數(shù)據(jù):
public MyData findDataById(Long id) {
return jdbcClient.sql("select * from my_data where id = ?")
.params(id)
.query(MyData.class)
.single();
}
按照自定義查詢條件查數(shù)據(jù):
public List<MyData> findDataByName(String name) {
return jdbcClient.sql("select * from my_data where name = ?")
.params(name)
.query(MyData.class)
.list();
}
以上兩種查詢方式,查詢條件中的變量使用的是占位符,JdbcClient也支持按照參數(shù)名進行查詢:
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;
}
當(dāng)參數(shù)比較多時,可以將參數(shù)放到一個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();
}
當(dāng)查詢返回的結(jié)果不能簡單的映射到一個類時,可以編寫RowMapper,適用于SQL語句比較復(fù)雜的場景:
public List<MyData> findDataWithRowMapper() {
return jdbcClient.sql("select * from my_data")
.query((rs, rowNum) -> new MyData(rs.getLong("id"), rs.getString("name")))
.list();
}
同時也支持查詢記錄數(shù):
public Integer countByName(String name) {
return jdbcClient.sql("select count(*) from my_data where name = ?")
.params(name)
.query(Integer.class)
.single();
}
四、插入數(shù)據(jù)
可以使用 JdbcClient 的 update 方法進行數(shù)據(jù)的插入和更新。
通過占位符參數(shù)插入數(shù)據(jù):
public Integer insertDataWithParam(MyData myData) {
Integer rowsAffected = jdbcClient.sql("insert into my_data values(?,?) ")
.param(myData.id())
.param(myData.name())
.update();
return rowsAffected;
}
通過命名參數(shù)插入數(shù)據(jù):
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;
}
五、總結(jié)
通過上述的示例,可以看到基本的數(shù)據(jù)庫操作都可以用 JdbcClient 實現(xiàn),避免了復(fù)雜的ORM框架的使用,切操作要比ORM框架簡單靈活的多。fluent API 的風(fēng)格也更容易編寫和閱讀。
完整的數(shù)據(jù)庫操作方法的調(diào)用演示:
@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);
}
}
?? 歡迎加入小哈的星球,你將獲得: 專屬的項目實戰(zhàn) / 1v1 提問 / Java 學(xué)習(xí)路線 / 學(xué)習(xí)打卡 / 每月贈書 / 社群討論
新項目:《從零手?jǐn)]:仿小紅書(微服務(wù)架構(gòu))》 正在持續(xù)爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 點擊查看項目介紹; 《從零手?jǐn)]:前后端分離博客項目(全棧開發(fā))》 2期已完結(jié),演示鏈接:http://116.62.199.48/; 截止目前,累計輸出 50w+ 字,講解圖 2200+ 張,還在持續(xù)爆肝中.. 后續(xù)還會上新更多項目,目標(biāo)是將 Java 領(lǐng)域典型的項目都整一波,如秒殺系統(tǒng), 在線商城, IM 即時通訊,Spring Cloud Alibaba 等等,戳我加入學(xué)習(xí),解鎖全部項目,已有1800+小伙伴加入
![]()
2. Lombok 同時使用 @Data 和 @Builder 的巨坑,千萬別亂用!
最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:點“在看”,關(guān)注公眾號并回復(fù) Java 領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
PS:因公眾號平臺更改了推送規(guī)則,如果不想錯過內(nèi)容,記得讀完點一下“在看”,加個“星標(biāo)”,這樣每次新文章推送才會第一時間出現(xiàn)在你的訂閱列表里。
點“在看”支持小哈呀,謝謝啦
