Mybatis-Plus中Wrapper條件構造器的使用

寫在前面

🛫更多知識總結見Mybatis-Plus專欄
🚕內容總結自尚硅谷楊博超老師的視頻
🚒博主對于該知識尚在學習階段
🚄如果發現存在問題請毫不吝嗇的指出
🚀🚀扎哇太棗糕的博客首頁🚀🚀

文章目錄

  • 1 queryWrapper構造器
    • 1.1 組裝刪改查條件
    • 1.2 條件優先級
    • 1.3 實現子查詢
  • 2 updateWrapper構造器
    • 2.1 升級修改方法(無需創建對象)
    • 2.2 實際開發時的應用
  • 3 lambdaXxxWrapper構造器
    • 3.1 lambdaQueryWrapper構造器
    • 3.2 lambdaUpdateWrapper構造器

Wrapper條件構造器
??條件構造器wrapper就是用來封裝CRUD方法參數條件的一個接口,其底層有很多的子類,最主要的就是最下面的四個子類:

  • queryWrapper可以用來刪改查
  • updateWrapper可以在修改操作時不必創建實體類對象的操作
  • LambdaQueryWrapper和LambdaUpdateWrapper則是在字段參數的調用上進行了升級,其他都一樣

因為增刪改查中的增加記錄不需要條件即可完成,所以增加方法無需條件構造器wrapper,其他的刪改查則是有這個條件構造器參數的
在這里插入圖片描述

1 queryWrapper構造器

1.1 組裝刪改查條件

組裝查詢條件
??查詢條件為:名字里包含a字母、年齡在20~30之間、email不為空的所有值,且查詢到的值按照年齡降序排序,若年齡相同則按照id升序排序
??查詢返回name、age、email字段

@Test
public void selectListTest() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select("name", "age", "email").like("name", "a").between("age", 20, 30).isNotNull("email").orderByDesc("age").orderByAsc("id");// SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL) ORDER BY age DESC,id ASCList<Map<String, Object>> maps = mapper.selectMaps(queryWrapper);maps.forEach(System.out::println);System.out.println("========================================================================================");List<User> users = mapper.selectList(queryWrapper);users.forEach(System.out::println);
}

?? selectMaps和selectList的區別在于:selectMaps會將查詢到的結果封裝在一個元素類型為map集合的list集合中,集合中只有查詢返回字段所對應的鍵值對;而selectList的返回值也是一個list集合,只不過元素類型為對應的泛型,包含泛型所有的字段,查詢返回字段之外的值都為null在這里插入圖片描述組裝刪除條件
??刪除條件:email不為空

@Test
public void deleteTest() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.isNull("email");// UPDATE user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)int result = mapper.delete(queryWrapper);System.out.println("刪除的行數為" + result);
}

組裝修改條件
??修改條件:(年齡大于20并且用戶名中包含有a)或郵箱為null

@Test
public void updateTest() {User user = new User();user.setAge(20);user.setEmail("temporary.com");QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.gt("age", 20).like("name", "a").or().isNull("email");// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)int result = mapper.update(user, queryWrapper);System.out.println("修改的行數為" + result);
}

1.2 條件優先級

??使用queryWrapper組裝復雜條件的時候,存在一個且或條件的優先級問題,也就是說在實現多條件拼接的時候且或條件該如何拼接到一起,接下來就挑取兩個例子來了解一下

// (年齡大于20并且用戶名中包含有a) 或 郵箱為null
// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
queryWrapper.gt("age", 20).like("name", "a").or().isNull("email");// 用戶名中包含有a 且 (年齡大于18或郵箱為null)
// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
queryWrapper.like("name", "a").and(i -> i.gt("age", 18).or().isNull("email"));

??總結一下:Lambda表達式中的條件會被當做一個整體優先執行,如果不括起來影響結果的話就需要使用Lambda表達式的寫法,具體的使用要根據業務SQL語句來定

1.3 實現子查詢

@Test
public void sonSelectTest() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.inSql("id", "select id from user where id <= 100");// SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (id IN (select id from user where id <= 100))List<User> users = mapper.selectList(queryWrapper);users.forEach(System.out::println);
}

