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表達(dá)式查詢條件
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中,然后會進(jìn)入Mybatis的攔截器中。
然后再攔截器中獲取本地線程中保存的分頁的參數(shù)。最后再將這寫分頁參數(shù)和原本的sql以及內(nèi)部定義好的sql進(jìn)行拼接完成sql的分頁處理。
中間會進(jìn)行判斷該sql 的類型是查詢還是修改操作。如果是查詢才會進(jìn)入分頁的邏輯并判斷封裝好的Page對象是否是null,null則不分頁,否則分頁。IPage內(nèi)部原理也是基于攔截器,但是這個攔截的是方法以及方法中的參數(shù),這個也會判斷是否是查詢操作。如果是查詢操作,才會進(jìn)入分頁的處理邏輯。
進(jìn)入分頁邏輯處理后,攔截器會通過反射獲取該方法的參數(shù)進(jìn)行判斷是否存在IPage對象的實現(xiàn)類。如果不存在則不進(jìn)行分頁,存在則將該參數(shù)賦值給IPage對象。
然后進(jìn)行拼接sql的處理完成分頁操作。
但是使用IPage需要注入一個bean攔截器交給spring進(jìn)行管理。如下。否則不會進(jìn)行攔截。
使用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表達(dá)式的一些定義

com.baomidou.mybatisplus.core.conditions.query.QueryWrapper是MybatisPlus框架構(gòu)造查詢條件常用的對象
使用lambda表達(dá)式寫法更為清晰,簡潔:
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 進(jìn)行封裝
“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)文章
Mybatis CachingExecutor二級緩存使用示例詳解
這篇文章主要介紹了?Mybatis的CachingExecutor與二級緩存使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
java從命令行獲取數(shù)據(jù)的三種方式代碼實例
這篇文章主要介紹了java從命令行獲取數(shù)據(jù)的三種方式代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
Spring Boot集成Shiro實現(xiàn)動態(tài)加載權(quán)限的完整步驟
這篇文章主要給大家介紹了關(guān)于Spring Boot集成Shiro實現(xiàn)動態(tài)加載權(quán)限的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
解決fastjson從1.1.41升級到1.2.28后報錯問題詳解
這篇文章主要介紹了解決fastjson從1.1.41升級到1.2.28后報錯問題詳解,需要的朋友可以參考下2020-02-02

