首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MyBatis 動態 SQL where 標籤智能生成條件查詢

     編輯:Java 相關知識

動態 SQL 核心問題

撰寫條件查詢時,最頭痛的是 WHERE 子句的 AND/OR 拼接:第一個條件不需要前綴,後續條件需要,且可能所有條件都不滿足導致 SQL 語法錯誤。

MyBatis <where> 標籤解決方案

基本語法

<select id="findUsers" resultType="User">
  SELECT * FROM users
  <where>
    <if test="username != null and username != ''">
      AND username = #{username}
    </if>
    <if test="email != null and email != ''">
      AND email = #{email}
    </if>
    <if test="status != null">
      AND status = #{status}
    </if>
  </where>
</select>

智能處理邏輯

  • 若 <where> 內容為空 → 不輸出 WHERE 關鍵字
  • 若內容以 AND 或 OR 開頭 → 自動移除首個 AND/OR
  • 否則 → 正常輸出 WHERE + 內容

產生的 SQL 範例

條件輸入產生 SQL
所有參數為 nullSELECT * FROM users
username="Tom"SELECT * FROM users WHERE username = ?
username="Tom", status=1SELECT * FROM users WHERE username = ? AND status = ?

<trim> 進階替代方案

當需要更精細控制時,可使用 <trim> 完全自訂前後綴處理:

<select id="findUsers" resultType="User">
  SELECT * FROM users
  <trim prefix="WHERE" prefixOverrides="AND |OR">
    <if test="username != null"> AND username = #{username} </if>
    <if test="email != null"> OR email = #{email} </if>
  </trim>
</select>

prefix:前綴關鍵字;prefixOverrides:要移除的開頭字串 (支援多個,用空格分隔)。

<set> 標籤:更新語句的救星

同理適用於 UPDATE 的 SET 子句,自動處理尾隨逗號:

<update id="updateUser">
  UPDATE users
  <set>
    <if test="username != null"> username = #{username}, </if>
    <if test="email != null"> email = #{email}, </if>
    <if test="phone != null"> phone = #{phone} </if>
  </set>
  WHERE id = #{id}
</update>
  • 自動移除最後一個逗號
  • 若所有條件皆不滿足 → 不輸出 SET 子句 (但 WHERE 仍在,需注意)

實戰最佳實務

  1. 優先使用 <where>/<set>:語意清晰,覆蓋 90% 場景
  2. 複雜邏輯用 <trim>:需要自訂前後綴、混合 AND/OR 時
  3. 避免在 Java 代碼拼 SQL:防止 SQL 注入、難以維護、失去 MyBatis 動態 SQL 優勢
  4. 善用 bind 標籤:複雜條件預先計算,如模糊查詢 <bind name="pattern" value="'%' + keyword + '%'" />

總結

MyBatis 動態 SQL 標籤 (where、set、trim) 將條件拼接的煩瑣邏輯內建化,讓開發者專注於業務條件本身,是從寫 SQL 進化到寫「SQL 模板」的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved