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

QueryWrapper中or的使用技巧分享

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

場景描述

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

需求拆解

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

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

這些需求在 SQL 中可以通過一個簡單的 SELECT 語句來實現(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 這樣一個 ORM 框架時,我們通常會使用 QueryWrapper 來構(gòu)造查詢條件,以提高代碼的可讀性和可維護性。

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

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

下面我們來看一個具體的代碼示例,展示如何通過 QueryWrapper 來構(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");  // 按更新時間降序排序

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

代碼解析

1. 分頁參數(shù)

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

在大多數(shù)業(yè)務(wù)場景中,我們會對查詢結(jié)果進行分頁處理,以避免一次性返回過多數(shù)據(jù),影響性能。MyBatis-Plus 提供了 Page 類來處理分頁邏輯。在這段代碼中,我們通過 setCurrent 方法設(shè)置當(dāng)前頁數(shù),并通過 setSize 設(shè)置每頁返回的記錄數(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)造器,允許我們通過流式的方式來構(gòu)造查詢條件。

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

3. 排序條件

wrapper.orderByDesc("update_time");

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

結(jié)果封裝

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

QueryWrapper 的 or 使用技巧

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

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

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

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

相關(guān)文章

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

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

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

    Java動態(tài)規(guī)劃之硬幣找零問題實現(xiàn)示例

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

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

    本文主要介紹了SpringBoot配置連接兩個或多個數(shù)據(jù)庫的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(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)原理及其配置講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java并發(fā)編程之線程狀態(tài)介紹

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

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

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

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

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

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

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

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

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

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

    java檢測redis是否可用的方法示例

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

最新評論