MybatisPlus(SpringBoot版)學習第五講:條件構造器和常用接口

目錄

1.wrapper介紹

2.QueryWrapper

2.1 例1:組轉查詢條件

Compare

Nested

Join

Func

?2.2 例2:組裝排序條件

?2.3 例3:組裝刪除條件

?2.4 例4:條件的優先級

2.5 例5:組裝select子句

?2.6 例6:實現子查詢

3.UpdateWrapper

4.Condition

4.1 思路一

4.2 思路二:

5.LambdaQueryWrapper?

6.LambdaUpdateWrapper


1.wrapper介紹

Wrapper?: 條件構造抽象類,最頂端父類

???????AbstractWrapper?: 用于查詢條件封裝,生成 sql?的 where?條件

??? ????????QueryWrapper?: 查詢條件封裝

??? ????????UpdateWrapper?:?Update?條件封裝

??? ????????AbstractLambdaWrapper?: 使用Lambda?語法

?? ?????????????????LambdaQueryWrapper?:用于Lambda語法使用的查詢Wrapper

?? ? ????????????????LambdaUpdateWrapper?:?Lambda?更新封裝Wrapper

ctrl+h


2.QueryWrapper

2.1 例1:組轉查詢條件

/**** 按查詢條件組裝*/
@Test
public void test01(){QueryWrapper<People> queryWrapper=new QueryWrapper<>();//SELECT id,username AS name,age,email,is_deleted// FROM t_people// WHERE is_deleted=0 AND (username LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)queryWrapper.like("username","a").between("age",20,30).isNotNull("email");List<People> list=peopleMapper.selectList(queryWrapper);list.forEach(System.out::println);
}

QueryWrapper繼承AbstractWrapper,我們點擊AbstractWrapper進去看看。?

????????我們能看到AbstrackWrapper實現了這四個接口。

Compare

  • 作用:用于構建比較條件,比如等于(eq)、不等于(ne)、大于(gt)、小于(lt)等條件。在構建 SQL 查詢條件時,可用來描述實體屬性和具體值之間的比較關系 。

Nested

  • 作用:用于構建嵌套查詢條件,當需要在查詢條件中添加括號包裹的子條件時會用到。可以讓查詢條件的邏輯結構更清晰,實現復雜的條件組合。

Join

  • 作用:主要用于處理 SQL 的連接操作,比如內連接(INNER JOIN)、左連接(LEFT JOIN)等。在多表查詢場景下,通過它來定義表與表之間的連接關系。

Func

  • 作用:是一個函數式接口,通常用于封裝一些可復用的條件構建邏輯。可以將條件構建的代碼塊作為參數傳遞,方便代碼的復用和邏輯組織。

????????我們能夠看到,他們都是默認的方法, 繼承他的類可以直接使用這個方法,也可以進行重寫。同IService原碼

?2.2 例2:組裝排序條件

/**** 按排序組裝*/
@Test
public void test02(){QueryWrapper<People> queryWrapper=new QueryWrapper<>();queryWrapper.orderByDesc("age").orderByAsc("id");List<People> list=peopleMapper.selectList(queryWrapper);list.forEach(System.out::println);
}

?2.3 例3:組裝刪除條件

/**** 組裝刪除條件*/
@Test
public void test03(){QueryWrapper<People> queryWrapper=new QueryWrapper<>();queryWrapper.isNull("email");int result=peopleMapper.delete(queryWrapper);System.out.println("受影響的行數:"+result);
}

?2.4 例4:條件的優先級

/**** 優先級*/
@Test
public void test04(){QueryWrapper<People> queryWrapper=new QueryWrapper<>();//UPDATE t_people SET age=?, email=? // WHERE is_deleted=0 AND (username LIKE ? AND age > ? OR email IS NULL)queryWrapper.like("username", "a").gt("age", 20).or().isNull("email");People people=new People();people.setAge(18);people.setEmail("people@qcby.com");int result=peopleMapper.update(people,queryWrapper);System.out.println("受影響的行數:" + result);
}

?lambda表達式里的邏輯優先算法

/**** lambda表達式里的邏輯優先算法*/
@Test
public void test05(){QueryWrapper<People> queryWrapper=new QueryWrapper<>();//UPDATE t_people SET age=?, email=?// WHERE is_deleted=0 AND (username LIKE ? AND (age > ? OR email IS NULL))queryWrapper.like("username",'a').and(i ->i.gt("age",20).or().isNull("email"));People people=new People();people.setAge(18);people.setEmail("people@qcby.com");int result=peopleMapper.update(people,queryWrapper);System.out.println("受影響的行數:" + result);
}

2.5 例5:組裝select子句

