日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

MyBatis-Plus:條件構造器Wrapper

作者:月半花開 更新時間: 2024-03-24 編程語言

目錄

1.Wrapper概述

1.1.Wrapper的繼承關系

1.2.Wapper介紹?

1.3.各個構造器使用區別

1.4.構造器常用方法

2.Wrapper常用構造器介紹

2.1.QueryWrapper

2.2.UpdateWrapper

2.3.LambdaQueryWrapper

2.4.AbstractWrapper

3. Lambda條件構造器

3.1.示例

4.鳴謝


?????1.Wrapper概述

????????我們在實際操作數據庫的時候會涉及到很多的條件。所以MP為我們提供了一個功能強大的條件構造器?Wrapper?。使用它可以讓我們非常方便的構造條件。

????????Wrapper是MyBatis-Plus提供的一種查詢條件封裝類,用于構建查詢條件。它是一個抽象類,有三個具體的實現類,分別是QueryWrapper、UpdateWrapper和LambdaQueryWrapper。其中,QueryWrapper和LambdaQueryWrapper用于構建查詢條件,UpdateWrapper用于構建更新條件。

????????使用Wrapper可以方便地構建復雜的查詢條件,支持鏈式調用,可以通過and、or等方法將多個條件組合起來。同時,Wrapper還提供了一些常用的方法,如eq、ne、gt、ge、lt、le等,可以方便地構建等值、不等值、大于、小于等各種條件。

????????另外,LambdaQueryWrapper是MyBatis-Plus 3.x新增的功能,它支持使用Lambda表達式構建查詢條件,使得代碼更加簡潔易讀。

1.1.Wrapper的繼承關系

在這里插入圖片描述

Wrapper  條件構造抽象類
    -- AbstractWrapper 查詢條件封裝,用于生成 sql 中的 where 語句。
        -- QueryWrapper Entity 對象封裝操作類,用于查詢。
        -- UpdateWrapper Update 條件封裝操作類,用于更新。
        -- AbstractLambdaWrapper 使用 Lambda 表達式封裝 wrapper
            -- LambdaQueryWrapper 使用 Lambda 語法封裝條件,用于查詢。
            -- LambdaUpdateWrapper 使用 Lambda 語法封裝條件,用于更新。

MybatisPlus的EntityWrapper,在3.0版本以上就沒了,改為了QueryWrapper。?

1.2.Wapper介紹?

Wrapper : 條件構造抽象類,最頂端父類

AbstractWrapper : 用于查詢條件封裝,生成 sql 的 where 條件

QueryWrapper : Entity 對象封裝操作類,不是用lambda語法

UpdateWrapper : Update 條件封裝,用于Entity對象更新操作

AbstractLambdaWrapper : Lambda 語法使用 Wrapper統一處理解析 lambda 獲取 column。

LambdaQueryWrapper :看名稱也能明白就是用于Lambda語法使用的查詢Wrapper

LambdaUpdateWrapper : Lambda 更新封裝Wrapper

1.3.各個構造器使用區別

????????1)QueryWrapper、QueryChainWrapper只能指定需要的數據庫列名;
????????2)LambdaQueryWrapper、LambdaQueryChainWrapper可以通過Lambda獲取數據庫列名;
????????3)QueryWrapper?、LambdaQueryWrapper不能使用鏈式查詢的方式,必須借助BaseMapper來執行;
????????4)QueryChainWrapper、LambdaQueryChainWrapper可以使用鏈式查詢的方式,如list(),one();

1.4.構造器常用方法

  • eq:equals,等于

  • gt:greater than ,大于 >

  • ge:greater than or equals,大于等于≥

  • lt:less than,小于<

  • le:less than or equals,小于等于≤

  • between:相當于SQL中的BETWEEN

  • like:模糊匹配。like(“name”,“黃”),相當于SQL的name like ‘%黃%’

  • likeRight:模糊匹配右半邊。likeRight(“name”,“黃”),相當于SQL的name like ‘黃%’

  • likeLeft:模糊匹配左半邊。likeLeft(“name”,“黃”),相當于SQL的name like ‘%黃’

  • notLike:notLike(“name”,“黃”),相當于SQL的name not like ‘%黃%’

  • isNull

  • isNotNull

  • and:SQL連接符AND

  • or:SQL連接符OR

  • in: in(“age",{1,2,3})相當于 age in(1,2,3)

  • groupBy: groupBy(“id”,“name”)相當于 group by id,name

  • orderByAsc :orderByAsc(“id”,“name”)相當于 order by id ASC,name ASC

  • orderByDesc :orderByDesc (“id”,“name”)相當于 order by id DESC,name DESC

?

2.Wrapper常用構造器介紹

????????字面來理解,就是定義各種各樣的條件,相當于sql語句中的(where),wrapper條件構造器是一個接口,是一個頂級父類,它下面有各種實現類,今天重點介紹LambdaQueryWrapper和LambdaUpdateWrapper

2.1.QueryWrapper

????????QueryWrapper是用于查詢的Wrapper條件構造器,可以通過它來構建SELECT語句中的WHERE條件

    @Test
    public void testQueryWrapper() {
    // 查詢條件構造器
    QueryWrapper<BannerItem> wrapper = new QueryWrapper<>();
    wrapper.eq("banner_id", id);
    // 查詢操作
    List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);


    //我們可以引入lambda,避免在代碼中寫類似的于banner_id的硬編碼
    QueryWrapper<BannerItem> wrapper = new QueryWrapper<>();
    wrapper.lambda().eq(BannerItem::getBannerId, id);
    List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);
    }

