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

Mybatis-Plus Wrapper條件構(gòu)造器超詳細(xì)使用教程

 更新時(shí)間:2022年03月21日 15:26:43   作者:扎哇太棗糕  
接口方法的參數(shù)中,會(huì)出現(xiàn)各種 Wrapper,比如 queryWrapper、updateWrapper 等。Wrapper 的作用就是用于定義各種各樣的條件(where)。所以不管是查詢、更新、刪除都會(huì)用到Wrapper

Wrapper條件構(gòu)造器

條件構(gòu)造器wrapper就是用來(lái)封裝CRUD方法參數(shù)條件的一個(gè)接口,其底層有很多的子類,最主要的就是最下面的四個(gè)子類:

  • queryWrapper可以用來(lái)刪改查
  • updateWrapper可以在修改操作時(shí)不必創(chuàng)建實(shí)體類對(duì)象的操作
  • LambdaQueryWrapper和LambdaUpdateWrapper則是在字段參數(shù)的調(diào)用上進(jìn)行了升級(jí),其他都一樣

因?yàn)樵鰟h改查中的增加記錄不需要條件即可完成,所以增加方法無(wú)需條件構(gòu)造器wrapper,其他的刪改查則是有這個(gè)條件構(gòu)造器參數(shù)的

1 queryWrapper構(gòu)造器

1.1 組裝刪改查條件

組裝查詢條件

查詢條件為:名字里包含a字母、年齡在20~30之間、email不為空的所有值,且查詢到的值按照年齡降序排序,若年齡相同則按照id升序排序

查詢返回name、age、email字段

@Test
public void selectListTest() {
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
   queryWrapper.select("name", "age", "email")
   		  .like("name", "a")
           .between("age", 20, 30)
           .isNotNull("email")
           .orderByDesc("age")
           .orderByAsc("id");
   // SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL) ORDER BY age DESC,id ASC
   List<Map<String, Object>> maps = mapper.selectMaps(queryWrapper);
   maps.forEach(System.out::println);
   System.out.println("========================================================================================");
   List<User> users = mapper.selectList(queryWrapper);
   users.forEach(System.out::println);
}

?? selectMaps和selectList的區(qū)別在于:selectMaps會(huì)將查詢到的結(jié)果封裝在一個(gè)元素類型為map集合的list集合中,集合中只有查詢返回字段所對(duì)應(yīng)的鍵值對(duì);而selectList的返回值也是一個(gè)list集合,只不過(guò)元素類型為對(duì)應(yīng)的泛型,包含泛型所有的字段,查詢返回字段之外的值都為null

組裝刪除條件

刪除條件:email不為空

@Test
public void deleteTest() {
   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
   queryWrapper.isNull("email");
   // UPDATE user SET is_deleted=1 WHERE is_deleted=0 AND (email IS NULL)
   int result = mapper.delete(queryWrapper);
   System.out.println("刪除的行數(shù)為" + result);
}

組裝修改條件

修改條件:(年齡大于20并且用戶名中包含有a)或郵箱為null

@Test
public void updateTest() {
   User user = new User();
   user.setAge(20);
   user.setEmail("temporary.com");

   QueryWrapper<User> queryWrapper = new QueryWrapper<>();
   queryWrapper.gt("age", 20)
           .like("name", "a")
           .or()
           .isNull("email");

   // UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
   int result = mapper.update(user, queryWrapper);
   System.out.println("修改的行數(shù)為" + result);
}

1.2 條件優(yōu)先級(jí)

??使用queryWrapper組裝復(fù)雜條件的時(shí)候,存在一個(gè)且或條件的優(yōu)先級(jí)問(wèn)題,也就是說(shuō)在實(shí)現(xiàn)多條件拼接的時(shí)候且或條件該如何拼接到一起,接下來(lái)就挑取兩個(gè)例子來(lái)了解一下

// (年齡大于20并且用戶名中包含有a) 或 郵箱為null
// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (age > ? AND name LIKE ? OR email IS NULL)
queryWrapper.gt("age", 20)
                .like("name", "a")
                .or()
                .isNull("email");

// 用戶名中包含有a 且 (年齡大于18或郵箱為null)
// UPDATE user SET age=?, email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
queryWrapper.like("name", "a")
                .and(i -> i.gt("age", 18).or().isNull("email"));

