欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中LambdaQueryWrapper的常用方法詳解

 更新時間:2023年11月16日 10:02:08   作者:MinggeQingchun  
這篇文章主要給大家介紹了關(guān)于Java中LambdaQueryWrapper常用方法的相關(guān)資料,lambdaquerywrapper是一個Java庫,用于構(gòu)建類型安全的Lambda表達式查詢,需要的朋友可以參考下

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加入thymeleaf模板的方式

    springBoot加入thymeleaf模板的方式

    這篇文章主要介紹了springBoot加入thymeleaf模板的方式,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot整合Mybatis與druid實現(xiàn)流程詳解

    SpringBoot整合Mybatis與druid實現(xiàn)流程詳解

    這篇文章主要介紹了springboot整合mybatis plus與druid詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的下伙伴可以參考一下
    2022-10-10
  • Java數(shù)組聲明、創(chuàng)建、初始化基礎(chǔ)

    Java數(shù)組聲明、創(chuàng)建、初始化基礎(chǔ)

    本文講述了Java數(shù)組的幾個相關(guān)的方面,講述了對Java數(shù)組的聲明、創(chuàng)建和初始化,并給出其對應(yīng)的代碼
    2012-12-12
  • Java并發(fā)編程面試之線程池

    Java并發(fā)編程面試之線程池

    線程池和并發(fā)問題是Java技術(shù)面試中面試官比較喜歡問的問題之一。在這里,從面試的角度列出了大部分重要的問題,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 詳細分析JAVA加解密算法

    詳細分析JAVA加解密算法

    這篇文章主要介紹了JAVA加解密算法的的相關(guān)資料,文中講解非常詳細,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 解決Spring使用@MapperScan問題

    解決Spring使用@MapperScan問題

    這篇文章主要介紹了解決Spring使用@MapperScan問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 關(guān)于Java的動態(tài)代理機制

    關(guān)于Java的動態(tài)代理機制

    這篇文章主要介紹了關(guān)于Java的動態(tài)代理機制,動態(tài)代理就是,在程序運行期,創(chuàng)建目標(biāo)對象的代理對象,并對目標(biāo)對象中的方法進行功能性增強的一種技術(shù),需要的朋友可以參考下
    2023-05-05
  • 關(guān)于springboot中對sqlSessionFactoryBean的自定義

    關(guān)于springboot中對sqlSessionFactoryBean的自定義

    這篇文章主要介紹了springboot中對sqlSessionFactoryBean的自定義方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Mockito mock Kotlin Object類方法報錯解決方法

    Mockito mock Kotlin Object類方法報錯解決方法

    這篇文章主要介紹了Mockito mock Kotlin Object類方法報錯解決方法,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • SpringCloud遠程服務(wù)調(diào)用實戰(zhàn)筆記

    SpringCloud遠程服務(wù)調(diào)用實戰(zhàn)筆記

    本文給大家介紹SpringCloud遠程服務(wù)調(diào)用實戰(zhàn)筆記,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-11-11

最新評論