2 updateWrapper構造器

2.1 升級修改方法(無需創建對象)

組裝修改條件
??修改條件:用戶名中包含有a并且(年齡大于20或郵箱為null)

@Test
public void updateWrapperTest() {UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();updateWrapper.like("name", "a").and(i -> i.gt("age", 20).or().isNull("email"));updateWrapper.set("name", "小黑").set("email", "dhsjfghr");// UPDATE user SET name=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))int result = mapper.update(null, updateWrapper);System.out.println("修改的行數為" + result);
}

由SQL可見,使用updateWrapper和queryWrapper完成的修改功能一樣,且調用的方法也一樣(mapper.update),二者的區別就是updateWrapper不用創建實體類對象,直接使用set方法就可以設置修改的字段值

2.2 實際開發時的應用

??在實際開發中,不管是queryWrapper還是updateWrapper都應該在一定的判斷下再去使用條件構造器拼接條件,比如說請求傳過來的值在不為空的情況下才去對這個字段進行條件設置,比如下面的這段代碼

@Test
public void ifTest() {String userName = "";Integer ageBegin = 20;Integer ageEnd = 30;QueryWrapper<User> queryWrapper = new QueryWrapper<>();if (StringUtils.isNotBlank(userName)) {queryWrapper.like("name", userName);}if (ageBegin != null) {queryWrapper.ge("age", ageBegin);}if (ageEnd != null) {queryWrapper.le("age", ageEnd);}List<User> users = mapper.selectList(queryWrapper);
}

??然而,上面的代碼使用了很多的if判斷顯得過于冗余,于是許多的方法都帶有一個condition參數,當這個參數為true的時候才會拼接查詢條件,下面的代碼用來代替上面一堆的if判斷

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(userName), "name", userName).ge(ageBegin != null, "age", ageBegin).le(ageEnd != null, "age", ageEnd);

3 lambdaXxxWrapper構造器

??lambdaXxxWrapper與xxxWrapper的區別就是:他們可以使用Lambda的方式直接調用對象的getter方法來指定字段,而不用對照數據庫中的字段名,這樣就樂意避免參數對應不上數據庫字段的問題。除了在調用字段時的寫法不一樣之外,其他的寫法上二者的方式都一樣

3.1 lambdaQueryWrapper構造器

@Test
public void lambdaQueryWrapperTest() {String userName = "";Integer ageBegin = 20;Integer ageEnd = 30;LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.like(StringUtils.isNotBlank(userName), User::getName, userName).ge(ageBegin != null, User::getAge, ageBegin).le(ageEnd != null, User::getAge, ageEnd);List<User> users = mapper.selectList(lambdaQueryWrapper);
}

3.2 lambdaUpdateWrapper構造器

@Test
public void lambdaUpdateWrapperTest() {LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();lambdaUpdateWrapper.like(User::getName, "a").and(i -> i.gt(User::getAge, 20).or().isNull(User::getEmail));lambdaUpdateWrapper.set(User::getName, "小黑").set(User::getEmail, "dhsjfghr");// UPDATE user SET name=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))int result = mapper.update(null, lambdaUpdateWrapper);System.out.println("修改的行數為" + result);
}

這篇博客參加了幾何大佬的社區活動
還望大家多多支持幾何大佬的社區
??????????????????
CSDN社區 《創作達人》活動,只要參與其中并創作文章就有機會獲得官方獎品:精品日歷、新程序員雜志,快來參與吧!鏈接直達 https://bbs.csdn.net/topics/605272551

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

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

相關文章

springboot設置默認值_線上Bug無法復現?老司機教你一招,SpringBoot遠程調試不用愁!...

前言在部署線上項目時&#xff0c;相信大家都會遇到一個問題&#xff0c;線上的 Bug 但是在本地不會復現&#xff0c;多么無奈。此時最常用的就是取到前端傳遞的數據用接口測試工具測試&#xff0c;比如 POSTMAN&#xff0c;復雜不&#xff0c;難受不&#xff1f;今天陳某教你一…

Mybatis-Plus的分頁 樂觀鎖插件 通用枚舉 多數據源

