MyBatis 動態 SQL 使用詳解

🌟 一、什么是動態 SQL?

動態 SQL 是指根據傳入參數,動態拼接生成 SQL 語句,不需要寫多個 SQL 方法。MyBatis 提供了 <if><choose><foreach><where> 等標簽來實現這類操作


? 二、動態 SQL 的優點

優點說明
?? 靈活同一個 SQL 根據不同參數拼接不同條件(if / where),非常適合查詢頁面
?? 減少代碼重復比如模糊搜索功能,不再需要寫多個 SQL 接口方法
?? 可讀性強(配合 XML)結構清晰,尤其用 <where> / <set> / <foreach>
?? SQL 控制權在開發者手中和 Hibernate/JPA 相比,MyBatis 更易于優化復雜 SQL
?? 易于維護多條件組合查詢如管理后臺的搜索表單、動態篩選等功能

? 三、動態 SQL 的缺點

缺點說明
? 編寫略繁瑣XML 寫法需要嵌套多個標簽,容易出錯,特別是嵌套復雜條件時
? 可讀性下降(過度嵌套)動態 SQL 太復雜時,XML 顯得臃腫不易讀
? 不利于 IDE 自動提示邏輯寫在 XML 中,IDE 很難做類型檢查和智能提示
? SQL 拼接錯誤不易發現某些條件組合可能拼錯 SQL,運行期才報錯
? 與注解風格沖突注解方式不支持復雜的動態 SQL,只能用 XML 實現動態拼接

🛠? 四、動態 SQL 適用場景

? 最適合的場景:

場景舉例
🔍 條件查詢頁面多條件組合搜索,如:用戶列表查詢、訂單篩選、日志檢索
📋 后臺管理系統如 admin 頁面支持 name、status、時間區間等動態條件
📊 報表查詢系統查詢維度、范圍、排序條件全是動態的
🧩 批量操作IN 查詢、批量更新、刪除(用 <foreach>
📌 多字段更新UPDATE 語句中字段非空才更新(用 <set> 標簽)

? 不推薦使用的場景:

場景原因
常規增刪改查邏輯簡單,不需要動態拼接
SQL 條件固定寫死 SQL 語句更清晰、維護方便
條件復雜但變化不大建議寫多個 SQL 方法,避免 XML 太臃腫

🔍 五、小結一張表

點評維度動態 SQL 表現
靈活性????? 超高
編寫復雜度???? 中等偏高
可維護性??? 中等
性能控制????? 好
推薦場景多條件查詢、批量操作

? 示例對比

? 使用動態 SQL:

<select id="searchUser" resultType="User">SELECT * FROM user<where><if test="name != null"> AND name LIKE CONCAT('%', #{name}, '%')</if><if test="age != null"> AND age = #{age}</if></where>
</select>

? 不使用動態 SQL(需要寫多個方法):

<select id="findByName" ...>SELECT * FROM user WHERE name = #{name}</select>
<select id="findByAge" ...>SELECT * FROM user WHERE age = #{age}</select>
<select id="findByNameAndAge" ...>SELECT * FROM user WHERE name = #{name} AND age = #{age}</select>

🧩 MyBatis 動態 SQL 標簽速查表

標簽作用示例注意事項
<if>條件判斷<if test="name != null">AND name = #{name}</if>test 支持 OGNL 表達式,如 != null && name != ''
<choose> <when> <otherwise>分支選擇(類似 switch-case)見下方示例只能命中一個 <when>,類似 if…else
<trim>自定義前綴、后綴、去掉多余的分隔符`<trim prefix=“WHERE” prefixOverrides="ANDOR "> … `
<where>自動加 WHERE 并去掉首個 AND/OR<where><if test="...">AND ...</if></where>自動處理空條件時避免語法錯誤
<set>自動加 SET 并去掉多余逗號(用于 UPDATE)<set><if test="...">name=#{name},</if></set>適用于動態更新字段
<foreach>遍歷集合,構造 IN 語句、批量插入等見下方示例支持 list、array、Map,常用于 IN (...)
<bind>創建一個變量,可用于字符串拼接等<bind name="pattern" value="'%' + name + '%'" />常配合模糊查詢使用

📚 示例合集

1?? <if> 使用示例

<select id="selectUser" resultType="User">SELECT * FROM user<where><if test="name != null and name != ''">AND name LIKE CONCAT('%', #{name}, '%')</if><if test="age != null">AND age = #{age}</if></where>
</select>

2?? <choose> / <when> / <otherwise> 示例

<select id="selectUser" resultType="User">SELECT * FROM user<where><choose><when test="name != null">AND name = #{name}</when><when test="age != null">AND age = #{age}</when><otherwise>AND status = 'active'</otherwise></choose></where>
</select>

3?? <trim> 示例(手動 WHERE 拼接)

<select id="selectUser" resultType="User">SELECT * FROM user<trim prefix="WHERE" prefixOverrides="AND |OR "><if test="name != null">AND name = #{name}</if><if test="age != null">AND age = #{age}</if></trim>
</select>

4?? <set> 示例(動態更新)

<update id="updateUser">UPDATE user<set><if test="name != null">name = #{name},</if><if test="age != null">age = #{age},</if></set>WHERE id = #{id}
</update>

5?? <foreach> 示例(IN 查詢)

<select id="selectByIds" resultType="User">SELECT * FROM user WHERE id IN<foreach collection="idList" item="id" open="(" separator="," close=")">#{id}</foreach>
</select>
語法片段含義
id="selectByIds"這是 Mapper 接口中方法對應的 SQL ID
resultType="User"查詢結果會映射成 User
collection="idList"傳入的是一個集合參數名,比如一個 List<Integer> 類型的參數
item="id"遍歷集合中的每個元素,當前元素命名為 id
open="("拼接 SQL 時,開頭加一個左括號 (
separator=","每個參數之間用逗號隔開
close=")"最后一個參數后加上右括號 )
#{id}當前遍歷元素的值,作為 SQL 參數傳入(防 SQL 注入)

6?? <bind> 示例(模糊搜索)

<select id="searchByName" resultType="User"><bind name="pattern" value="'%' + name + '%'" />SELECT * FROM user WHERE name LIKE #{pattern}
</select>
部分解釋
<select id="searchByName">定義一個 SQL 查詢方法,ID 是 searchByName
resultType="User"查詢結果會封裝成 User 對象
<bind name="pattern" value="'%' + name + '%'"/>MyBatis 提供的 <bind> 標簽: 動態創建一個變量 pattern,它的值是 '%xxx%' 這樣的字符串,供后面 SQL 使用
value="'%' + name + '%'"拼接模糊匹配字符串(注意這里的 '%' 是字符串,需要加單引號
#{pattern}MyBatis 會將 pattern 的值安全地替換進 SQL,防止 SQL 注入

📌 小技巧總結

目標建議用法
多條件查詢<where><trim> 配合 <if>
動態更新字段<set> 配合 <if>
IN 查詢<foreach>
模糊搜索<bind>
模擬 if…else<choose>

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

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

相關文章

樂觀鎖與悲觀鎖的使用場景

悲觀鎖的應用場景 悲觀鎖的基本思想是假設并發沖突會發生&#xff0c;因此在操作數據時會先鎖定數據&#xff0c;直到完成操作并提交事務后才釋放鎖。這種方式適用于寫操作較多、并發沖突可能性較高的場景。 高寫入比例的數據庫操作&#xff1a;如果系統中有很多寫操作&#x…

cpp(c++)win 10編譯GDAL、PROJ、SQLite3、curl、libtiff

cpp&#xff08;c&#xff09;編譯GDAL、PROJ、SQLite3 Sqlite3libtiffcurlprojGDAL Sqlite3 1、下載 Sqlite3 源碼、工具、二進制預編譯 exe Sqlite3 官網&#xff1a;https://www.sqlite.org/download.html 下載 sqlite-amalgamation-3430200.zipsqlite-dll-win64-x64-3430…

【愚公系列】《高效使用DeepSeek》062-圖書庫存管理

??【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】?? ??開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主! ?? 江湖人稱"愚公搬代碼",用七年如一日的精神深耕技術領域,以"…

鏈表算法中常用操作和技巧

目 1.常用技巧 1.1.畫圖 1.2.添加虛擬頭節點 1.3.大膽引入中間變量 1.4.快慢雙指針 1.4.1判斷鏈表是否有環 1.4.2找鏈表中環的入口 ?2.常用操作 2.1. 創建一個新節點 2.2.尾插 2.3.頭插 1.常用技巧 1.1.畫圖 畫圖可以讓一些抽象的文字語言更加形象生動 畫圖&#…

【9】數據結構的串篇章

目錄標題 串的定義順序串的實現初始化賦值打印串求串的長度復制串判斷兩個串長度是否相等連接兩個串比較兩個串內容是否相等插入操作刪除操作調試與代碼合集 串的模式匹配算法樸素的模式匹配算法KMP算法實現模式匹配 串的定義 定義&#xff1a;由0個或多個字符組成的有限序列&…

GMSL Strapping Pins CFG0/CFG1 應用

GMSL device 使用起來還是比較簡單 ADI 已經充分考慮了用戶的需求&#xff0c;盡可能的降低的芯片的使用和配置復雜度 一對加串器和解串器&#xff0c;只要工作模式匹配得當&#xff0c;Link Locked&#xff0c;便能夠正常工作 如果遇到 Link 無法建立&#xff08;Locked&…

`uia.WindowControl` 是什么:獲取窗口文字是基于系統的 UI 自動化接口,而非 OCR 方式

uia.WindowControl 是什么:獲取窗口文字是基于系統的 UI 自動化接口,而非 OCR 方式 uia.WindowControl 通常是基于 Windows 系統的 UI 自動化框架(如 pywinauto 中的 uia 模塊)里用于表示窗口控件的類。在 Windows 操作系統中,每個應用程序的窗口都可以看作是一個控件,ui…

Easysearch VS Opensearch 數據寫入與存儲性能對比

本文記錄 Easysearch 和 Opensearch 數據寫入和數據存儲方面的性能對比。 準備 壓測工具&#xff1a;INFINI Loadgen 對比版本&#xff1a; Easysearch 1.11.1&#xff08;lucene 8.11.4&#xff09;Opensearch 2.19.1&#xff08;lucene 9.12.1&#xff09; 節點 JVM 配置…

力扣題解:142. 環形鏈表 II

在鏈表學習中&#xff0c;我們已經了解了單鏈表和雙鏈表&#xff0c;兩者的最后一個結點都會指向NULL&#xff1b;今天我們介紹的循環列表則不同&#xff0c;其末尾結點指向的這是鏈表中的一個結點。 循環鏈表是一種特殊類型的鏈表&#xff0c;其尾節點的指針指向頭節點&#…

區間 dp 系列 題解

1.洛谷 P4342 IOI1998 Polygon 我的博客 2.洛谷 P4290 HAOI2008 玩具取名 題意 某人有一套玩具&#xff0c;并想法給玩具命名。首先他選擇 W, I, N, G 四個字母中的任意一個字母作為玩具的基本名字。然后他會根據自己的喜好&#xff0c;將名字中任意一個字母用 W, I, N, G …

天基光學圖像仿真原理簡介

一、原理簡介 天基光學圖像仿真通過數學模型和算法模擬空間目標在光學系統中的成像過程&#xff0c;核心原理可歸納為以下四部分&#xff1a; 1. 目標與背景建模? 目標運動建模?&#xff1a;利用軌道動力學模型&#xff08;如SGP4&#xff09;解析空間目標軌跡&#xff0c;…

Jetpack Compose 狀態保存機制全面解析:讓UI狀態持久化

在Android開發中&#xff0c;Jetpack Compose 的狀態管理是一個核心話題&#xff0c;而狀態保存則是確保良好用戶體驗的關鍵。本文將深入探討Compose中各種狀態保存技術&#xff0c;幫助你在配置變更和進程重建時保持UI狀態。 一、基礎保存&#xff1a;rememberSaveable reme…

【Json-Rpc #1】項目背景及環境搭建

&#x1f4c3;個人主頁&#xff1a;island1314 &#x1f525;個人博客&#xff1a;island ?? 歡迎關注&#xff1a;&#x1f44d;點贊 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活總是不會一帆風順&#xff0c;前進…

WPF輪播圖動畫交互 動畫縮放展示圖片

WPF輪播圖動畫交互 動畫縮放展示圖片 效果如下圖&#xff1a; XAML代碼&#xff1a; <Window x:Class"Caroursel.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/20…

為什么 npm list -g 沒顯示 node_modules??

揭秘&#xff1a;為什么 npm list -g 沒顯示 node_modules&#xff1f;&#x1f575;??♂?? 嗨&#xff0c;各位代碼探險家&#xff01;&#x1f44b; 今天我們要破解一個 npm 小謎團&#xff1a;運行 npm list -g --depth0 時&#xff0c;為什么輸出的路徑里看不到 node_…

都江堰與鄭國渠

目錄標題 一、歷史背景&#xff1a;地緣博弈下的水利突圍都江堰&#xff1a;化水患為天府的千年大計鄭國渠&#xff1a;間諜引發的戰略反轉 二、工程智慧&#xff1a;超越時代的科技奇跡都江堰&#xff1a;生態治水的典范鄭國渠&#xff1a;泥沙資源化的創舉 三、后世影響&…

鏈路聚合+vrrp

1.鏈路聚合 作用注意事項將多個物理接口&#xff08;線路&#xff09;邏輯上綁定在一起形成一條邏輯鏈路&#xff0c;起到疊加帶寬的作用1.聚合接口必須轉發速率一致。2.聚合設備兩端必須一致 配置命令 方法一 [Huawei]interface Eth-Trunk 0----先創建聚合接口&#xff0c;…

【STM32單片機】#7 定時器輸入捕獲

主要參考學習資料&#xff1a; B站江協科技 STM32入門教程-2023版 細致講解 中文字幕 開發資料下載鏈接&#xff1a;https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 單片機套裝&#xff1a;STM32F103C8T6開發板單片機C6T6核心板 實驗板最小系統板套件科協 實驗&…

【android bluetooth 框架分析 01】【關鍵線程 3】【bt_jni_thread 線程介紹】

1. bt_jni_thread 職責介紹 bt_jni_thread 這個線程的作用是專門負責處理藍牙 JNI 層的消息循環&#xff0c;也可以說是 C 層和 Java 層交互的橋梁線程。 1.1 什么是 JNI 層&#xff1f;為什么需要這個線程&#xff1f; JNI&#xff08;Java Native Interface&#xff09;是 …

基于視覺語言模型的機器人實時探索系統!ClipRover:移動機器人零樣本視覺語言探索和目標發現

作者&#xff1a;Yuxuan Zhang 1 ^{1} 1, Adnan Abdullah 2 ^{2} 2, Sanjeev J. Koppal 3 ^{3} 3, and Md Jahidul Islam 4 ^{4} 4單位&#xff1a; 2 , 4 ^{2,4} 2,4佛羅里達大學電氣與計算機工程系RoboPI實驗室&#xff0c; 1 , 3 ^{1,3} 1,3佛羅里達大學電氣與計算機工程系F…