<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          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+小伙伴加入


                
                   

          1. 我的私密學(xué)習(xí)小圈子~

          2. Lombok 同時使用 @Data 和 @Builder 的巨坑,千萬別亂用!

          3. 你的編程能力從什么時候開始突飛猛進?一個騰訊小哥哥是這樣回答的!

          4. 好好寫簡歷吧!這簡歷一看就是包裝的?。?/a>

          最近面試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)在你的訂閱列表里。

          “在看”支持小哈呀,謝謝啦

          瀏覽 142
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久99久久99久久99人受 | 中文字幕无码视频在线观看 | 日日干日日爽日日舔日日草 | 日韩无码久久电影 | 青青草午夜|