/**** 組裝select語句*/
@Test
public void test06(){//查詢用戶信息的username和age字段//SELECT username,age FROM t_peopleQueryWrapper<People> queryWrapper=new QueryWrapper<>();queryWrapper.select("username","age");//selectMaps()返回Map集合列表,通常配合select()使用,// 避免People對象中沒有被查詢到的列值 為nullList<Map<String,Object>> maps=peopleMapper.selectMaps(queryWrapper);maps.forEach(System.out::println);
}

?2.6 例6:實現子查詢

/**** 實現子查詢*/
@Test
public void test07(){//SELECT id,username AS name,age,email,is_deleted FROM t_people // WHERE is_deleted=0 AND (id IN (select id from t_people where id<=3))QueryWrapper<People> queryWrapper=new QueryWrapper<>();queryWrapper.inSql("id","select id from t_people where id<=3");List<People> list=peopleMapper.selectList(queryWrapper);list.forEach(System.out::println);
}


3.UpdateWrapper

/**** UpdateWrapper*/
@Test
public void test08(){//將(年齡大于20或郵箱為null)并且用戶名中包含有a的用戶信息修改//組裝set子句以及修改條件UpdateWrapper<People> updateWrapper=new UpdateWrapper<>();//lambda表達式內的邏輯優先運算updateWrapper.set("age", 18).set("email", "user@qcby.com").like("username", "a").and(i -> i.gt("age", 20).or().isNull("email"));//UPDATE t_people SET age=?,email=?// WHERE is_deleted=0 AND// (username LIKE ? AND (age > ? OR email IS NULL))int result = peopleMapper.update(null, updateWrapper);System.out.println(result);
}

????????Lambda 表達式是 Java 8 引入的一個新特性,它可以讓你以更簡潔的方式表示一個匿名函數。

????????在這個例子中,i -> i.gt("age", 20).or().isNull("email")?表示一個接受一個參數?i,并對其進行一系列操作的函數。?

????????參數?i?通常是 MyBatis-Plus 中的?QueryWrapper?或者?UpdateWrapper?對象,它們用于構建 SQL 查詢或者更新語句的條件部分。


4.Condition

????????在真正開發的過程中,組裝條件是常見的功能,而這些條件數據來源于用戶輸入,是可選的,因?此我們在組裝這些條件時,必須先判斷用戶是否選擇了這些條件,若選擇則需要組裝該條件,若?沒有選擇則一定不能組裝,以免影響SQL執行的結果

4.1 思路一

使用StringUtils的前提

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version>
</dependency>
@Test
public void test09(){//定義查詢條件,有可能為null(用戶未輸入或未選擇)String username=null;Integer ageBegin = 10;Integer ageEnd = 24;QueryWrapper<People> queryWrapper = new QueryWrapper<>();//StringUtils.isNotBlank()判斷某字符串是否不為空且長度不為0且不由空白符(whitespace) 構成if(StringUtils.isNotBlank(username)){queryWrapper.like("username","a");}if(ageBegin != null){queryWrapper.ge("age", ageBegin);}if(ageEnd != null){queryWrapper.le("age", ageEnd);}//SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (age >= ? AND age <= ?)List<People> peoples = peopleMapper.selectList(queryWrapper);peoples.forEach(System.out::println);
}

4.2 思路二:

????????上面的實現方案沒有問題,但是代碼比較復雜,我們可以使用帶condition參數的重載方法構建查?詢條件,簡化代碼的編寫

@Test
public void test09UseCondition(){//定義查詢條件,有可能為null(用戶未輸入或未選擇)String username = null;Integer ageBegin = 10;Integer ageEnd = 24;QueryWrapper<People> queryWrapper = new QueryWrapper<>();
//StringUtils.isNotBlank()判斷某字符串是否不為空且長度不為0且不由空白符(whitespace) 構成queryWrapper.like(StringUtils.isNotBlank(username), "username", "a").ge(ageBegin != null, "age", ageBegin).le(ageEnd != null, "age", ageEnd);
//SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (age >= ? AND age <= ?)List<People> peoples = peopleMapper.selectList(queryWrapper);peoples.forEach(System.out::println);
}


5.LambdaQueryWrapper?

