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

QueryWrapper中or的使用技巧分享

 更新時(shí)間:2024年10月22日 09:26:57   作者:Kwan的解憂雜貨鋪  
在日常的開發(fā)工作中,處理數(shù)據(jù)庫(kù)查詢是一個(gè)非常常見的任務(wù),尤其是當(dāng)我們需要在復(fù)雜條件下篩選數(shù)據(jù)時(shí),如何編寫高效、簡(jiǎn)潔且可維護(hù)的查詢邏輯顯得尤為重要,本文給大家介紹了QueryWrapper中or的使用技巧,需要的朋友可以參考下

場(chǎng)景描述

假設(shè)我們正在開發(fā)一個(gè)郵件系統(tǒng),系統(tǒng)中有一個(gè)名為 MailInfo 的表,用于存儲(chǔ)郵件信息。該表有兩個(gè)字段與用戶相關(guān):user_id 表示郵件的發(fā)送者,to_user_id 表示郵件的接收者。我們需要編寫一個(gè)查詢,找出當(dāng)前用戶(userId)所有與其相關(guān)的郵件,不論是他發(fā)送的,還是接收到的。此外,我們還要確保這些郵件未被刪除,并且按更新時(shí)間進(jìn)行排序。

需求拆解

根據(jù)上述需求,我們需要實(shí)現(xiàn)以下幾點(diǎn):

  • 過(guò)濾掉已刪除的郵件(即 is_delete = 0)。
  • 查詢條件包括 user_id 或 to_user_id 等于當(dāng)前用戶 ID。
  • 按照更新時(shí)間(update_time)降序排序結(jié)果,以確保最新的郵件顯示在前面。

這些需求在 SQL 中可以通過(guò)一個(gè)簡(jiǎn)單的 SELECT 語(yǔ)句來(lái)實(shí)現(xiàn),類似于:

SELECT * FROM MailInfo
WHERE is_delete = 0
AND (user_id = ? OR to_user_id = ?)
ORDER BY update_time DESC;

但在 Java 開發(fā)中,尤其是使用了 MyBatis-Plus 這樣一個(gè) ORM 框架時(shí),我們通常會(huì)使用 QueryWrapper 來(lái)構(gòu)造查詢條件,以提高代碼的可讀性和可維護(hù)性。

使用 MyBatis-Plus 構(gòu)建查詢條件

在 MyBatis-Plus 中,QueryWrapper 是一個(gè)非常強(qiáng)大的查詢構(gòu)造器,它可以通過(guò)流式 API 來(lái)動(dòng)態(tài)地構(gòu)造 SQL 查詢。在處理復(fù)雜查詢條件時(shí),例如 OR 和 AND 的組合,它也提供了相應(yīng)的接口來(lái)滿足需求。

下面我們來(lái)看一個(gè)具體的代碼示例,展示如何通過(guò) QueryWrapper 來(lái)構(gòu)建我們的查詢條件:

Page<MailInfo> pageParm = new Page<>();
pageParm.setCurrent(page);
pageParm.setSize(pageSize);
QueryWrapper<MailInfo> wrapper = new QueryWrapper<>();
wrapper.eq("is_delete", 0)  // 只查詢未刪除的郵件
       .and(w -> w.eq("user_id", userId).or().eq("to_user_id", userId))  // 查詢當(dāng)前用戶發(fā)送或接收的郵件
       .orderByDesc("update_time");  // 按更新時(shí)間降序排序

return Result.ok(MailInfoDTO.Converter.INSTANCE.from(this.mailInfoService.page(pageParm, wrapper)));

代碼解析

1. 分頁(yè)參數(shù)

Page<MailInfo> pageParm = new Page<>();
pageParm.setCurrent(page);
pageParm.setSize(pageSize);

在大多數(shù)業(yè)務(wù)場(chǎng)景中,我們會(huì)對(duì)查詢結(jié)果進(jìn)行分頁(yè)處理,以避免一次性返回過(guò)多數(shù)據(jù),影響性能。MyBatis-Plus 提供了 Page 類來(lái)處理分頁(yè)邏輯。在這段代碼中,我們通過(guò) setCurrent 方法設(shè)置當(dāng)前頁(yè)數(shù),并通過(guò) setSize 設(shè)置每頁(yè)返回的記錄數(shù)量。

2. 構(gòu)造查詢條件

QueryWrapper<MailInfo> wrapper = new QueryWrapper<>();
wrapper.eq("is_delete", 0)
       .and(w -> w.eq("user_id", userId).or().eq("to_user_id", userId));

這里的 QueryWrapper 是 MyBatis-Plus 提供的查詢構(gòu)造器,允許我們通過(guò)流式的方式來(lái)構(gòu)造查詢條件。

  • eq("is_delete", 0):添加一個(gè) is_delete = 0 的條件,確保只查詢未被標(biāo)記為刪除的郵件。
  • and(w -> w.eq("user_id", userId).or().eq("to_user_id", userId)):這是查詢條件的核心部分。我們通過(guò) and 方法組合多個(gè)條件,使用 Lambda 表達(dá)式 w 作為內(nèi)部查詢條件的參數(shù)。在 Lambda 表達(dá)式內(nèi)部,先通過(guò) eq("user_id", userId) 查詢發(fā)送者為當(dāng)前用戶的郵件,再通過(guò) or().eq("to_user_id", userId) 查詢接收者為當(dāng)前用戶的郵件。通過(guò)這種方式,查詢結(jié)果將包含所有與當(dāng)前用戶相關(guān)的郵件記錄。

3. 排序條件

wrapper.orderByDesc("update_time");

