深入理解 MyBatis-Plus 的 QueryWrapper:動態 SQL 構建的利器

關鍵詞:MyBatis-Plus、QueryWrapper、動態 SQL、Java、ORM


一、引言

在 Java 后端開發中,MyBatis-Plus(簡稱 MP)作為 MyBatis 的增強工具,極大地簡化了 CRUD 操作。而其中最核心的功能之一,就是動態 SQL 的條件構造器 —— QueryWrapper

你是否還在手寫 XML 中的 <if test="...">?是否還在為拼接 SQL 條件而煩惱?QueryWrapper 將帶你告別這些痛苦。


二、什么是 QueryWrapper?

QueryWrapper 是 MyBatis-Plus 提供的條件構造器,用于構建 WHERE 子句的查詢條件。它通過鏈式調用的方式,實現了類型安全、可讀性強、可復用的 SQL 構造。

類圖關系(簡化)

QueryWrapper ← AbstractWrapper ← Wrapper
  • Wrapper:抽象根類,定義了條件構造的基本能力。
  • AbstractWrapper:封裝了條件拼接邏輯。
  • QueryWrapper:專用于查詢操作,支持 SELECT ... WHERE ...

三、快速入門

1. 引入依賴

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version>
</dependency>

2. 實體類

@Data
@TableName("user")
public class User {private Long id;private String name;private Integer age;private String email;
}

3. Mapper 接口

public interface UserMapper extends BaseMapper<User> {}

4. 使用 QueryWrapper 查詢

@Autowired
private UserMapper userMapper;public List<User> getUsers(String name, Integer minAge) {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.like(StringUtils.isNotBlank(name), "name", name).ge(minAge != null, "age", minAge);return userMapper.selectList(wrapper);
}

四、核心方法詳解

方法名說明示例
eq等于eq("age", 20)age = 20
ne不等于ne("age", 20)age <> 20
gt / ge大于 / 大于等于gt("age", 18)age > 18
lt / le小于 / 小于等于lt("age", 30)age < 30
like模糊查詢like("name", "張")name LIKE '%張%'
in包含in("id", 1, 2, 3)id IN (1,2,3)
isNull / isNotNull空值判斷isNull("email")email IS NULL
orderByAsc / orderByDesc排序orderByDesc("create_time")

五、進階用法

1. 條件優先級(括號控制)

wrapper.and(w -> w.eq("age", 20).or().eq("name", "Tom")).eq("status", 1);

生成的 SQL:

WHERE (age = 20 OR name = 'Tom') AND status = 1

2. 只查詢部分字段

wrapper.select("id", "name").eq("age", 25);

3. 排除字段

wrapper.select(User.class, info -> !info.getColumn().equals("password")).eq("status", 1);

六、實戰案例:分頁 + 多條件搜索

public IPage<User> searchUsers(String name, Integer minAge, Integer maxAge, int current, int size) {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.like(StringUtils.isNotBlank(name), "name", name).ge(minAge != null, "age", minAge).le(maxAge != null, "age", maxAge).orderByDesc("create_time");Page<User> page = new Page<>(current, size);return userMapper.selectPage(page, wrapper);
}

七、常見誤區與注意事項

誤區正確做法
直接拼接字段名使用 LambdaQueryWrapper 避免硬編碼
忽略空值判斷使用帶 condition 參數的重載方法
濫用 or()使用 and(Consumer<Wrapper>) 明確優先級
忽略 SQL 注入不要手動拼接字符串,使用 MP 提供的 API

八、LambdaQueryWrapper:類型安全升級版

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.like(StringUtils.isNotBlank(name), User::getName, name).ge(minAge != null, User::getAge, minAge);

優點:

  • 編譯期檢查字段名
  • 避免魔法字符串
  • 支持方法引用

九、總結

特性描述
簡潔鏈式調用,告別 XML
靈活動態條件,支持復雜邏輯
安全防止 SQL 注入
可維護與實體類聯動,易于重構

建議

  • 簡單查詢用 QueryWrapper
  • 生產環境優先使用 LambdaQueryWrapper
  • 復雜 SQL 仍可用 XML 或 @Select

十、參考資料

  • MyBatis-Plus 官方文檔
  • GitHub:baomidou/mybatis-plus
  • 《MyBatis-Plus 實戰》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96357.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96357.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96357.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WMIC用法