??總結(jié)一下:Lambda表達(dá)式中的條件會(huì)被當(dāng)做一個(gè)整體優(yōu)先執(zhí)行,如果不括起來(lái)影響結(jié)果的話就需要使用Lambda表達(dá)式的寫(xiě)法,具體的使用要根據(jù)業(yè)務(wù)SQL語(yǔ)句來(lái)定

1.3 實(shí)現(xiàn)子查詢

@Test
public void sonSelectTest() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.inSql("id", "select id from user where id <= 100");

    // SELECT id,name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (id IN (select id from user where id <= 100))
    List<User> users = mapper.selectList(queryWrapper);
    users.forEach(System.out::println);
}

2 updateWrapper構(gòu)造器

2.1 升級(jí)修改方法(無(wú)需創(chuàng)建對(duì)象)

組裝修改條件 修改條件:用戶名中包含有a并且(年齡大于20或郵箱為null)

@Test
public void updateWrapperTest() {

   UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
   updateWrapper.like("name", "a")
           .and(i -> i.gt("age", 20).or().isNull("email"));
   updateWrapper.set("name", "小黑").set("email", "dhsjfghr");

   // UPDATE user SET name=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
   int result = mapper.update(null, updateWrapper);
   System.out.println("修改的行數(shù)為" + result);
}

由SQL可見(jiàn),使用updateWrapper和queryWrapper完成的修改功能一樣,且調(diào)用的方法也一樣(mapper.update),二者的區(qū)別就是updateWrapper不用創(chuàng)建實(shí)體類對(duì)象,直接使用set方法就可以設(shè)置修改的字段值

2.2 實(shí)際開(kāi)發(fā)時(shí)的應(yīng)用

??在實(shí)際開(kāi)發(fā)中,不管是queryWrapper還是updateWrapper都應(yīng)該在一定的判斷下再去使用條件構(gòu)造器拼接條件,比如說(shuō)請(qǐng)求傳過(guò)來(lái)的值在不為空的情況下才去對(duì)這個(gè)字段進(jìn)行條件設(shè)置,比如下面的這段代碼

@Test
public void ifTest() {

    String userName = "";
    Integer ageBegin = 20;
    Integer ageEnd = 30;

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();

    if (StringUtils.isNotBlank(userName)) {
        queryWrapper.like("name", userName);
    }
    if (ageBegin != null) {
        queryWrapper.ge("age", ageBegin);
    }
    if (ageEnd != null) {
        queryWrapper.le("age", ageEnd);
    }

    List<User> users = mapper.selectList(queryWrapper);
}

??然而,上面的代碼使用了很多的if判斷顯得過(guò)于冗余,于是許多的方法都帶有一個(gè)condition參數(shù),當(dāng)這個(gè)參數(shù)為true的時(shí)候才會(huì)拼接查詢條件,下面的代碼用來(lái)代替上面一堆的if判斷

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(userName), "name", userName)
        .ge(ageBegin != null, "age", ageBegin)
        .le(ageEnd != null, "age", ageEnd);

3 lambdaXxxWrapper構(gòu)造器

??lambdaXxxWrapper與xxxWrapper的區(qū)別就是:他們可以使用Lambda的方式直接調(diào)用對(duì)象的getter方法來(lái)指定字段,而不用對(duì)照數(shù)據(jù)庫(kù)中的字段名,這樣就樂(lè)意避免參數(shù)對(duì)應(yīng)不上數(shù)據(jù)庫(kù)字段的問(wèn)題。除了在調(diào)用字段時(shí)的寫(xiě)法不一樣之外,其他的寫(xiě)法上二者的方式都一樣

3.1 lambdaQueryWrapper構(gòu)造器

@Test
public void lambdaQueryWrapperTest() {

    String userName = "";
    Integer ageBegin = 20;
    Integer ageEnd = 30;

    LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
    lambdaQueryWrapper.like(StringUtils.isNotBlank(userName), User::getName, userName)
            .ge(ageBegin != null, User::getAge, ageBegin)
            .le(ageEnd != null, User::getAge, ageEnd);

    List<User> users = mapper.selectList(lambdaQueryWrapper);
}

3.2 lambdaUpdateWrapper構(gòu)造器

