欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

QueryWrapper中or的使用技巧分享

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

場(chǎng)景描述

假設(shè)我們正在開(kāi)發(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 開(kāi)發(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í)際的開(kāi)發(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)文章

  • spring boot實(shí)現(xiàn)驗(yàn)證碼功能

    spring boot實(shí)現(xiàn)驗(yàn)證碼功能

    這篇文章主要為大家詳細(xì)介紹了spring boot實(shí)現(xiàn)驗(yàn)證碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java動(dòng)態(tài)規(guī)劃之硬幣找零問(wèn)題實(shí)現(xiàn)示例

    Java動(dòng)態(tài)規(guī)劃之硬幣找零問(wèn)題實(shí)現(xiàn)示例

    本文主要介紹了Java動(dòng)態(tài)規(guī)劃之硬幣找零問(wèn)題實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • SpringBoot配置連接兩個(gè)或多個(gè)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)

    SpringBoot配置連接兩個(gè)或多個(gè)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)

    本文主要介紹了SpringBoot配置連接兩個(gè)或多個(gè)數(shù)據(jù)庫(kù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • SpringCloud之Zuul網(wǎng)關(guān)原理及其配置講解

    SpringCloud之Zuul網(wǎng)關(guān)原理及其配置講解

    這篇文章主要介紹了SpringCloud之Zuul網(wǎng)關(guān)原理及其配置講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java并發(fā)編程之線程狀態(tài)介紹

    Java并發(fā)編程之線程狀態(tài)介紹

    這篇文章主要介紹了Java并發(fā)編程之線程狀態(tài),當(dāng)線程被創(chuàng)建并啟動(dòng)以后,它既不是一啟動(dòng)就進(jìn)入了執(zhí)行狀態(tài),也不是一直處于執(zhí)行狀態(tài),下面和小編一起進(jìn)入文章了解具體的相關(guān)介紹吧
    2022-04-04
  • java實(shí)現(xiàn)微信H5支付方法詳解

    java實(shí)現(xiàn)微信H5支付方法詳解

    本篇文章主要介紹了java實(shí)現(xiàn)微信H5支付方法詳解,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-04-04
  • Java操作xls替換文本或圖片的功能實(shí)現(xiàn)

    Java操作xls替換文本或圖片的功能實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于Java操作xls替換文本或圖片功能實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼講解了文件上傳、文件處理和Excel文件生成,需要的朋友可以參考下
    2024-12-12
  • java實(shí)現(xiàn)圖書(shū)館管理系統(tǒng)

    java實(shí)現(xiàn)圖書(shū)館管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖書(shū)館管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • spring?IOC容器管理必須知道的一些操作(基于XML方式)

    spring?IOC容器管理必須知道的一些操作(基于XML方式)

    Spring框架的核心是Spring容器,容器創(chuàng)建對(duì)象,將它們裝配在一起,配置它們并管理它們的完整生命周期,下面這篇文章主要給大家介紹了關(guān)于spring?IOC容器管理必須知道的一些操作,需要的朋友可以參考下
    2022-03-03
  • java檢測(cè)redis是否可用的方法示例

    java檢測(cè)redis是否可用的方法示例

    這篇文章主要給大家介紹了關(guān)于java檢測(cè)redis是否可用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論