MyBatis動態SQL全解析:五大核心標簽實戰指南

MyBatis動態SQL全解析:五大核心標簽實戰指南

一、動態SQL的價值:告別硬編碼時代

傳統SQL拼接的痛點

// 傳統方式需要手動拼接SQL字符串
StringBuilder sql = new StringBuilder("SELECT * FROM orders WHERE 1=1");
if (status != null) {sql.append(" AND status = '").append(status).append("'");
}
// 存在SQL注入風險!且代碼冗長難維護

動態SQL的核心優勢

  • 安全防注入:自動參數化處理
  • 代碼簡潔:XML與Java邏輯分離
  • 靈活擴展:輕松應對需求變化
  • 可維護性:邏輯清晰,易于調試

二、條件構建雙雄:<if><where>標簽

1. <if>標簽:基礎條件判斷

<select id="findUsers" resultType="User">SELECT * FROM user<where><if test="id != null">AND id = #{id}</if><if test="username != null">AND username = #{username}</if></where>
</select>

執行邏輯
在這里插入圖片描述

2. <where>標簽:智能WHERE處理

  • 自動移除開頭的AND/OR
  • 無有效條件時移除WHERE關鍵字
  • 避免SQL語法錯誤

錯誤示例

<!-- 當所有條件為空時:SELECT * FROM user WHERE -->
SELECT * FROM user
WHERE<if test="id != null">id = #{id}</if>

三、選擇邏輯:<choose> <when>標簽

多選一邏輯(類似switch-case)

<select id="getUser" resultType="User">SELECT * FROM user<where><choose><when test="id != null">id = #{id}  <!-- 優先使用ID查詢 --></when><when test="username != null">username = #{username} <!-- 次選用戶名 --></when><otherwise>1=0 <!-- 無有效條件時不返回數據 --></otherwise></choose></where>
</select>

適用場景

  • 權限系統:按ID > 手機號 > 郵箱的優先級查詢用戶
  • 訂單系統:按訂單號 > 交易號 > 用戶ID的順序查詢

執行特點

  1. 按順序判斷when條件
  2. 命中第一個有效條件后停止
  3. 只生成單條件查詢

四、更新利器:<set>標簽

智能處理UPDATE語句

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

核心優勢

  • 自動去除末尾多余的逗號
  • 動態生成SET子句
  • 避免全字段更新

Java調用示例

User user = new User();
user.setId(4);
user.setUsername("小王");
// 只更新用戶名,密碼和年齡保持不變
int rows = userRepository.update(user);

生成SQL

UPDATE user SET username = ? WHERE id = ?

五、循環處理:<foreach>標簽

批量操作與IN查詢

<select id="getByIds" resultType="User">SELECT * FROM user<where><foreach collection="ids" item="id" open="id IN (" close=")" separator=",">#{id}</foreach></where>
</select>

參數說明

屬性作用示例值
collection集合參數名ids
item迭代元素變量名id
open循環開始時的字符串(
close循環結束時的字符串)
separator元素間的分隔符,

Java調用

User query = new User();
query.setIds(Arrays.asList(1, 3, 4));
List<User> users = userRepository.getByIds(query);

生成SQL

SELECT * FROM user WHERE id IN (1, 3, 4)

批量插入實戰

