MybatisPlus-05.核心功能-條件構造器

一.條件構造器

我們前面使用的MP功能主要是根據id進行操作的,并未涉及到復雜查詢。而根據id所進行的增刪改查操作在MP中都有直接的封裝。但是遇到復雜的查詢條件時,如何使用MP進行操作是我們要考慮的問題。因此MP為我們提供了條件構造器。

在BaseMapper接口中有很多Wrapper接口。這些Wrapper接口就是用來指定復雜查詢條件的。AbstractWrapper中實現了很多復雜條件的sql語句查詢。

eq:等于。ne:不等于。gt:大于。ge:大于等于。lt:小于。le:小于等于。like:模。也就是說復雜的where條件AbstractWrapper都能幫助我們構造。

我們關注下面的兩個子類UpdateWrapper和QueryWrapper。這兩個子類除了繼承AbstractWrapper,也可以構造復雜where語句外,在此基礎上擴展了相關的功能。如QueryWrapper用于查詢時,不僅可以用來構建復雜where語句,還可以進行select功能,指定要查詢的select字段(select column1, column2 ...?from ... where ...)。

?UpdateWrapper擴展了set部分,除了可以定義復雜where語句外,還可以設置set語句條件。可以使用setSql,在該方法里面使用字符串編寫set條件,直接拼入sql語句中。

這個在特殊場景下會用到,但比較少見。

綜上,UpdateWrapper和QueryWrapper就是在AbstractWrapper的基礎上做了拓展。

除了這些還有對應的Lambda,這些LambdaUpdateWrapper和LambdaQueryWrapper功能上與上面的一樣,只是使用了Lambda表達式。

二.案例演示

1.QueryWrapper

  @Testvoid testQueryByQueryWrapper() {QueryWrapper<User> queryWrapper = new QueryWrapper<User>().select("id","username","info","balance").like("username","o").ge("balance",1000);userMapper.selectList(queryWrapper);}// 將Jack的余額設置為2000@Testvoid testUpdateByQueryWrapper() {// 1.要更新的數據User user = new User();user.setBalance(2000);// 2.更新的條件QueryWrapper<User> queryWrapper = new QueryWrapper<User>().eq("username","Jack");// 3.執行更新userMapper.update(user,queryWrapper);}

QueryWrapper可以支持鏈式編程,在第一個演示案例中我們除了定義復雜的查詢語句外,還使用QueryWrapper來指定要查詢的字段。通過其中的select方法來指定。

在第二個演示案例中我們要指定更新的數據,即創建一個User對象并將余額設置為2000。然后使用QueryWrapper來定義復雜的查詢語句并執行更新。

因為是查詢語句,且查詢出來的是一個列表,因此使用selectList進行查詢。并將QueryWrapper對象傳入。

2.UpdateWrapper

