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

MyBatis 動態 SQL 核心標籤實戰詳解:if、choose、where、set、trim、foreach

     編輯:Java 相關知識

動態 SQL 本質

MyBatis 動態 SQL 基於 OGNL 表達式,在 XML 中構建可變 SQL 片段,解決傳統字串拼接易出錯、難維護問題。核心標籤僅 6 個,組合覆蓋 99% 場景。

1. <if> - 單條件判斷

<select id="findUser" resultType="User">
  SELECT * FROM user WHERE 1=1
  <if test="username != null and username != ''">
    AND username = #{username}
  </if>
  <if test="status != null">
    AND status = #{status}
  </if>
</select>

test 屬性支援完整 OGNL:屬性存取、集合判空 list != null and list.size() > 0、方法調用 @org.apache.commons.lang3.StringUtils@isNotBlank(name)。

2. <where> - 智能 WHERE 子句

<select id="findUser" resultType="User">
  SELECT * FROM user
  <where>
    <if test="username != null"> username = #{username} </if>
    <if test="status != null"> AND status = #{status} </if>
  </where>
</select>
  • 自動插入 WHERE 關鍵字
  • 自動剝離開頭的 AND/OR
  • 若所有條件皆假,不產生 WHERE 子句

3. <set> - 智能 UPDATE 子句

<update id="updateUser" parameterType="User">
  UPDATE user
  <set>
    <if test="username != null"> username = #{username}, </if>
    <if test="email != null"> email = #{email}, </if>
    <if test="age != null"> age = #{age} </if>
  </set>
  WHERE id = #{id}
</update>
  • 自動插入 SET
  • 自動剝離結尾的逗號

4. <trim> - 通用前後綴處理(where/set 底層實現)

<!-- 等價於 where -->
<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>

<!-- 等價於 set -->
<trim prefix="SET" suffixOverrides=","> ... </trim>

<!-- 自訂:IN 子句 -->
<trim prefix="(" suffix=")" suffixOverrides=",">
  <foreach ...> #{item} </foreach>
</trim>
屬性作用
prefix前綴(如 WHERE、SET、()
suffix後綴(如 ))
prefixOverrides去除前綴後的關鍵字(AND、OR)
suffixOverrides去除後綴前的字符(,)

5. <choose> / <when> / <otherwise> - 互斥分支(類 switch)

<select id="findUser" resultType="User">
  SELECT * FROM user WHERE 1=1
  <choose>
    <when test="username != null"> AND username = #{username} </when>
    <when test="email != null"> AND email = #{email} </when>
    <otherwise> AND status = 1 </otherwise>
  </choose>
</select>

只進入第一個匹配的 when,全不匹配進 otherwise。

6. <foreach> - 集合/陣列迭代(批量操作神器)

<!-- 查詢 IN 列表 -->
<select id="findByIds" resultType="User">
  SELECT * FROM user
  <where>
    id IN
    <foreach collection="list" item="id" index="idx" open="(" separator="," close=")">
      #{id}
    </foreach>
  </where>
</select>

<!-- 批量插入 -->
<insert id="batchInsert" parameterType="java.util.List">
  INSERT INTO user (username, email) VALUES
  <foreach collection="list" item="user" separator=",">
    (#{user.username}, #{user.email})
  </foreach>
</insert>
屬性說明
collection集合參數名:List→"list"、Array→"array"、Map→key 名
item迭代變數名
index索引變數(可選)
open/separator/close包圍/分隔/結束字符

參數傳遞最佳實踐

  • 單參數:直接用屬性名 test="name != null"
  • 多參數:必須 加 @Param("xxx") 或封裝 DTO
  • Map 參數:test="map.key != null"

總結

掌握 6 大標籤組合拳:where/set 處理結構關鍵字,if/choose 處理業務邏輯,trim 處理特殊場景,foreach 處理批量。配合 @Param 規範參數,動態 SQL 即變得優雅且可維護。

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