亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java中LambdaQueryWrapper的常用方法詳解

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

1、查看項(xiàng)目中是否導(dǎo)入mybatisPlus的jar包

2、servie 層和實(shí)現(xiàn)類要集成mybatisPlus

service 繼承IService<>

實(shí)現(xiàn)類中要繼承IService的實(shí)現(xiàn)類ServiceImpl<mapper,實(shí)體類>

3、如果想要mapper中的一些方法,mapper 要繼承BaseMapper<實(shí)體類>

4、在實(shí)現(xiàn)類中實(shí)現(xiàn)方法,不需要在xml中寫(xiě)一個(gè)方法了,常用的方法

總結(jié)如下:

【1】分頁(yè)

參數(shù)1是分頁(yè)起始位置,一般是1,參數(shù)2:結(jié)束位置,    一般都是前端傳過(guò)來(lái)的,查詢的數(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的分頁(yè)對(duì)象,參數(shù)2是lambda表達(dá)式查詢條件
IPage<LandLossAllowance> iPage = page(page1, queryWrapper);

(一)PageHelper和IPage區(qū)別: 

使用方法:

PageHelper.startPage()然后后邊寫(xiě)sql就可以。 緊接著的一個(gè)sql起作用。

IPage則需要在dao層傳入IPage的實(shí)現(xiàn)類Page對(duì)象,該對(duì)象實(shí)現(xiàn)了IPage。

區(qū)別:

PageHelper內(nèi)部原理是將傳入的頁(yè)碼和條數(shù)賦值給了Page對(duì)象,保存到了一個(gè)本地線程ThreadLoacl中,然后會(huì)進(jìn)入Mybatis的攔截器中。
    然后再攔截器中獲取本地線程中保存的分頁(yè)的參數(shù)。最后再將這寫(xiě)分頁(yè)參數(shù)和原本的sql以及內(nèi)部定義好的sql進(jìn)行拼接完成sql的分頁(yè)處理。
    中間會(huì)進(jìn)行判斷該sql 的類型是查詢還是修改操作。如果是查詢才會(huì)進(jìn)入分頁(yè)的邏輯并判斷封裝好的Page對(duì)象是否是null,null則不分頁(yè),否則分頁(yè)。

IPage內(nèi)部原理也是基于攔截器,但是這個(gè)攔截的是方法以及方法中的參數(shù),這個(gè)也會(huì)判斷是否是查詢操作。如果是查詢操作,才會(huì)進(jìn)入分頁(yè)的處理邏輯。
進(jìn)入分頁(yè)邏輯處理后,攔截器會(huì)通過(guò)反射獲取該方法的參數(shù)進(jìn)行判斷是否存在IPage對(duì)象的實(shí)現(xiàn)類。如果不存在則不進(jìn)行分頁(yè),存在則將該參數(shù)賦值給IPage對(duì)象。
然后進(jìn)行拼接sql的處理完成分頁(yè)操作。
但是使用IPage需要注入一個(gè)bean攔截器交給spring進(jìn)行管理。如下。否則不會(huì)進(jìn)行攔截。

使用Ipage之后,需要注入一些配置:

@Configuration
@MapperScan(value={"com.XX.**.mapper*"})
public class MybatisPlusConfig {
    /**
     * 分頁(yè)插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        // 設(shè)置sql的limit為無(wú)限制,默認(rèn)是500
        return new PaginationInterceptor().setLimit(-1);
    }
}

(二)常用的lambda表達(dá)式的一些定義

com.baomidou.mybatisplus.core.conditions.query.QueryWrapper是MybatisPlus框架構(gòu)造查詢條件常用的對(duì)象

使用lambda表達(dá)式寫(xiě)法更為清晰,簡(jiǎn)潔:

 QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  queryWrapper.lambda().eq(User::getName,"aa");
  queryWrapper.lambda().ge(User::getAge,20);

默認(rèn)情況下多個(gè)條件是and連接:上述寫(xiě)法對(duì)應(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);
});

這里引申下我遇到的一個(gè)場(chǎng)景:需要or連接的是一個(gè)集合內(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);
    }

這里說(shuō)明一下or和and的問(wèn)題

錯(cuò)誤代碼

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ù)上面的寫(xiě)法寫(xiě)出的sql語(yǔ)句如下:

WHERE id = '1' 
    AND name LIKE '%張%'
    OR email LIKE '%163%'
    OR age LIKE '%1%'

這樣明顯是不對(duì)的,根據(jù)mysql語(yǔ)句執(zhí)行順序or最后執(zhí)行 ,這會(huì)導(dǎo)致一旦[name like '%張%']條件成立后面的or條件就會(huì)失效,所以第一個(gè)條件 并沒(méi)有起到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語(yǔ)句如下

WHERE id = '1' 
    AND (name LIKE '%張%'
    OR email LIKE '%163%'
    OR age LIKE '%1%')

這樣就解決了,這個(gè)問(wèn)題在我的公司中新人(包括我在內(nèi))貌似都遇到這個(gè)問(wèn)題,在此說(shuō)明一下

last

在末尾拼接sql語(yǔ)句

注:last()有sql注入的風(fēng)險(xiǎn),請(qǐ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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springBoot加入thymeleaf模板的方式

    springBoot加入thymeleaf模板的方式

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

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

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

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

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

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

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

    詳細(xì)分析JAVA加解密算法

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

    解決Spring使用@MapperScan問(wèn)題

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

    關(guān)于Java的動(dòng)態(tài)代理機(jī)制

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

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

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

    Mockito mock Kotlin Object類方法報(bào)錯(cuò)解決方法

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

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

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

最新評(píng)論