void testUpdateQuery() {List<Long> ids = List.of(1L,2L,4L);// 1.構造Wrapper對象UpdateWrapper<User> updateWrapper = new UpdateWrapper<User>().setSql("balance = balance - 200").in("id",ids);// 2.執行更新操作。由于這次每個用戶余額均不相同,因此無法創建對象來指定余額值,且每個用戶余額不同,因此要使用updateWrapper的setSql動態拼接sql語句,且在updateWrapper中指定要操作的數據類型userMapper.update(null,updateWrapper);}

這個情況比較特殊,由于這次每個用戶余額均不相同,因此無法創建對象來指定余額值,且每個用戶余額不同,因此要使用updateWrapper的setSql動態拼接sql語句,且在updateWrapper中指定要操作的數據類型。

sql語句要使用in,因此要構建一個集合來封裝id。

在這里由于是根據不同User動態更新,因此使用setSql指定更新條件為balance = balance - 200。

三.Lambda表達式

我們上邊的代碼在指定字段時都是硬編碼,即直接將字段名寫死。這樣不好因此我們要使用軟編碼。這就要使用Lambda表達式。

// 查詢出名字帶o的,存款大于等于1000元的id,username,info,balance字段@Testvoid testLambdaQueryByQueryWrapper() {LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<User>().select(User::getId,User::getUsername,User::getInfo,User::getBalance).like(User::getUsername,"o").ge(User::getBalance,1000);userMapper.selectList(queryWrapper);}// 將Jack的余額設置為2000@Testvoid testUpdateByLambdaQueryWrapper() {// 1.要更新的數據User user = new User();user.setBalance(2000);// 2.更新的條件LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<User>().eq(User::getBalance,"Jack");// 3.執行更新userMapper.update(user,queryWrapper);}// 將用戶id為1,2,4的用戶余額減200@Testvoid testLambdaUpdateQuery() {List<Long> ids = List.of(1L,2L,4L);// 1.構造Wrapper對象LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<User>().setSql("balance = balance - 200").in(User::getId,ids);// 2.執行更新操作。由于這次每個用戶余額均不相同,因此無法創建對象來指定余額值,且每個用戶余額不同,因此要使用updateWrapper的setSql動態拼接sql語句,且在updateWrapper中指定要操作的數據類型userMapper.update(null,updateWrapper);}

使用Lambda表達式,將字段換為查詢對象::get方法,利用反射來獲取字段。

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

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

相關文章

ES6從入門到精通:常用知識點

變量聲明ES6引入了let和const替代var。let用于聲明可變的塊級作用域變量&#xff0c;const用于聲明不可變的常量。塊級作用域有效避免了變量提升和污染全局的問題。let name Alice; const PI 3.1415;箭頭函數箭頭函數簡化了函數寫法&#xff0c;且自動綁定當前上下文的this值…

51單片機教程(十一)- 單片機定時器

11、單片機定時器 項目目標 通過定時器/計數器實現流水燈控制。知識要點 定時器的結構。TMOD和TCON;定時/計數器工作方式;定時/計數器編程步驟;1、項目分析 前面的流水燈的時間控制通過空循環語句來實現,定時不是很精確。本章通過用定時器來控制流水燈任務可以實現精確的時…

基于opencv的疲勞駕駛監測系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業多年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

Vue 2 和 Vue 3 區別

1. 響應式系統原理 Vue 2&#xff1a;利用Object.defineProperty()實現屬性攔截。存在局限性&#xff0c;無法自動監測對象屬性增減&#xff0c;需用Vue.set/delete&#xff1b;數組變異方法要重寫&#xff1b;深層對象遞歸轉換性能差。Vue 3&#xff1a;采用 ES6 Proxy代理對…

mv重命名報錯:-bash:syntax error near unexpected token ‘(‘

文章目錄 一、報錯背景二、解決方法2.1、方法一&#xff1a;文件名加引號2.2、方法二&#xff1a;特殊字符前加\進行轉義 一、報錯背景 在linux上對一文件執行重命名時報錯。原因是該文件名包含空格與括號。 文件名如下&#xff1a; aa &#xff08;1).txt執行命令及報錯如下…

AWS 開源 Strands Agents SDK,簡化 AI 代理開發流程

最近&#xff0c;亞馬遜網絡服務&#xff08;AWS&#xff09;宣布推出 Strands Agents(https://github.com/strands-agents/sdk-python)&#xff0c;這一開源軟件開發工具包&#xff08;SDK&#xff09;采用模型驅動的方法&#xff0c;助力開發者僅用數行代碼即可構建并運行人工…

利用 AI 打造的開發者工具集合

如圖. 我利用 AI 開發了這個網站花了半個小時. 目前就上了 四個 我想到的工具。 大家可以自行體驗下&#xff1a;https://xiaojinzi123.github.io 本文并不是宣傳什么產品. 只是感概 Ai 真的改變我的工作方式啊. 雖然現在 AI 對于一些已有的項目進行更改代碼. 由于不了解業務,…

[自然語言處理]計算語言的熵

一、要求利用給定的中英文語料&#xff0c;分別計算英語字母、英語單詞、漢字、漢語詞的熵&#xff0c;并和已公開結果比較&#xff0c;思考漢語的熵對漢語編碼和處理的影響。二、實驗內容2.1 統計英文語料的熵1.代碼(1)計算英文字母的熵import math #計算每個英文字母的熵 def…

如何處理“協議異常”錯誤

在Java中&#xff0c;“協議異常”通常是指在網絡通信或者處理特定協議相關操作時出現的異常。以下是一些處理“協議異常”錯誤的方法&#xff1a;一、理解協議異常的類型和原因HTTP協議異常原因&#xff1a;在進行HTTP通信時&#xff0c;可能會因為請求格式錯誤、響應狀態碼異…

Spark 4.0的VariantType 類型以及內部存儲

背景 本文基于Spark 4.0 總結 Spark中的 VariantType 類型,用盡量少的字節來存儲Json的格式化數據 分析 這里主要介紹 Variant 的存儲,我們從VariantBuilder.buildJson方法(把對應的json數據存儲為VariantType類型)開始: public static Variant parseJson(JsonParser …

跨越十年的C++演進:C++20新特性全解析

跨越十年的C演進系列&#xff0c;分為5篇&#xff0c;本文為第四篇&#xff0c;后續會持續更新C23~ 前3篇如下&#xff1a; 跨越十年的C演進&#xff1a;C11新特性全解析 跨越十年的C演進&#xff1a;C14新特性全解析 跨越十年的C演進&#xff1a;C17新特性全解析 C20標準…

LeetCode--40.組合總和II

前言&#xff1a;如果你做出來了39題&#xff0c;但是遇到40題就不會做了&#xff0c;那我建議你去再好好縷清39題的思路&#xff0c;再來看這道題&#xff0c;會有種豁然開朗的感覺解題思路&#xff1a;這道題其實與39題基本一致&#xff0c;所以本次題解是借著39題為基礎來講…

Docker Desktop 安裝到D盤(包括鏡像下載等)+ 漢化

目錄 一、 開啟電腦虛擬化 1. 搜索并打開控制面板 2. 點擊程序 3. 點擊啟用或關閉 Windows 功能 4. 打開相關功能 5. 沒有Hyper-V的情況&#xff1a; 二、配置環境 1. 更新 WSL 到最新版 2. 設置 WSL 2為默認版本 3. 安裝 Ubuntu 三. WSL 遷移到D盤 1. 停止運行wsl…

基于 OpenCV 的圖像 ROI 切割實現

一、引言 在計算機視覺領域&#xff0c;我們經常需要處理各種各樣的圖像數據。有時候&#xff0c;我們只對圖像中的某一部分區域感興趣&#xff0c;例如在一張人物照片中&#xff0c;我們可能只關注人物的臉部。在這種情況下&#xff0c;將我們感興趣的區域從整個圖像中切割出…

Linux操作系統01

一、操作系統簡史 二、Linux誕生與分支 三、Linux內核與發行版 內核版本號&#xff1a;cat /proc/version 、 u name -a 操作系統內核漏洞 【超詳細】CentOS編譯安裝升級新內核_centos源碼編譯安裝新版本內核 ntfs-CSDN博客 四、虛擬機 五、Docker容器技術 典型靶場集成環境…

Chrome 下載文件時總是提示“已阻止不安全的下載”的解決方案

解決 Chrome 谷歌瀏覽器下載文件時提示“已阻止不安全的下載”的問題。 ? 前言 最近更新 Chrome 后&#xff0c;下載文件時總是提示“已攔截未經驗證的下載內容”、“已阻止不安全的下載”&#xff1a; ? 身為一個互聯網沖浪高手&#xff0c;這些提醒非常沒有必要&#x…

RocketMQ延遲消息是如何實現的?

RocketMQ的延遲消息實現機制非常巧妙&#xff0c;其核心是通過多級時間輪 定時任務 消息重投遞來實現的。以下是詳細實現原理&#xff1a; ? 一、延遲消息的核心設計 預設延遲級別&#xff08;非任意時間&#xff09; RocketMQ不支持任意時間延遲&#xff0c;而是預設了18個…

D3 面試題100道之(21-40)

這里是D3的面試題,我們從第 21~40題 開始逐條解答。一共100道,陸續發布中。 ?? 面試題(第 21~40 題) 21. D3 中的數據綁定機制是怎樣的? D3 的數據綁定機制通過 selection.data() 方法實現。它將數據數組與 DOM 元素進行一一對應,形成三種狀態: Update Selection:已…

PyTorch nn.Parameter理解及初始化方法總結

一、理解 nn.Parameter 本質是什么&#xff1f; nn.Parameter 是 torch.Tensor 的一個子類。這意味著它繼承了 Tensor 的所有屬性和方法&#xff08;如 .data, .grad, .requires_grad, .shape, .dtype, .device, .backward() 等&#xff09;。它本身不是一個函數或模塊&#xf…

【Linux】環境基礎和開發工具

Linux 軟件包管理器 yum 什么是軟件包 在Linux下安裝軟件, 一個通常的辦法是下載程序的源代碼, 并進行編譯, 得到可執行程序. 但是這樣太麻煩了, 于是有些人把一些常用的軟件提前編譯好, 做成軟件包(可以理解成windows上的安裝程序)放在一個服務器上, 通過包管理器可以很方便…