寫在前面&#x1f6eb;更多知識總結見Mybatis-Plus專欄 &#x1f695;內容總結自尚硅谷楊博超老師的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

學python哪個網站好-有哪些值得推薦的Python學習網站|

現在那個網站可以學習python爬蟲&#xff1f; 為大家分享Python學習經驗: 1、尋找一本Python書籍&#xff0c;要求淺顯易懂、全面細致程較好&#xff0c;專注于這一本&#xff0c;從頭開始研究&#xff0c;把整本書掌握透徹。 2、找一個項目練手&#xff0c;熟悉基礎后&#xf…

等待的操作過時_不會過時的6種網站seo優化操作

SEO優化一直在變化&#xff0c;百度和谷歌的算法也在不斷的迭代更新&#xff0c;所以競爭永遠不會停止。今天小編就來給大家分享一下&#xff0c;6種不會過時的網站seo優化操作。1.保持正常優化為網站訪客提供高質量的內容、卓越的用戶體驗和安全性以及卓越的技術網站。這可能需…

java的for循環取出數據只是拿到最后一個_一問SQL優化就無從藏身?那只是你對原理的精髓掌握不深

?曾幾何時&#xff0c;我信誓旦旦的認為只要 SQL 寫的好&#xff0c;面試過程永不倒。結果在一次又一次的征途中&#xff0c;「最終還是以完敗落下帷幕」。結果都源于注重使用而忽略原理&#xff0c;從而不知也不了解「SQL」優化應如何面對。讀文的你&#xff0c;如今可有這樣…

SpringBoot前后端分離解決跨域問題的三種解決方案

&#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;** 文章目錄&#x1f34a;什么是跨域&#x1f34a;跨域問題的解決策略&#x1f34a;三種解決方法&#x1f34a;什么是跨域 想要知道什么是跨域的話&#xff0c;我們可以通過一個小案例簡單了解一下跨…

ant design vue 樹形控件_官宣!vue.ant.design 低調上線

點擊右上方&#xff0c;關注開源中國OSC頭條號&#xff0c;獲取最新技術資訊官宣&#xff01;官宣&#xff01;官宣&#xff01;是的&#xff0c;你沒看錯就是那個 https://vue.ant.design。至此&#xff0c;Ant Design 已經全面覆蓋了 React、Angular、Vue 三大前端框架&#…

哪款筆記本電腦好_掃地機器人哪個牌子好?口碑最好的掃地機器人

隨著智能家居的普及&#xff0c;讓我們的生活變得越來越智能。掃地機器人的出現完美解決了寵物的毛發問題&#xff0c;為自己騰出了大量的時間。掃地機器人絕對能提升你的生活品質&#xff0c;通過機器內建的智能清潔模式、自定義規劃區域進行打掃&#xff0c;使用手機APP進行控…

使用mybatisplus的通用枚舉實現存儲顯示相分離

狡兔尚且三窟&#xff0c;多學一招總沒錯吧&#xff1f; &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680; &#x1f30f; 拋出問題 如果讓你實現這么一個功能&#xff1a;將性別使用數字存儲到數據庫中&#xff0c;但是前端需要獲取到的是具體的性…

wifi卡慢延遲高_家里WiFi特別卡,網絡延遲高,可能不是網速的問題

原標題&#xff1a;家里WiFi特別卡&#xff0c;網絡延遲高&#xff0c;可能不是網速的問題隨著科技走向我們的身邊&#xff0c;網絡的覆蓋力度也是越來越大&#xff0c;相信很多人的家中都是有安裝WiFi的&#xff0c;然后往往在家中使用的過程中都會碰到這樣的情況&#xff0c;…

voc2007數據集_【目標檢測數據集】PASCAL VOC制作

【VOC20072012】數據集地址&#xff1a;https://pjreddie.com/projects/pascal-voc-dataset-mirror/PASCAL VOC為圖像識別和分類提供了一整套標準化的優秀的數據集&#xff0c;用于構建和評估用于圖像分類&#xff08;Classification&#xff09;&#xff0c;檢測&#xff08;O…

JDK和JRE的區別?main方法的注意點?強制和自動類型轉換?