2.2.UpdateWrapper

????????QueryWrapper是用于查詢的Wrapper條件構造器,可以通過它來構建SELECT語句中的WHERE條件:

SQL SET 字段
????????例:?set("name", "老李頭")
????????例:?set("name", "")--->數據庫字段值變為空字符串
????????例:?set("name", null)--->數據庫字段值變為null ? ?

    @Test
    public void testUpdateWrapper() {

    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();

    updateWrapper.set("age", 20).eq("name", "張三");

    int affectedRows = userMapper.update(null, updateWrapper);

    }

2.3.LambdaQueryWrapper

????????Lambda條件構造器是一種更加便捷、類型安全的Wrapper條件構造器,可以通過Lambda表達式來構建WHERE條件

作用:

????????1)字段檢查,防止字段寫錯

????????2)防止傳入的數據為null作為條件

書寫方式如下:

????????1)引入對象

????????2)調用函數

為了簡化lambda的使用,我們可以改寫成LambdaQueryWrapper構造器,語法如下:

LambdaQueryWrapper<BannerItem> wrapper = new QueryWrapper<BannerItem>().lambda();
wrapper.eq(BannerItem::getBannerId, id);
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);

我們可以再次將QueryWrapper<BannerItem>.lambda()簡化,變成這個樣子

LambdaQueryWrapper<BannerItem> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(BannerItem::getBannerId, id);
List<BannerItem> bannerItems = bannerItemMapper.selectList(wrapper);

鏈式查詢
MyBatis-Plus還提供了一種鏈式查詢的方式,和上面的代碼效果一樣。
但是這種寫法偏向于炫技,可讀性沒有上面的代碼強,大家可以根據需要自行選擇方式。

List<BannerItem> bannerItems = new LambdaQueryChainWrapper<>(bannerItemMapper)
? ? ? ? ? ? ? ? ? ? ? ? .eq(BannerItem::getBannerId, id)
? ? ? ? ? ? ? ? ? ? ? ? .list();

如果只想查詢一條記錄,例如通過id查詢某條記錄的詳情,使用.one()即可,例如

BannerItem bannerItem = new LambdaQueryChainWrapper<>(bannerItemMapper)
? ? ? ? ? ? ? ? ? ? ? ? .eq(BannerItem::getId, id)
? ? ? ? ? ? ? ? ? ? ? ? .one();

2.4.AbstractWrapper

完整的AbstractWrapper方法可以參照:?https://baomidou.com/guide/wrapper.html#abstractwrapper

3. Lambda條件構造器

?????????前面在使用條件構造器時列名都是用字符串的形式去指定。這種方式無法在編譯期確定列名的合法性。

?????????所以MP提供了一個Lambda條件構造器可以讓我們直接以實體類的方法引用的形式來指定列名。

Lambda條件構造器相比于傳統的Wrapper條件構造器,具有以下幾個好處:

  1. 更加簡潔易懂:Lambda條件構造器使用Lambda表達式來構建WHERE條件,代碼更加簡潔易懂,不需要繁瑣的字符串拼接(避免硬編碼)。

  2. 更加類型安全:Lambda條件構造器在編譯時就能檢查出類型錯誤,避免在運行時出現類型轉換異常的問題。

  3. 更加靈活:Lambda條件構造器支持鏈式調用,可以方便地組合多個條件,還支持自定義SQL片段,更加靈活

3.1.示例

要執行的查詢對應的SQL如下

SELECT 
	id,user_name,PASSWORD,NAME,age,address 
FROM 
	USER 
WHERE 
	age > 18 AND address = '狐山'

如果使用之前的條件構造器寫法如下

    @Test
    public void testLambdaWrapper(){
        QueryWrapper<User> queryWrapper = new QueryWrapper();
        queryWrapper.gt("age",30);
        queryWrapper.eq("address","黃山");
        List<User> users = userMapper.selectList(queryWrapper);
    }

如果使用Lambda條件構造器寫法如下

    @Test
    public void testLambdaWrapper2(){
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.gt(User::getAge,30);
        queryWrapper.eq(User::getAddress,"黃山");
        List<User> users = userMapper.selectList(queryWrapper);
    }

4.鳴謝

[1] https://blog.csdn.net/lt326030434/article/details/106571670

原文鏈接:https://blog.csdn.net/qq_20957669/article/details/130395978

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新