最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中LambdaQueryWrapper的常用方法詳解

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

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)文章

  • Java如何跳過https的ssl證書驗證詳解

    Java如何跳過https的ssl證書驗證詳解

    這篇文章主要介紹了Java跳過https的ssl證書驗證的解決思路,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,下面我們來深入學(xué)習(xí)下吧
    2019-06-06
  • Mybatis CachingExecutor二級緩存使用示例詳解

    Mybatis CachingExecutor二級緩存使用示例詳解

    這篇文章主要介紹了?Mybatis的CachingExecutor與二級緩存使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 為什么Java項目中別用!=null做判空

    為什么Java項目中別用!=null做判空

    本文主要介紹了為什么Java項目中別用!=null做判空,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • java從命令行獲取數(shù)據(jù)的三種方式代碼實例

    java從命令行獲取數(shù)據(jù)的三種方式代碼實例

    這篇文章主要介紹了java從命令行獲取數(shù)據(jù)的三種方式代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • windows下 jdk1.7安裝教程圖解

    windows下 jdk1.7安裝教程圖解

    java編程的初學(xué)者在開始編碼前都會遇到一個難題,那就是jdk1.7環(huán)境變量配置怎么操作,怎么安裝,針對這個難題,小編特地為大家整理相關(guān)教程,不了解的朋友可以前往查看使用
    2018-05-05
  • 理解Java多線程之并發(fā)編程

    理解Java多線程之并發(fā)編程

    這篇文章主要介紹了理解Java多線程之并發(fā)編程的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Spring Boot集成Shiro實現(xiàn)動態(tài)加載權(quán)限的完整步驟

    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
  • 非常實用的java自動答題計時計分器

    非常實用的java自動答題計時計分器

    這篇文章主要為大家詳細(xì)介紹了非常實用的java自動答題計時計分器的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java獲取代碼中方法參數(shù)名信息的方法

    Java獲取代碼中方法參數(shù)名信息的方法

    在java中,可以通過反射獲取到類、字段、方法簽名等相關(guān)的信息,像方法名、返回值類型、參數(shù)類型、泛型類型參數(shù)等,但是不能夠獲取方法的參數(shù)名。在實際開發(fā)場景中,有時需要根據(jù)方法的參數(shù)名做一些操作,那么該如何操作了呢?下面就通過這篇文章來學(xué)習(xí)學(xué)習(xí)吧。
    2016-09-09
  • 解決fastjson從1.1.41升級到1.2.28后報錯問題詳解

    解決fastjson從1.1.41升級到1.2.28后報錯問題詳解

    這篇文章主要介紹了解決fastjson從1.1.41升級到1.2.28后報錯問題詳解,需要的朋友可以參考下
    2020-02-02

最新評論

平定县| 兴海县| 银川市| 南平市| 独山县| 颍上县| 晋江市| 清丰县| 阳信县| 龙口市| 江阴市| 文安县| 涞水县| 焦作市| 聂荣县| 平谷区| 西宁市| 南投县| 屯昌县| 沂南县| 济阳县| 勃利县| 皮山县| 淮阳县| 丹阳市| 景泰县| 乐至县| 福鼎市| 浦东新区| 威信县| 靖边县| 兴业县| 张家口市| 墨竹工卡县| 若羌县| 淮滨县| 花莲市| 老河口市| 松滋市| 塔城市| 弋阳县|