@Test
public void lambdaUpdateWrapperTest() {

    LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
    lambdaUpdateWrapper.like(User::getName, "a")
            .and(i -> i.gt(User::getAge, 20).or().isNull(User::getEmail));
    lambdaUpdateWrapper.set(User::getName, "小黑").set(User::getEmail, "dhsjfghr");

    // UPDATE user SET name=?,email=? WHERE is_deleted=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
    int result = mapper.update(null, lambdaUpdateWrapper);
    System.out.println("修改的行數(shù)為" + result);
}

到此這篇關(guān)于Mybatis-Plus Wrapper條件構(gòu)造器超詳細(xì)使用教程的文章就介紹到這了,更多相關(guān)Mybatis-Plus Wrapper條件構(gòu)造器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Java?Socket實(shí)現(xiàn)GPS定位數(shù)據(jù)處理

    使用Java?Socket實(shí)現(xiàn)GPS定位數(shù)據(jù)處理

    在許多應(yīng)用場(chǎng)景中,如車輛追蹤、移動(dòng)設(shè)備定位等,GPS定位數(shù)據(jù)的實(shí)時(shí)獲取和處理至關(guān)重要,本文將介紹如何使用Java?Socket編程來(lái)接收GPS設(shè)備發(fā)送的數(shù)據(jù)并進(jìn)行處理,需要的朋友可以參考下
    2024-07-07
  • 詳解Java?POI?excel自定義設(shè)置單元格格式

    詳解Java?POI?excel自定義設(shè)置單元格格式

    這篇文章主要介紹了Java?POI?excel設(shè)置單元格格式,自定義設(shè)置,設(shè)置單元格格式:來(lái)源_formats,更多數(shù)據(jù)類型從formats里面發(fā)現(xiàn),需要的朋友可以參考下
    2024-01-01
  • Spring Security基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)認(rèn)證過(guò)程解析

    Spring Security基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)認(rèn)證過(guò)程解析

    這篇文章主要介紹了Spring Security基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)認(rèn)證過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • idea啟動(dòng)項(xiàng)目報(bào)端口號(hào)沖突或被占用的解決方法

    idea啟動(dòng)項(xiàng)目報(bào)端口號(hào)沖突或被占用的解決方法

    這篇文章主要介紹了idea啟動(dòng)項(xiàng)目報(bào)端口號(hào)沖突或被占用的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Java實(shí)現(xiàn)并查集

    Java實(shí)現(xiàn)并查集

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)并查集,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Spring MVC的web.xml配置詳解

    Spring MVC的web.xml配置詳解

    這篇文章主要介紹了Spring MVC的web.xml配置詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • 詳解Java實(shí)現(xiàn)LRU緩存

    詳解Java實(shí)現(xiàn)LRU緩存

    這篇文章主要介紹了詳解Java實(shí)現(xiàn)LRU緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java String index out of range:100錯(cuò)誤解決方案詳解

    Java String index out of range:100錯(cuò)誤解決方案詳解

    這篇文章主要介紹了Java String index out of range:100錯(cuò)誤解決方案詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java11 發(fā)布前抓緊掌握這些新特性

    Java11 發(fā)布前抓緊掌握這些新特性

    Java 11即將發(fā)布,你準(zhǔn)備好了? 在這篇文章中,我們討論下在進(jìn)入Java 11之前,你需要了解的Java 8、9和10的一些有用功能,若還在用Java 8以前的版本,那就太落伍了,這里首先要明確,Java 8:是一個(gè)針對(duì)傳統(tǒng)傳統(tǒng)版本的重大轉(zhuǎn)變
    2018-09-09
  • Java執(zhí)行JS腳本工具

    Java執(zhí)行JS腳本工具

    今天小編就為大家分享一篇關(guān)于Java執(zhí)行JS腳本工具,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12

最新評(píng)論

台南市| 凤城市| 滨州市| 名山县| 鄄城县| 林州市| 南城县| 龙江县| 古田县| 泽库县| 北碚区| 子洲县| 综艺| 鄄城县| 怀柔区| 桂东县| 平山县| 桂阳县| 交城县| 韶山市| 长阳| 奉贤区| 海南省| 上栗县| 嵊泗县| 云龙县| 鄂托克旗| 永城市| 成安县| 兰西县| 金阳县| 临沭县| 庆元县| 新余市| 清丰县| 长宁区| 同心县| 周至县| 南召县| 剑阁县| 温宿县|