這行代碼用于指定排序條件。我們希望按郵件的更新時(shí)間從新到舊進(jìn)行排序,因此使用了 orderByDesc 方法,并將 update_time 作為排序字段。

結(jié)果封裝

在實(shí)際的開發(fā)過(guò)程中,我們通常會(huì)將查詢結(jié)果封裝為一個(gè)統(tǒng)一的返回結(jié)構(gòu)。在這個(gè)例子中,我們將查詢結(jié)果封裝為 Result.ok,并通過(guò) MailInfoDTO.Converter.INSTANCE 進(jìn)行數(shù)據(jù)轉(zhuǎn)換,將數(shù)據(jù)庫(kù)實(shí)體類 MailInfo 轉(zhuǎn)換為 MailInfoDTO。

QueryWrapper 的 or 使用技巧

在使用 QueryWrapper 構(gòu)建查詢時(shí),or 方法是一個(gè)非常有用的工具。它允許我們?cè)诓樵冎刑砑佣鄠€(gè)可能的條件,從而使查詢結(jié)果更加靈活。在本文的例子中,我們使用了 or 來(lái)查詢 user_id 或 to_user_id 等于 userId 的記錄,從而滿足了業(yè)務(wù)需求。

但是,使用 or 也需要小心,因?yàn)樗赡軙?huì)影響查詢的性能。在涉及大量數(shù)據(jù)時(shí),OR 條件的查詢速度可能會(huì)較慢。為此,我們可以考慮以下優(yōu)化策略:

  1. 創(chuàng)建索引:確保 user_id 和 to_user_id 字段上創(chuàng)建了索引,這樣可以大幅提高查詢速度。
  2. 使用緩存:在高頻率訪問(wèn)的場(chǎng)景下,適當(dāng)?shù)厥褂镁彺婵梢詼p少數(shù)據(jù)庫(kù)查詢次數(shù),提升系統(tǒng)的整體性能。
  3. 分表設(shè)計(jì):如果 MailInfo 表的數(shù)據(jù)量非常大,可以考慮通過(guò)分表來(lái)降低單個(gè)表的查詢壓力。

到此這篇關(guān)于QueryWrapper中or的使用技巧分享的文章就介紹到這了,更多相關(guān)QueryWrapper or使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java多線程編程之線程的生命周期

    java多線程編程之線程的生命周期

    線程要經(jīng)歷開始(等待)、運(yùn)行、掛起和停止四種不同的狀態(tài)。這四種狀態(tài)都可以通過(guò)Thread類中的方法進(jìn)行控制。下面給出了Thread類中和這四種狀態(tài)相關(guān)的方法
    2014-01-01
  • Java協(xié)議字節(jié)操作工具類詳情

    Java協(xié)議字節(jié)操作工具類詳情

    這篇文章主要介紹了Java協(xié)議字節(jié)操作工具類詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • java收集器Collector案例匯總

    java收集器Collector案例匯總

    這篇文章主要介紹了java收集器Collector案例匯總,Collectors作為Stream的collect方法的參數(shù),Collector是一個(gè)接口,它是一個(gè)可變的匯聚操作,更多相關(guān)介紹,需要的朋友可以參考下
    2022-06-06
  • 使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問(wèn)題

    使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問(wèn)題

    這篇文章主要介紹了使用多個(gè)servlet時(shí)Spring security需要指明路由匹配策略問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java實(shí)現(xiàn)九九乘法表的完整實(shí)例(對(duì)齊版)

    Java實(shí)現(xiàn)九九乘法表的完整實(shí)例(對(duì)齊版)

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)九九乘法表(對(duì)齊版)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • java如何獲取兩個(gè)List集合之間的交集、差集、并集

    java如何獲取兩個(gè)List集合之間的交集、差集、并集

    在日常開發(fā)中經(jīng)常會(huì)遇到對(duì)2個(gè)集合的操作,例如2個(gè)集合之間取相同的元素(交集),2個(gè)集合之間取不相同的元素(差集)等等,這篇文章主要給大家介紹了關(guān)于java如何獲取兩個(gè)List集合之間的交集、差集、并集的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • 全面解讀Java編程中的內(nèi)部類

    全面解讀Java編程中的內(nèi)部類

    這篇文章主要介紹了Java的內(nèi)部類,包括類成員訪問(wèn)等Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • java 數(shù)據(jù)結(jié)構(gòu)中棧和隊(duì)列的實(shí)例詳解

    java 數(shù)據(jù)結(jié)構(gòu)中棧和隊(duì)列的實(shí)例詳解

    這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)中棧和隊(duì)列的實(shí)例詳解的相關(guān)資料,主要使用數(shù)組與線性表的方法來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2017-09-09
  • Java8 Stream flatmap中間操作用法解析

    Java8 Stream flatmap中間操作用法解析

    這篇文章主要介紹了Java8 Stream flatmap中間操作用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • MyBatis批量插入的五種方式

    MyBatis批量插入的五種方式

    這篇文章主要介紹了MyBatis批量插入的五種方式,每種方式結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

鸡泽县| 景谷| 镇坪县| 尼木县| 仪征市| 梧州市| 永福县| 冷水江市| 贵州省| 武鸣县| 茂名市| 峡江县| 洪泽县| 大名县| 双流县| 浦江县| 宿松县| 西藏| 苍梧县| 阳曲县| 开阳县| 鞍山市| 凤庆县| 广水市| 无锡市| 安岳县| 杨浦区| 水富县| 黑山县| 连州市| 和田县| 林甸县| 永城市| 台中县| 瑞安市| 凭祥市| 成安县| 庆元县| 安塞县| 哈巴河县| 木里|