&#x1f4a1;涉及的知識點速通&#x1f6eb; JDK和JRE傻傻分不清?&#x1f6eb; HelloWorld的輸出都經歷了啥&#xff1f;&#x1f6eb; Java的三個版本都是啥&#xff1f;&#x1f6eb; 關于main方法你都知道啥&#xff1f;&#x1f6eb; 強制and自動類型轉換都是啥?各位小…

java將date類型轉成yyyymmdd_java中的Date怎么轉換成YYYYMMDD形式?

展開全部SimpleDateFormat inSdf new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);創建SimpleDateFormat對象的時候使用帶Locale的構e69da5e6ba9062616964757a686964616f31333365633938造參數因為你的星期和月份是用E文寫的 所以parse回來的時候自…

安卓10不支持qmc解碼_Root神器支持安卓10 面具Magisk v20.4+Magisk Manager v7.5.1

Magisk的功能和xposed框架的功能差不多&#xff0c;也有很多插件可安裝&#xff0c;而且自帶root&#xff0c;刷入這個Magisk后你的rom同時也就有root了(支持安卓7.0&#xff0c;7.1&#xff0c;8.0&#xff0c;8.1,9,10)這也是目前安裝8.1root的普遍方法&#xff0c;因為目前s…

centos7配置br0_Docker CentOS7 修改網絡配置與宿主機橋接

Docker CentOS7 修改網絡配置與宿主機橋接1、創建橋接物理網絡(1)新建br0橋接網絡&#xff0c;brctl show可以查看(需安裝bridge-utils)(2)將宿主機物理網卡IP、掩碼、網關、dns(或者dhcp)配置到br0上(3)刪除宿主機物理網卡IP、掩碼、網關、dns(或者dhcp)配置(4)將宿主機物理網…

==和equals判等、空串和null串、字符串常用API

&#x1f4a1;涉及的知識點速通&#x1f6eb; 關于變量和常量你都知道啥?&#x1f6eb; &和&&#xff06;、|和||有什么區別&#xff1f;&#x1f6eb; 關于字符串的問題你能答對幾道&#xff1f;&#x1fa82; 可以修改一個字符串中的值嗎?&#x1fa82; 字符串使用…

倆臺電腦怎么設置同一局域網_方法 | 把手機上的照片傳到電腦上

我想把手機上的照片/視頻傳到電腦上怎么辦? 什么云盤&#xff0c;手機助手等等全扔到一邊去&#xff0c;不用。請讓我慢慢道來&#xff1a;現在&#xff0c;人們手機用的越來越多&#xff0c;即使在大街上&#xff0c;到處都是“低頭族”。但是&#xff0c;有好多小伙伴問&…

數據持化技術的發展演變(SQL、JDBC、mybatis)

文章目錄1 簡單SQL語句1.1 查詢1.2 新增1.3 修改1.4 刪除1.5 多表查詢2 JDBC2.1 什么是JDBC2.2 什么是jar和maven2.3 JDBC的使用2.4 JDBC總結3 mybatis3.1 什么是ORM?為什么是ORM不是JDBC&#xff1f;3.2 mybatis的使用3.3 mybatis總結4 mybatis與jdbc的邏輯相同處環境配置 j…

傳統蒙文字體_蒙古要改回使用傳統回鶻蒙文,這是種什么文字,蒙古為什么要改回...

喜歡就點關注吧!文字是一個國家的文化象征&#xff0c;也是其書面交流的主要工具&#xff0c;世界上的大多數國家都有自己獨特的文字&#xff0c;我們的鄰國蒙古也是如此&#xff0c;近日蒙古國實行了一場意義重大的文字改革&#xff0c;據新華社烏蘭巴托3月18日報道&#xff0…

三態輸出門實驗報告注意事項_數電基礎知識:各種IO輸出的類型

集電極開路(OC)集電極開路輸出的結構如圖1所示&#xff0c;右邊的那個三極管集電極什么都不接&#xff0c;所以叫做集電極開路&#xff1b;左邊的三極管為反相之用&#xff0c;使輸入為“0”時&#xff0c;輸出也為“0”。對于圖 1&#xff0c;當左端的輸入為“0”時&#xff0…