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

MyBatis-Plus?中?nested()?與?and()?方法詳解(最佳實踐場景)

 更新時間:2025年07月03日 15:57:15   作者:千層冷面  
在MyBatis-Plus的條件構(gòu)造器中,nested()和and()都是用于構(gòu)建復(fù)雜查詢條件的關(guān)鍵方法,但它們在功能和使用場景上有顯著差異,本文給大家介紹MyBatis-Plus中nested()與and()方法,感興趣的朋友一起看看吧

MyBatis-Plus 中nested()與and()方法詳解

在 MyBatis-Plus 的條件構(gòu)造器中,nested()and() 都是用于構(gòu)建復(fù)雜查詢條件的關(guān)鍵方法,但它們在功能和使用場景上有顯著差異。

一、核心區(qū)別對比

特性and()nested()
主要用途連接多個條件(默認AND)創(chuàng)建嵌套查詢條件
括號生成? 不生成括號? 自動生成括號包裹內(nèi)部條件
邏輯關(guān)系與外部條件默認AND連接可作為獨立邏輯單元
復(fù)雜查詢支持有限,適合簡單條件組合強大,支持任意層級嵌套
OR 條件處理需要顯式使用or()天然支持OR條件嵌套
SQL 表現(xiàn)平鋪條件生成帶括號的子表達式

二、方法詳解

1.and()方法

  • 功能:連接多個查詢條件,默認使用 AND 邏輯
  • 特點
    • 不會生成括號
    • 適用于簡單的條件組合
    • 當(dāng)需要 OR 邏輯時需顯式調(diào)用 or()
使用示例:
// 查詢年齡大于18且姓張的用戶
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 18)
       .and(wq -> wq.like("name", "張"));

生成 SQL

WHERE age > 18 AND name LIKE '%張%'

2.nested()方法

  • 功能:創(chuàng)建嵌套查詢條件(自動添加括號)
  • 特點
    • 自動生成括號包裹內(nèi)部條件
    • 支持任意層級的復(fù)雜嵌套
    • 特別適合處理 OR 邏輯組合
    • 使SQL邏輯更清晰
使用示例:
// 查詢(年齡>30 或 工資>10000) 且 狀態(tài)為激活的用戶
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.nested(nq -> 
        nq.gt("age", 30).or().gt("salary", 10000))
    .eq("status", 1);

生成 SQL

WHERE (age > 30 OR salary > 10000) AND status = 1

三、高級用法對比

1. 復(fù)雜 OR 條件處理

使用 and() 實現(xiàn):

wrapper.and(wq -> wq.gt("age", 30).or().gt("salary", 10000))
       .eq("status", 1);
-- 邏輯錯誤!實際生成:
WHERE (age > 30 OR salary > 10000 AND status = 1)
-- 正確應(yīng)使用括號包裹OR條件

使用 nested() 實現(xiàn):

wrapper.nested(nq -> nq.gt("age", 30).or().gt("salary", 10000))
       .eq("status", 1);
-- 正確生成:
WHERE (age > 30 OR salary > 10000) AND status = 1

2. 多層級嵌套

nested() 支持無限嵌套:

wrapper.nested(nq1 -> 
    nq1.eq("type", 1)
       .nested(nq2 -> 
           nq2.lt("age", 20).or().gt("age", 60))
    )
    .like("name", "張");

生成 SQL

WHERE (type = 1 AND (age < 20 OR age > 60)) 
AND name LIKE '%張%'

四、最佳實踐場景

使用and()當(dāng):

  1. 構(gòu)建簡單的 AND 條件組合
  2. 不需要改變條件優(yōu)先級
  3. 查詢條件邏輯簡單平鋪

使用nested()當(dāng):

  1. 需要處理 OR 條件組合
  2. 需要改變條件運算優(yōu)先級
  3. 構(gòu)建復(fù)雜嵌套查詢
  4. 需要清晰分隔邏輯單元
  5. 處理多條件分支邏輯

混合使用示例:

wrapper.eq("dept_id", 10)
       .nested(nq -> 
           nq.like("name", "張")
             .or()
             .nested(nq2 -> 
                 nq2.gt("salary", 10000).lt("age", 40))
       );

生成 SQL

WHERE dept_id = 10 
AND (name LIKE '%張%' OR (salary > 10000 AND age < 40))

五、原理分析

1.and()實現(xiàn)原理

public Children and(Consumer<Param> consumer) {
    return addNestedCondition(true, consumer);
}
  • 內(nèi)部調(diào)用 addNestedCondition
  • 參數(shù) true 表示使用 AND 連接
  • 不添加括號

2.nested()實現(xiàn)原理

public Children nested(Consumer<Param> consumer) {
    return addNestedCondition(false, consumer);
}
  • 參數(shù) false 表示不指定連接類型
  • 自動添加括號包裹表達式
  • 可作為獨立邏輯單元嵌入

六、常見誤區(qū)

  1. 錯誤認為 and() 會加括號

    • ? 只有 nested() 會生成括號
  2. 在 OR 條件中錯誤使用 and()

    // 錯誤:OR條件未正確包裹
    wrapper.eq("a", 1)
           .or()
           .and(wq -> wq.eq("b", 2).eq("c", 3));
    // 正確:使用nested
    wrapper.eq("a", 1)
           .or()
           .nested(nq -> nq.eq("b", 2).eq("c", 3));
  3. 忽略條件優(yōu)先級

    // 錯誤:AND/OR優(yōu)先級問題
    wrapper.eq("status", 1)
           .or()
           .eq("deleted", 0)
           .eq("name", "test");
    // 正確:使用nested明確優(yōu)先級
    wrapper.nested(nq -> nq.eq("status", 1).or().eq("deleted", 0))
           .eq("name", "test");

七、性能考慮

  1. 數(shù)據(jù)庫優(yōu)化

    • 嵌套條件可能影響查詢優(yōu)化器的工作
    • 避免超過3層嵌套(影響可讀性和性能)
  2. 索引利用

    // 好的實踐:索引列前置
    wrapper.nested(nq -> 
        nq.eq("indexed_column1", val1)  // 索引列
           .or()
           .eq("indexed_column2", val2) // 索引列
    );
    // 避免:非索引列前置
    wrapper.nested(nq -> 
        nq.eq("non_indexed", val)      // 非索引列
           .or()
           .eq("indexed_column", val)   // 索引列
    );

總結(jié)

場景推薦方法
簡單AND條件組合and()
OR條件組合nested()
改變條件優(yōu)先級nested()
多層級復(fù)雜查詢nested()
邏輯單元清晰分隔nested()

經(jīng)驗法則

當(dāng)需要括號來明確查詢邏輯時,總是使用 nested()
當(dāng)只是簡單添加AND條件時,使用 and()。

正確使用這兩個方法可以使你的MyBatis-Plus查詢:

  1. 邏輯更清晰
  2. 優(yōu)先級更明確
  3. 更易維護
  4. 充分利用數(shù)據(jù)庫優(yōu)化能力
  5. 避免難以調(diào)試的邏輯錯誤

到此這篇關(guān)于MyBatis-Plus 中 nested() 與 and() 方法詳解的文章就介紹到這了,更多相關(guān)MyBatis-Plus nested() 與 and() 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

营山县| 弥勒县| 建德市| 抚顺县| 宿迁市| 新绛县| 醴陵市| 望江县| 和林格尔县| 静海县| 广西| 福海县| 四川省| 康平县| 波密县| 醴陵市| 鸡泽县| 石首市| 灵武市| 长葛市| 咸阳市| 乌海市| 荥经县| 玛多县| 土默特右旗| 成都市| 白玉县| 肃南| 平舆县| 沐川县| 南木林县| 扎兰屯市| 沧州市| 西安市| 青川县| 盈江县| 息烽县| 岳阳县| 巴彦淖尔市| 烟台市| 平潭县|