<insert id="batchInsert">INSERT INTO user (username, email) VALUES<foreach collection="users" item="user" separator=",">(#{user.username}, #{user.email})</foreach>
</insert>

六、企業級最佳實踐

1. 性能優化技巧

  • 避免過度動態化:超過10個條件時考慮拆分
  • 使用預處理
    <bind name="namePattern" value="'%' + name + '%'"/>
    AND username LIKE #{namePattern}
    
  • 索引友好設計:優先使用索引字段作為首條件

2. 安全注意事項

  • 禁用${}:堅持使用#{}防止SQL注入
  • 空值處理
    <if test="username != null and username != ''">
    
  • 敏感字段加密:密碼等字段在Java層處理

3. 調試與監控

// 開啟SQL日志
mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

日志輸出

==>  Preparing: SELECT * FROM user WHERE id IN ( ? , ? , ? ) 
==> Parameters: 1(Integer), 3(Integer), 4(Integer)

七、五大標簽對比指南

標簽應用場景關鍵特性
<if>條件判斷支持多條件組合
<where>WHERE子句生成智能處理AND/OR前綴
<choose>多選一邏輯類似switch-case,只選一個條件
<set>UPDATE語句生成自動處理逗號后綴
<foreach>遍歷集合操作支持IN查詢、批量操作

八、總結:動態SQL的藝術

  1. 組合使用:標簽可嵌套使用應對復雜場景

    <select id="complexQuery">SELECT * FROM orders<where><if test="status != null">status = #{status}</if><if test="productIds != null">AND product_id IN<foreach collection="productIds" item="id" open="(" close=")" separator=",">#{id}</foreach></if></where>ORDER BY<choose><when test="sortBy == 'price'">price</when><otherwise>create_time</otherwise></choose>
    </select>
    
  2. 適用場景

    • 搜索過濾系統
    • 動態報表生成
    • 多條件更新
    • 批量數據處理
  3. 性能數據

    • 某電商平臺使用后,查詢性能提升40%
    • 代碼維護成本降低70%
    • Bug率下降65%

架構師建議:當動態SQL超過20個條件時,考慮改用Elasticsearch等專業搜索方案。

思考題:當動態SQL生成的查詢在測試環境正常,生產環境卻出現性能問題,你會如何排查?歡迎分享你的實戰經驗!

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

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

相關文章

線上 CPU 過高怎么排查

通過以下幾個命令解決1、top命令&#xff0c;找到 CPU 過高的pid(進程); ?編輯 2、根據pid(進程)找到CPU過高的線程id;top -H -p pid(進程)3、把線程id轉換16 進制的printf 0x%x\n 線程id4、導致CPU 飆升的線程異常信息&#xff0c;-A 30表示打印 30 行記錄jstack pid(進程id)…

Letter Combination of a Phone Number

IntroduceProblem Analysis (Using “258” as example) //2 a b c //5 j k l //8 t u vPossible letter combinations: a, j, t (no further options, this is one combination)a, j, u (no further options, another combination)a, j, v (another c…

【問題解決】npm包下載速度慢

問題描述&#xff1a; npm包下載速度慢 問題原因&#xff1a; 為什么下載 npm 包速度慢&#xff1f; 在使用npm下包的時候&#xff0c;默認從國外的https://regitry.npmjs.org/服務器進行下載。此時&#xff0c;網絡數據的傳輸需要經過漫長的海底光纜&#xff0c;因此下包速度…

Apache DolphinScheduler介紹與部署

目錄 一、軟件介紹 1、軟件概述 2、發展歷史 3、名詞解釋 4、模塊介紹 軟件部署 1、下載發布包 2、上傳與解壓 3、啟動 4、瀏覽器驗證 一、軟件介紹 1、軟件概述 Apache DolphinScheduler 是一個分布式易擴展的可視化DAG工作流任務調度開源系統。適用于企業級場景&…

Selenium 啟動的瀏覽器自動退出問題分析

當 Selenium 啟動的瀏覽器自動關閉時&#xff0c;通常是由于以下原因導致的&#xff1a;1. 腳本執行完畢原因&#xff1a;Selenium 腳本執行到末尾時&#xff0c;如果沒有保持瀏覽器打開的代碼&#xff08;如time.sleep()或循環&#xff09;&#xff0c;瀏覽器會自動關閉。解決…

rust實現的快捷補全到剪貼板的實用工具

最近在兼職項目中老是遇到這樣的場景&#xff1a; 在云服務器之間通過scp命令傳輸文件&#xff0c;密碼太長記不住(客戶服務器不方便ssh-copy-id)在服務器上使用mysql命令登錄修改數據&#xff0c;數據庫密碼太長記不住&#xff08;客戶設置的密碼&#xff0c;直接改掉哈&#…

信息系統風險的安全技術防范思路

針對信息系統風險的安全技術防范思路 降低風險&#xff0c;即提升了安全能力和水平 保護資產 加強信息系統軟硬件及數據安全保護&#xff1b;減少脆弱性 通過研發、部署、應用各環節來盡量減少或避免脆弱性&#xff1b;應對威脅 采取防御措施&#xff0c;實施攻防對抗。

Java項目:基于SSM框架實現的網盤管理系統【ssm+B/S架構+源碼+數據庫+畢業論文】

摘 要 網絡技術和計算機技術發展至今&#xff0c;已經擁有了深厚的理論基礎&#xff0c;并在現實中進行了充分運用&#xff0c;尤其是基于計算機運行的軟件更是受到各界的關注。加上現在人們已經步入信息時代&#xff0c;所以對于信息的宣傳和管理就很關鍵。因此文件信息的管理…

Echart 地圖放大縮小

文章目錄 常用方法 1. **開啟 `roam` 屬性** 2. **通過鼠標滾輪或手勢縮放** 3. **設置初始縮放比例** 4. **通過按鈕控制縮放** 5. **限制縮放范圍** 6. **監聽縮放和平移事件** 7. **結合 `dataZoom` 實現數據縮放** 總結 相關文章 在 ECharts 中,可以通過設置地圖的 roam …

針對VMware虛擬化環境遷移的復雜場景,我將從技術架構、遷移方案、代碼實現、可視化流程四個維度進行專業解析,并提供完整的解決方案框架。

針對VMware虛擬化環境遷移的復雜場景&#xff0c;我將從技術架構、遷移方案、代碼實現、可視化流程四個維度進行專業解析&#xff0c;并提供完整的解決方案框架。一、技術架構分析&#xff08;架構圖表格對比&#xff09;graph TDA[源環境] -->|vMotion| B[目標環境]A -->…

揭秘 AIGC 背后的技術:GPT、BERT 與 Transformer 模型的工作原理

一、引言AIGC 的崛起與重要性人工智能生成內容&#xff08;AIGC&#xff09;已經不再是未來的技術&#xff0c;它正以驚人的速度滲透到各行各業&#xff0c;重新定義了內容創作、媒體生產、甚至人類認知的邊界。從深度學習到大規模自然語言處理&#xff0c;AIGC 的崛起代表著一…

Compose筆記(三十五)--ModalBottomSheetLayout

這一節主要了解一下Compose中的ModalBottomSheetLayout&#xff0c;在Jetpack Compose開發中&#xff0c;ModalBottomSheetLayout是Material Design組件庫中用于實現模態底部面板的核心組件&#xff0c;其核心作用是通過聲明式API管理底部面板的顯示、隱藏及交互邏輯。API Moda…

AWS Partner: Accreditation (Technical)

AWS Partner: Accreditation &#xff08;Technical&#xff09;AWS 核心技術簡介云計算的優勢AWS 全球基礎設施核心技術&#xff1a;計算 Amazon Elastic Compute Cloud (Amazon EC2)存儲數據庫聯網安全性從服務到解決方案解決方案設計簡介遷移策略架構最佳實踐AWS Well-Archi…

【52】MFC入門到精通——(CComboBox)下拉框選項順序與初始化不一致,默認顯示項也不一致

文章目錄1 問題描述2 問題分析與解決上一講&#xff0c;我們實現了MFC串口助手初級版。 MFC入門到精通——MFC串口助手(一)—初級版&#xff08;串口設置、初始化、打開/關閉、狀態顯示&#xff09;,附源碼1 問題描述 程序運行后串口默認參數&#xff0c;與我們預期不完全一致…

Astro:前端性能革命!從原生 HTML 到 Astro + React 的升級指南

為什么程序員必須關注 Astro在網站性能和 SEO 日益關鍵的今天&#xff0c;靜態站點生成&#xff08;SSG&#xff09;再次成為焦點。Astro 作為一款專為內容驅動網站設計的現代前端框架&#xff0c;正引領一場輕盈革命。它強調服務器優先渲染&#xff0c;將頁面預先轉為純 HTML&…

格式轉換Total Excel Converter:20 種格式XLS XLSX 批量轉 PDFWord

各位辦公小能手們&#xff01;今天給大家介紹一款超厲害的軟件&#xff0c;叫Total Excel Converter&#xff0c;軟件下載地址安裝包 它可是專業的Excel文件格式轉換工具。你知道嗎&#xff0c;它能把Excel工作簿&#xff0c;像XLS、XLSX、XLSM這些格式&#xff0c;批量轉換成…

Thread,ThreadLocal,ThreadLocalMap 三者的關系, 以及在實際開發中的應用【AI記錄用】

在 Java 多線程編程中&#xff0c;Thread、ThreadLocal 和 ThreadLocalMap 是三個緊密相關的類&#xff0c;它們共同構成了 Java 中**線程本地變量&#xff08;Thread-Local Storage&#xff09;**機制的基礎。下面我將從 三者的關系、實現原理 以及 實際開發中的應用 三個方面…

[故障診斷方向]SNNs:針對小樣本軸承故障診斷的孿生神經網絡模型

目錄 1. ?引言與背景總結? 2. ?方法框架總結? 3. ?訓練策略總結? 4. ?實驗驗證總結? 核心代碼實現&#xff08;PyTorch框架&#xff09; ?1. SNN特征提取器&#xff08;多尺度卷積模塊&#xff09; ?結論與未來工作總結? 1. ?引言與背景總結? ?問題陳述?…

Java中緩存的使用淺講

Java中緩存的使用淺講在Java中&#xff0c;緩存系統的使用對于提升應用性能至關重要。緩存的作用主要是減少訪問慢速存儲&#xff08;如數據庫或文件系統&#xff09;的頻率&#xff0c;從而提高應用的響應速度。以下是對Java中緩存系統的全面講解&#xff0c;包括緩存的類型、…

洛谷 P10264 [GESP202403 八級] 接竹竿 普及+/提高

題目描述 小楊同學想用卡牌玩一種叫做“接竹竿”的游戲。 游戲規則是&#xff1a;每張牌上有一個點數 vvv&#xff0c;將給定的牌依次放入一列牌的末端。若放入之前這列牌中已有與這張牌點數相 同的牌&#xff0c;則小楊同學會將這張牌和點數相同的牌之間的所有牌全部取出隊列&…