網站首頁 編程語言 正文
目錄
1.Wrapper概述
1.1.Wrapper的繼承關系
1.2.Wapper介紹?
1.3.各個構造器使用區別
1.4.構造器常用方法
2.Wrapper常用構造器介紹
2.1.QueryWrapper
2.2.UpdateWrapper
2.3.LambdaQueryWrapper
2.4.AbstractWrapper
3. Lambda條件構造器
3.1.示例
4.鳴謝
?????1.Wrapper概述
????????我們在實際操作數據庫的時候會涉及到很多的條件。所以MP為我們提供了一個功能強大的條件構造器?Wrapper
?。使用它可以讓我們非常方便的構造條件。
????????Wrapper是MyBatis-Plus提供的一種查詢條件封裝類,用于構建查詢條件。它是一個抽象類,有三個具體的實現類,分別是QueryWrapper、UpdateWrapper和LambdaQueryWrapper。其中,QueryWrapper和LambdaQueryWrapper用于構建查詢條件,UpdateWrapper用于構建更新條件。
????????使用Wrapper可以方便地構建復雜的查詢條件,支持鏈式調用,可以通過and、or等方法將多個條件組合起來。同時,Wrapper還提供了一些常用的方法,如eq、ne、gt、ge、lt、le等,可以方便地構建等值、不等值、大于、小于等各種條件。
????????另外,LambdaQueryWrapper是MyBatis-Plus 3.x新增的功能,它支持使用Lambda表達式構建查詢條件,使得代碼更加簡潔易讀。
1.1.Wrapper的繼承關系
Wrapper 條件構造抽象類
-- AbstractWrapper 查詢條件封裝,用于生成 sql 中的 where 語句。
-- QueryWrapper Entity 對象封裝操作類,用于查詢。
-- UpdateWrapper Update 條件封裝操作類,用于更新。
-- AbstractLambdaWrapper 使用 Lambda 表達式封裝 wrapper
-- LambdaQueryWrapper 使用 Lambda 語法封裝條件,用于查詢。
-- LambdaUpdateWrapper 使用 Lambda 語法封裝條件,用于更新。
MybatisPlus的
EntityWrapper
,在3.0版本以上就沒了,改為了QueryWrapper。?
1.2.Wapper介紹?
Wrapper : 條件構造抽象類,最頂端父類
AbstractWrapper : 用于查詢條件封裝,生成 sql 的 where 條件
QueryWrapper : Entity 對象封裝操作類,不是用lambda語法
UpdateWrapper : Update 條件封裝,用于Entity對象更新操作
AbstractLambdaWrapper : Lambda 語法使用 Wrapper統一處理解析 lambda 獲取 column。
LambdaQueryWrapper :看名稱也能明白就是用于Lambda語法使用的查詢Wrapper
LambdaUpdateWrapper : Lambda 更新封裝Wrapper
1.3.各個構造器使用區別
????????1)QueryWrapper、QueryChainWrapper只能指定需要的數據庫列名;
????????2)LambdaQueryWrapper、LambdaQueryChainWrapper可以通過Lambda獲取數據庫列名;
????????3)QueryWrapper?、LambdaQueryWrapper不能使用鏈式查詢的方式,必須借助BaseMapper來執行;
????????4)QueryChainWrapper、LambdaQueryChainWrapper可以使用鏈式查詢的方式,如list(),one();
1.4.構造器常用方法
eq:equals,等于
gt:greater than ,大于 >
ge:greater than or equals,大于等于≥
lt:less than,小于<
le:less than or equals,小于等于≤
between:相當于SQL中的BETWEEN
like:模糊匹配。like(“name”,“黃”),相當于SQL的name like ‘%黃%’
likeRight:模糊匹配右半邊。likeRight(“name”,“黃”),相當于SQL的name like ‘黃%’
likeLeft:模糊匹配左半邊。likeLeft(“name”,“黃”),相當于SQL的name like ‘%黃’
notLike:notLike(“name”,“黃”),相當于SQL的name not like ‘%黃%’
isNull
isNotNull
and:SQL連接符AND
or:SQL連接符OR
in: in(“age",{1,2,3})相當于 age in(1,2,3)
groupBy: groupBy(“id”,“name”)相當于 group by id,name
orderByAsc :orderByAsc(“id”,“name”)相當于 order by id ASC,name ASC
orderByDesc :orderByDesc (“id”,“name”)相當于 order by id DESC,name DESC
?
2.Wrapper常用構造器介紹
????????字面來理解,就是定義各種各樣的條件,相當于sql語句中的(where),wrapper條件構造器是一個接口,是一個頂級父類,它下面有各種實現類,今天重點介紹LambdaQueryWrapper和LambdaUpdateWrapper
2.1.QueryWrapper
????????QueryWrapper是用于查詢的Wrapper條件構造器,可以通過它來構建SELECT語句中的WHERE條件
@Test
public void testQueryWrapper() {
// 查詢條件構造器
QueryWrapper<BannerItem> wrapper = new QueryWrapper<>();
wrapper.eq("banner_id", id);
// 查詢操作
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);
//我們可以引入lambda,避免在代碼中寫類似的于banner_id的硬編碼
QueryWrapper<BannerItem> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(BannerItem::getBannerId, id);
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);
}
2.2.UpdateWrapper
????????QueryWrapper是用于查詢的Wrapper條件構造器,可以通過它來構建SELECT語句中的WHERE條件:
SQL SET 字段
????????例:?set("name", "老李頭")
????????例:?set("name", "")--->數據庫字段值變為空字符串
????????例:?set("name", null)--->數據庫字段值變為null ? ?
@Test
public void testUpdateWrapper() {
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.set("age", 20).eq("name", "張三");
int affectedRows = userMapper.update(null, updateWrapper);
}
2.3.LambdaQueryWrapper
????????Lambda條件構造器是一種更加便捷、類型安全的Wrapper條件構造器,可以通過Lambda表達式來構建WHERE條件
作用:
????????1)字段檢查,防止字段寫錯
????????2)防止傳入的數據為null作為條件
書寫方式如下:
????????1)引入對象
????????2)調用函數
為了簡化lambda的使用,我們可以改寫成LambdaQueryWrapper構造器,語法如下:
LambdaQueryWrapper<BannerItem> wrapper = new QueryWrapper<BannerItem>().lambda();
wrapper.eq(BannerItem::getBannerId, id);
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);
我們可以再次將QueryWrapper<BannerItem>.lambda()簡化,變成這個樣子
LambdaQueryWrapper<BannerItem> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BannerItem::getBannerId, id);
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);
鏈式查詢
MyBatis-Plus還提供了一種鏈式查詢的方式,和上面的代碼效果一樣。
但是這種寫法偏向于炫技,可讀性沒有上面的代碼強,大家可以根據需要自行選擇方式。
List<BannerItem> bannerItems = new LambdaQueryChainWrapper<>(bannerItemMapper)
? ? ? ? ? ? ? ? ? ? ? ? .eq(BannerItem::getBannerId, id)
? ? ? ? ? ? ? ? ? ? ? ? .list();
如果只想查詢一條記錄,例如通過id查詢某條記錄的詳情,使用.one()即可,例如
BannerItem bannerItem = new LambdaQueryChainWrapper<>(bannerItemMapper)
? ? ? ? ? ? ? ? ? ? ? ? .eq(BannerItem::getId, id)
? ? ? ? ? ? ? ? ? ? ? ? .one();
2.4.AbstractWrapper
完整的AbstractWrapper方法可以參照:?https://baomidou.com/guide/wrapper.html#abstractwrapper
3. Lambda條件構造器
?????????前面在使用條件構造器時列名都是用字符串的形式去指定。這種方式無法在編譯期確定列名的合法性。
?????????所以MP提供了一個Lambda條件構造器可以讓我們直接以實體類的方法引用的形式來指定列名。
Lambda條件構造器相比于傳統的Wrapper條件構造器,具有以下幾個好處:
-
更加簡潔易懂:Lambda條件構造器使用Lambda表達式來構建WHERE條件,代碼更加簡潔易懂,不需要繁瑣的字符串拼接(避免硬編碼)。
-
更加類型安全:Lambda條件構造器在編譯時就能檢查出類型錯誤,避免在運行時出現類型轉換異常的問題。
-
更加靈活:Lambda條件構造器支持鏈式調用,可以方便地組合多個條件,還支持自定義SQL片段,更加靈活
3.1.示例
要執行的查詢對應的SQL如下
SELECT
id,user_name,PASSWORD,NAME,age,address
FROM
USER
WHERE
age > 18 AND address = '狐山'
如果使用之前的條件構造器寫法如下
@Test
public void testLambdaWrapper(){
QueryWrapper<User> queryWrapper = new QueryWrapper();
queryWrapper.gt("age",30);
queryWrapper.eq("address","黃山");
List<User> users = userMapper.selectList(queryWrapper);
}
如果使用Lambda條件構造器寫法如下
@Test
public void testLambdaWrapper2(){
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.gt(User::getAge,30);
queryWrapper.eq(User::getAddress,"黃山");
List<User> users = userMapper.selectList(queryWrapper);
}
4.鳴謝
[1] https://blog.csdn.net/lt326030434/article/details/106571670
原文鏈接:https://blog.csdn.net/qq_20957669/article/details/130395978
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-06-14 C#實現加密的幾種方法介紹_C#教程
- 2024-03-02 前端directus對接單點登錄
- 2022-12-01 RFO?SIG之openEuler?AWS?AMI?制作詳解_云其它
- 2022-05-27 時序數據庫TDengine寫入查詢的問題分析_數據庫其它
- 2022-02-13 group?by用法詳解_oracle
- 2022-04-12 .NET 6 “目標進程已退出,但未引發 CoreCLR 啟動事件。請確保將目標進程配置為使用 .N
- 2024-01-15 SpringMVC之@InitBinder注解詳解
- 2022-06-24 Python統計序列和文件中元素的頻度_python
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支