WMIC用法基本語法結構1. 全局開關&#xff08;可選&#xff0c;控制整體行為&#xff09;2. 別名&#xff08;Alias&#xff09;3. 動詞&#xff08;Verb&#xff09;4. 參數&#xff08;可選&#xff09;常用示例幫助命令WMIC&#xff08;Windows Management Instrumentation …

Spring Boot--yml配置信息書寫和獲取

案例&#xff1a;Spring Boot整合Mybatis步驟一&#xff1a;導入依賴步驟二&#xff1a;添加數據庫需要的數據源配置步驟三&#xff1a;編寫實體類步驟四&#xff1a;創建mapper類&#xff0c;操作數據庫步驟五&#xff1a;創建Service接口和接口實現類步驟六&#xff1a;創建C…

創作紀念日·512天

嘿嘿&#xff0c;不知不覺間&#xff0c;已經到了512天創作紀念日了。 回憶 遙想我在《我的創作紀念日》一篇中寫道&#xff0c;想要改名為 十二 &#xff0c;作為對過去生活的懷念&#xff0c;沒想到這個名字被搶了&#xff0c;好可惜。 想到25年4月13日寫紀念日博客時的自己…

在 Berachain 上,如何通過 BERA 實現一魚多吃?

Berachain 的 PoL&#xff08;Proof of Liquidity&#xff09;機制是其最具辨識度的創新之一。通過將 DeFi 的激勵邏輯深度嵌入共識層&#xff0c;不僅為底層網絡注入了充足的流動性&#xff0c;保障了安全性&#xff0c;同時也有效推動了生態應用的增長&#xff0c;更為用戶創…

LangGraph和aiagent

1. LangGraph&#xff1a;用圖思維重構Agent工作流LangGraph是LangChain團隊開源的圖式Agent編排框架&#xff0c;它基于"有向圖"模型&#xff0c;將Agent的運行流程抽象為"節點 狀態流轉"。其核心設計理念是用有向狀態圖&#xff08;Directed State Grap…

《從iptables到ipvs:云原生網絡轉發的性能拐點突破》

這套基于Spring Cloud Alibaba搭建的架構,部署于阿里云ACK集群的10個4核8G節點上,默認配置6個Pod副本,搭配HPA彈性擴縮容機制與Ingress網關流量分發,理論上具備應對3倍日常流量的承載能力。然而實際運行中,每日早9點、午2點、晚8點三次流量峰值來臨時,訂單服務會在120秒內…

大數據存儲域——Kafka設計原理

摘要本文主要介紹了Kafka的架構原理、消息訂閱模式以及在金融風控等領域的應用。Kafka作為數據中轉站&#xff0c;可同步不同系統數據&#xff0c;支持事件驅動架構&#xff0c;廣泛應用于金融支付與風控場景。其架構包括Producer、Broker、Topic、Partition、Replication、Mes…

[特殊字符] GitHub 熱門開源項目速覽(2025/09/09)

今天為大家整理了近期 GitHub 上熱度較高的開源項目&#xff0c;涵蓋 AI Agent、加密計算、操作系統、機器人、PDF 工具 等多個方向。讓我們一起看看都有哪些值得關注的項目吧&#xff01; &#x1f539; AI Agents & 開發者工具 parlant &#xff08;? 10.9k | ?? 117…

OpenHarmony之USB Manager 架構深度解析

1. 整體架構 OpenHarmony USB管理器采用三層架構設計: USB API:提供USB的基礎API,主要包含查詢USB設備的列表、設備插拔通知、USB HOST/DEVICE 功能切換、批量數據傳輸、控制命令傳輸、USB設備打開的權限控制及USB device模式下的function功能切換等。 USB Service:主要實…

java面試中經常會問到的mysql問題有哪些(基礎版)

文章目錄一、基礎概念與存儲引擎二、索引設計與優化&#xff08;高頻重點&#xff09;三、事務與鎖&#xff08;核心原理&#xff09;四、SQL性能優化與問題排查五、高可用與數據安全六、其他高頻細節問題在Java面試中&#xff0c;MySQL作為最常用的關系型數據庫&#xff0c;是…

Tess-two - Tess-two 文字識別(Tess-two 概述、Tess-two 文字識別、補充情況)