?

    /**** LambdaQueryWrapper*/@Testpublic void test10() {
//定義查詢條件,有可能為null(用戶未輸入)String username = "a";Integer ageBegin = 10;Integer ageEnd = 24;LambdaQueryWrapper<People> queryWrapper = new LambdaQueryWrapper<>();
//避免使用字符串表示字段,防止運行時錯誤queryWrapper.like(StringUtils.isNotBlank(username), People::getName, username).ge(ageBegin != null, People::getAge, ageBegin).le(ageEnd != null, People::getAge, ageEnd);//SELECT id,username AS name,age,email,is_deleted FROM t_people // WHERE is_deleted=0 AND (username LIKE ? AND age >= ? AND age <= ?)List<People> peoples = peopleMapper.selectList(queryWrapper);peoples.forEach(System.out::println);}

????????在 Java 里,People::getAge?屬于方法引用的一種形式。方法引用是 Java 8 引入的特性,它能夠讓你直接引用已有的方法,而無需顯式調用該方法。一般用于 Lambda 表達式能使用的地方,從而讓代碼更簡潔。?


6.LambdaUpdateWrapper

/**** 使用LambdaUpdateWrapper*/
@Test
public void test11(){LambdaUpdateWrapper<People> updateWrapper=new LambdaUpdateWrapper<>();//UPDATE t_people SET age=?, age=?,email=? WHERE is_deleted=0 AND (username LIKE ? AND (age < ? OR email IS NULL))updateWrapper.set(People::getAge,18).set(People::getEmail,"people@qcby.com").like(People::getName,"a").and(i ->i.lt(People::getAge,24).or().isNull(People::getEmail));//lambda 表達式內的邏輯優先運算People people=new People();int result=peopleMapper.update(people,updateWrapper);System.out.println("受影響的行數:" + result);
}

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74724.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74724.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74724.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OkHttp 的證書設置

在 Android 開發中&#xff0c;通過 OkHttp 自定義 SSLSocketFactory 和 X509TrustManager 可以有效增強 HTTPS 通信的安全性&#xff0c;防止中間人攻擊&#xff08;如抓包工具 Charles/Fiddler 的攔截&#xff09;。以下是實現防抓包的關鍵技術方案&#xff1a; 一、Okhttp設…

計算機視覺算法實戰——手術導航:技術、應用與未來

?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連? ??? ????????? ?? 1. 手術導航中的計算機視覺&#xff1a;領域介紹 計算機視覺在手術導航領域的應用代表了現代醫學與人工智…

【科研繪圖系列】R語言繪制PCA與變量的相關性散點圖(scatter plot)

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹加載R包數據下載導入數據畫圖輸出圖片系統信息介紹 【科研繪圖系列】R語言繪制PCA與變量的相關性散點圖(scatter plot) 加載R包 library(tidyverse) library(ggpubr)數據下載 …

深度解析Spring Boot可執行JAR的構建與啟動機制

一、Spring Boot應用打包架構演進 1.1 傳統JAR包與Fat JAR對比 傳統Java應用的JAR包在依賴管理上存在明顯短板&#xff0c;依賴項需要單獨配置classpath。Spring Boot創新的Fat JAR&#xff08;又稱Uber JAR&#xff09;解決方案通過spring-boot-maven-plugin插件實現了"…

安科瑞微電網能量管理控制箱,光伏發電的守護者

安科瑞顧強 隨著工業的發展&#xff0c;很多用電設備和工廠設備采用直流系統供電&#xff0c;直流系統的正極和負極不接地。對于不接地&#xff08;IT&#xff09;配電系統&#xff0c;應該進行絕緣電阻的監控以保證供電系統的安全運行。 AIM-D100-TS 系列直流絕緣監測儀可以…

[計算機網絡]網絡I/O模型

歡迎來到啾啾的博客&#x1f431;。 這是一個致力于構建完善的Java程序員知識體系的博客&#x1f4da;&#xff0c;記錄學習的點滴&#xff0c;分享工作的思考、實用的技巧&#xff0c;偶爾也分享一些雜談&#x1f4ac;。 歡迎評論交流&#xff0c;感謝您的閱讀&#x1f604;。…

Vue中使用JsonView進行JSON數據展示

前言 最近在開發公司的管理系統的操作日志模塊&#xff0c;要查看某條操作日志的請求參數&#xff0c;要將請求的參數以 JSON 格式的形式展示出來&#xff0c;于是用到了Vue-JSON-Viewer 這個插件。 一、Vue-JSON-Viewer 基礎入門 插件簡介 Vue-JSON-Viewer 是一個用于在Vue項…

vue vue3 走馬燈Carousel

背景&#xff1a; 在項目中需要展示多張圖片&#xff0c;但在頁面上只有一張圖片的有限位置&#xff0c;此時考慮使用輪播圖實現多張圖片的展示。element組件官網有走馬燈Carousel的組件詳細介紹。 實現效果&#xff1a; 官網鏈接&#xff1a;點擊跳轉 核心代碼&#xff1a; …

重學vue3(三):vue3基本語法及使用

組合式 API是vue3 的核心特性&#xff0c;替代 Vue2 的選項式 API&#xff0c;強調邏輯復用和代碼組織。基本語法如下&#xff1a; <script setup> import { ref, reactive, computed, onMounted } from vue;// 1. 響應式數據 const count ref(0); // 基本類…

Spring Boot分布式項目異常處理實戰:從崩潰邊緣到優雅恢復

當單體應用拆分成分布式系統&#xff0c;異常就像被打開的潘多拉魔盒&#xff1a;RPC調用超時、分布式事務雪崩、第三方接口突然罷工…在最近的電商大促中&#xff0c;我們的系統就經歷了這樣的至暗時刻。本文將用真實代碼示例&#xff0c;展示如何構建分布式異常處理體系。 一…

導出sql命令

除了之前提到的 \G 命令&#xff0c;以下是其他優化 MySQL 查詢結果顯示的方法&#xff0c;供你參考&#xff1a; --- ### 1. **使用 \T 命令導出結果到文件** - 在 MySQL 命令行中&#xff0c;使用 \T 文件名 可以將查詢結果以表格形式導出到指定文件&#xff0c;便于后續…

TDengine 3.3.2.0 集群報錯 Post “http://buildkitsandbox:6041/rest/sql“

原因&#xff1a; 初始化時處于內網環境下&#xff0c;Post “http://buildkitsandbox:6041/rest/sql“ 無法訪問 修復&#xff1a; vi /etc/hosts將buildkitsandbox映射為本機節點 外網環境下初始化時沒有該問題

深度解析 BPaaS:架構、原則與研發模式探索

在當今復雜多變的業務環境下&#xff0c;軟件開發面臨著諸多挑戰&#xff0c;如何有效地管理業務復雜性并實現系統的可擴展性成為關鍵。BPaaS應運而生&#xff0c;它作為一種創新的理念和架構模式&#xff0c;改變著企業研發的方式。本文將深入探討 BPaaS 是什么&#xff0c;以…

如何在linux中部署dns服務 主備dns (詳細全過程)

環境centos 7.9 主DNS&#xff1a;192.168.60.131 備DNS&#xff1a;192.168.60.134 我以 chenxingyu0.com 指向 192.168.60.200為例 首先是主dns #!/bin/bash# 檢查是否為 root 用戶 if [ "$(id -u)" ! "0" ]; thenecho "請使用…

操作系統導論——第13章 抽象:地址空間

一、早期系統 從內存來看&#xff0c;早期的機器并沒有提供多少抽象給用戶。基本上&#xff0c;機器的物理內存如圖13.1所示 操作系統曾經是一組函數&#xff08;實際上是一個庫&#xff09;&#xff0c;在內存中&#xff08;在本例中&#xff0c;從物理地址0開始&#xff09;&…

云端存儲新紀元:SAN架構驅動的智能網盤解決方案

一、企業存儲的"不可能三角"破局 1.1 傳統存儲架構的困局 性能瓶頸&#xff1a;NAS架構在1000并發訪問時延遲飆升300%容量限制&#xff1a;傳統RAID擴容需停機維護&#xff0c;PB級存儲擴展耗時超48小時成本矛盾&#xff1a;全閃存陣列每TB成本高達$3000&#xff0…

Android adb自身調試log開關

本文介紹下如何打開adb源碼中的debug log 1.adb源碼log是可以動態打開和關閉的&#xff0c;控制邏輯代碼如下 static NoDestructor<std::mutex> log_mutex; static NoDestructor<CachedProperty> log_property GUARDED_BY(log_mutex)("debug.adbd.logging&q…

Axure RP 9.0教程: 基于動態面板的元件跟隨來實現【音量滑塊】

文章目錄 引言I 音量滑塊的實現步驟添加底層邊框添加覆蓋層基于覆蓋層創建動態面板添加滑塊按鈕設置滑塊拖動效果引言 音量滑塊在播放器類APP應用場景相對較廣,例如調節視頻的亮度、聲音等等。 I 音量滑塊的實現步驟 添加底層邊框 在畫布中添加一個矩形框:500 x 32,圓…

rocky linux 與centos系統的區別

Rocky Linux 和 CentOS 都是基于 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的社區發行版&#xff0c;但兩者在目標定位、更新策略和社區管理上有顯著差異。以下是核心區別的詳細對比&#xff1a; 一、背景與定位 特性Rocky LinuxCentOS起源由 CentOS 聯合創始人…

洛谷題單1-B2002 Hello,World!-python-流程圖重構

題目描述 編寫一個能夠輸出 Hello,World! 的程序。 提示&#xff1a; 使用英文標點符號&#xff1b;Hello,World! 逗號后面沒有空格。H 和 W 為大寫字母。 輸入格式 無 輸出格式 無 輸入輸出樣例 #1 輸入 #1 無輸出 #1 Hello,World!方式-print() 代碼 class Solut…