Java中LambdaQueryWrapper的常用方法詳解
1、查看項目中是否導(dǎo)入mybatisPlus的jar包
2、servie 層和實現(xiàn)類要集成mybatisPlus
service 繼承IService<>
實現(xiàn)類中要繼承IService的實現(xiàn)類ServiceImpl<mapper,實體類>
3、如果想要mapper中的一些方法,mapper 要繼承BaseMapper<實體類>
4、在實現(xiàn)類中實現(xiàn)方法,不需要在xml中寫一個方法了,常用的方法
總結(jié)如下:
【1】分頁
參數(shù)1是分頁起始位置,一般是1,參數(shù)2:結(jié)束位置, 一般都是前端傳過來的,查詢的數(shù)量
Page<LandLossAllowance> page1 = new Page<LandLossAllowance>(參數(shù)1,參數(shù)2);
LambdaQueryWrapper<LandLossAllowance> queryWrapper = new LambdaQueryWrapper<>();
條件 eq 指的是相等
queryWrapper.eq(LandLossAllowance::getCountrySide,landLossAllowanceOption.getCountrySide());
執(zhí)行page方法 page(參數(shù)1,參數(shù)2)
參數(shù)1:上面的new的分頁對象,參數(shù)2是lambda表達式查詢條件
IPage<LandLossAllowance> iPage = page(page1, queryWrapper);
(一)PageHelper和IPage區(qū)別:
使用方法:
PageHelper.startPage()然后后邊寫sql就可以。 緊接著的一個sql起作用。
IPage則需要在dao層傳入IPage的實現(xiàn)類Page對象,該對象實現(xiàn)了IPage。
區(qū)別:
PageHelper內(nèi)部原理是將傳入的頁碼和條數(shù)賦值給了Page對象,保存到了一個本地線程ThreadLoacl中,然后會進入Mybatis的攔截器中。
然后再攔截器中獲取本地線程中保存的分頁的參數(shù)。最后再將這寫分頁參數(shù)和原本的sql以及內(nèi)部定義好的sql進行拼接完成sql的分頁處理。
中間會進行判斷該sql 的類型是查詢還是修改操作。如果是查詢才會進入分頁的邏輯并判斷封裝好的Page對象是否是null,null則不分頁,否則分頁。IPage內(nèi)部原理也是基于攔截器,但是這個攔截的是方法以及方法中的參數(shù),這個也會判斷是否是查詢操作。如果是查詢操作,才會進入分頁的處理邏輯。
進入分頁邏輯處理后,攔截器會通過反射獲取該方法的參數(shù)進行判斷是否存在IPage對象的實現(xiàn)類。如果不存在則不進行分頁,存在則將該參數(shù)賦值給IPage對象。
然后進行拼接sql的處理完成分頁操作。
但是使用IPage需要注入一個bean攔截器交給spring進行管理。如下。否則不會進行攔截。
使用Ipage之后,需要注入一些配置:
@Configuration @MapperScan(value={"com.XX.**.mapper*"}) public class MybatisPlusConfig { /** * 分頁插件 */ @Bean public PaginationInterceptor paginationInterceptor() { // 設(shè)置sql的limit為無限制,默認(rèn)是500 return new PaginationInterceptor().setLimit(-1); } }
(二)常用的lambda表達式的一些定義
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper是MybatisPlus框架構(gòu)造查詢條件常用的對象
使用lambda表達式寫法更為清晰,簡潔:
QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(User::getName,"aa"); queryWrapper.lambda().ge(User::getAge,20);
默認(rèn)情況下多個條件是and連接:上述寫法對應(yīng)的SQL為:where name like '%aa%' and age >= 20
如果要使用or連接的話,方法如下:
queryWrapper.lambda().and(wq->{ wq.like(User::getName,"aa"); wq.or().like(User::getName,"bb); });
這里引申下我遇到的一個場景:需要or連接的是一個集合內(nèi)的所有元素:
List<String> nameList = Lists.newArrayList("aa","bb","cc"); String firstName = nameList.get(0); nameList.remove(0); queryWrapper.lambda().and(wq->{ wq.like(User::getName,firstName); for(String name : nameList){ wq.or().like(User::getName,name); } });
allEq
條件用 Map 進行封裝
“name” -> “張三” “age” -> 20 public void testAllEq() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); // 封裝條件 Map<String, Object> hashMap = new HashMap<>(); hashMap.put("name", "張三"); hashMap.put("age", 20); queryWrapper.allEq(hashMap); List<User> userList = userMapper.selectList(queryWrapper); userList.forEach(user -> { System.out.println(user); }); }
eq
eq("列名", 值) -> 列名 = 值 public List<Dict> listByDictCode(DictCode dictCode) { LambdaQueryWrapper<Dict> wrapper = Wrappers.lambdaQuery(); wrapper.eq(Dict::getDictCode, dictCode.getCode()) .eq(Dict::getEnabled, DictEnableEnum.VALID.getType()); return this.baseMapper.selectList(wrapper); }
ne
ne("列名", 值) -> 列名 != 值 public List<Dict> listByDictCode(DictCode dictCode) { LambdaQueryWrapper<Dict> wrapper = Wrappers.lambdaQuery(); wrapper.ne(Dict::getDictCode, dictCode.getCode()) .ne(Dict::getEnabled, DictEnableEnum.VALID.getType()); return this.baseMapper.selectList(wrapper); }
gt
gt("age", 20) -> age > 20 public List<User> userList() { LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); wrapper.gt(User::getAge, 20); return this.baseMapper.selectList(wrapper); }
ge
ge("age", 20) -> age >= 20 public List<User> userList() { LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); wrapper.ge(User::getAge, 20); return this.baseMapper.selectList(wrapper); }
lt
lt("age", 20) -> age < 20 public List<User> userList() { LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); wrapper.lt(User::getAge, 20); return this.baseMapper.selectList(wrapper); }
le
le("age", 21) -> age <= 21 public List<User> userList() { LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); wrapper.le(User::getAge, 20); return this.baseMapper.selectList(wrapper); }
between,notBetween
between("age", 18, 25) -> age BETWEEN 18 AND 25 ,年齡在18到25之間 notBetween就是不在18到25之間 public List<User> userList() { LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); wrapper.between(User::getAge, 18,25); return this.baseMapper.selectList(wrapper); }
like,notLike
like 匹配值 -> "%值%" 模糊查詢 notLike 模糊查詢不匹配"%值%" public List<User> userList() { LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); wrapper.like(User::getName, "張"); return this.baseMapper.selectList(wrapper); }
likeLeft
likeLeft 匹配值 -> "%值" public List<User> userList() { LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); wrapper.likeLeft(User::getName, "張"); return this.baseMapper.selectList(wrapper); }
likeRight
likeRight 匹配值 -> "值%" public List<User> userList() { LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); wrapper.likeRight(User::getName, "張"); return this.baseMapper.selectList(wrapper); }
isNull 空值查詢
isNotNull 非空值查詢 public List<User> userList() { LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); wrapper.isNull(User::getName); //wrapper.isNotNull(User::getName); return this.baseMapper.selectList(wrapper); }
in
in("name", "張三", "李四") -> name in ("張三", "李四") 姓名是張三或李四的用戶 notIn notIn("name", "張三", "李四") -> name not in ("張三", "李四") 姓名不是張三或李四的用戶 public List<User> userList() { LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); wrapper.in(User::getName, "張三","李四"); //wrapper.in(User::getName, "張三","李四"); return this.baseMapper.selectList(wrapper); }
inSql、notInSql
public List<User> userList() { LambdaQueryWrapper<User> wrapper= new LambdaQueryWrapper<>(); // SELECT id,name,email,age FROM user WHERE (age IN (select age from user where id = 1)) wrapper.inSql(User::getAge, "select age from user where id = 1"); return this.baseMapper.selectList(wrapper); }
groupBy分組
public List<User> userList() { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.groupBy(User::getName); return this.baseMapper.selectList(wrapper); }
orderBy、orderByAsc、orderByDesc
public List<User> userList() { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); // SELECT id,name,email,age FROM user ORDER BY name ASC,age DESC wrapper.orderBy(true, true, User::getName).orderBy(true, false, User::getAge); // SELECT id,name,email,age FROM user ORDER BY name ASC,age ASC wrapper.orderByAsc(User::getName, User::getAge); // SELECT id,name,email,age FROM user ORDER BY name DESC,age DESC wrapper.orderByDesc(User::getName, User::getAge); return this.baseMapper.selectList(wrapper); }
or、and
public List<User> userList() { LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery(); // SELECT id,name,email,age FROM user WHERE (name = ? AND id = ?) wrapper.eq(User::getName, "張三").and().eq(User::getId,1); // SELECT id,name,email,age FROM user WHERE (name = ? OR id = ?) wrapper.eq(User::getName, "張三").or().eq(User::getId,1); return this.baseMapper.selectList(wrapper); }
這里說明一下or和and的問題
錯誤代碼
public List<User> userList() { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getId,1); wrapper.like(User::getName,"張") .or() .like(User::getEmail,"163") .or() .like(User::getAge,1); }
根據(jù)上面的寫法寫出的sql語句如下:
WHERE id = '1' AND name LIKE '%張%' OR email LIKE '%163%' OR age LIKE '%1%'
這樣明顯是不對的,根據(jù)mysql語句執(zhí)行順序or最后執(zhí)行 ,這會導(dǎo)致一旦[name like '%張%']條件成立后面的or條件就會失效,所以第一個條件 并沒有起到and的作用。
解決方法
public List<User> userList() { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getId,1); wrapper.and(wrapper->wrapper.like(User::getName,"張") .or() .like(User::getEmail,"163") .or() .like(User::getAge,1) ); }
這樣得到的sql語句如下
WHERE id = '1' AND (name LIKE '%張%' OR email LIKE '%163%' OR age LIKE '%1%')
這樣就解決了,這個問題在我的公司中新人(包括我在內(nèi))貌似都遇到這個問題,在此說明一下
last
在末尾拼接sql語句
注:last()有sql注入的風(fēng)險,請謹(jǐn)慎使用!
public List<User> userList() { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); // SELECT id,name,email,age FROM user WHERE (name = ? OR age = ?) limit 1 wrapper.eq(User::getName, "張三").or().eq(User::getAge, 20).last("limit 1"); return this.baseMapper.selectList(wrapper); }
exists、notExists
public List<User> userList() { LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); // SELECT id,name,email,age FROM user WHERE (EXISTS (select name from user where age > ?)) wrapper.exists("select name from user where age > 21"); // SELECT id,name,email,age FROM user WHERE (NOT EXISTS (select name from user where age > ?)) wrapper.notExists("select name from user where age > 21"); return this.baseMapper.selectList(wrapper); }
總結(jié)
到此這篇關(guān)于Java中LambdaQueryWrapper的常用方法的文章就介紹到這了,更多相關(guān)Java LambdaQueryWrapper常用方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合Mybatis與druid實現(xiàn)流程詳解
這篇文章主要介紹了springboot整合mybatis plus與druid詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的下伙伴可以參考一下2022-10-10Java數(shù)組聲明、創(chuàng)建、初始化基礎(chǔ)
本文講述了Java數(shù)組的幾個相關(guān)的方面,講述了對Java數(shù)組的聲明、創(chuàng)建和初始化,并給出其對應(yīng)的代碼2012-12-12關(guān)于springboot中對sqlSessionFactoryBean的自定義
這篇文章主要介紹了springboot中對sqlSessionFactoryBean的自定義方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12Mockito mock Kotlin Object類方法報錯解決方法
這篇文章主要介紹了Mockito mock Kotlin Object類方法報錯解決方法,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-09-09SpringCloud遠程服務(wù)調(diào)用實戰(zhàn)筆記
本文給大家介紹SpringCloud遠程服務(wù)調(diào)用實戰(zhàn)筆記,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-11-11