一、Tess-two 概述Tess-two 是 Tesseract OCR 引擎在 Android 平臺上的一個封裝庫&#xff0c;用于實現離線文字識別Tess-two 的 GitHub 官網&#xff1a;https://github.com/rmtheis/tess-two二、Tess-two 文字識別 1、演示 &#xff08;1&#xff09;Dependencies 模塊級 bui…

八、Win/Linux/macOS全平臺徹底卸載Docker的操作指南

八、Win/Linux/macOS全平臺徹底卸載Docker的操作指南 系列文章目錄 1. 卸載前準備工作(可忽略) 1.1 數據備份 1.2 停止Docker服務 2. 不同操作系統卸載步驟 2.1 Linux系統 2.2 macOS系統 2.3 Windows系統 3. 殘留文件深度清理 3.1 Linux系統 3.2 macOS系統 3.3 Windows系統 4…

強化學習-CH9 策略梯度方法

強化學習-CH9 策略梯度方法 當策略被表示為函數時&#xff0c;通過優化目標函數可以得到最優策略。 這種方法稱為策略梯度。策略梯度方法是基于策略的&#xff0c;而之前介紹的方法都是基于值的。其本質區別在于基于策略的方法是直接優化關于策略參數的目標函數。 9.1 策略表示…

[玩轉GoLang] 5分鐘整合Gin / Gorm框架入門

方法 / 步驟 一: Gin框架 1.1 : 環境 & 項目配置 1, GoLand創建項目 創建main.go package mainimport ("github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{"message": "…

【項目復現】MOOSE-Chem 用于重新發現未見化學科學假說的大型語言模型

項目地址 ZonglinY/MOOSE-Chem: [ICLR 2025] --- ZonglinY/MOOSE-Chem: [ICLR 2025] https://github.com/ZonglinY/MOOSE-Chem git代碼同步&#xff1a; 同步地址如下&#xff1a;QianPengfei1/MOOSE-Chem: [ICLR 2025] <MOOSE-Chem: Large Language Models for Rediscove…

深入解析TCP核心機制:連接管理、流量與擁塞控制

目錄 一、三次握手與四次揮手&#xff1a;可靠連接的建立與終止 1. 三次握手 - 建立連接 為什么是三次&#xff1f; 2. 四次揮手 - 終止連接 為什么需要TIME_WAIT狀態&#xff1f; 二、流量控制與滑動窗口&#xff1a;解決收發速度不匹配 核心機制&#xff1a;滑動窗口協…

如何在 DevOps 管道中實現 AI?

對于許多尋求提升效率、優化性能并縮短上市時間的組織而言,將人工智能 (AI) 集成到 DevOps 流水線中已成為一項戰略舉措。AI 與 DevOps 的結合,有時被稱為 AIOps(面向 IT 運營的人工智能),正在重塑開發和運營團隊構建、測試、發布和維護軟件應用程序的方式。本文將引導您了…

【Agent】DeerFlow Planner:執行流程與架構設計(基于真實 Trace 深度解析)

本文檔系統闡述 DeerFlow 中 Planner 的職責邊界、端到端執行流程、關鍵節點設計、數據結構、容錯與人審機制&#xff0c;以及與研究/編碼子代理的協同方式。面向開發與運維讀者&#xff0c;幫助快速理解與調優 Planner 相關鏈路。 時序圖&#xff08;Sequence Diagram&#xf…

后端接口防止XSS漏洞攻擊

有這樣一個場景&#xff0c;首先構建一個docx文件并插入超鏈接&#xff08;惡意的鏈接&#xff09;&#xff0c;上傳到文件服務器后獲取對應的文件filekey。現在我們提供一個預覽接口&#xff0c;通過filekey便可以預覽&#xff0c;在根據filekey轉html文檔返回給頁面的時候由于…

4.1Vue基本使用

1.使用Vue-引入 Vue 的本質,就是一個 JavaScript 的庫: 剛開始我們不需要把它想象的非常復雜; 我們就把它理解成一個已經幫我們封裝好的庫; 在項目中可以引入并且使用它即可。 那么安裝和使用 Vue 這個 JavaScript 庫有哪些方式呢? 方式一:在頁面中通過 CDN 的方式來引…