MyBatis 動態 SQL 基於 OGNL 表達式,在 XML 中構建可變 SQL 片段,解決傳統字串拼接易出錯、難維護問題。核心標籤僅 6 個,組合覆蓋 99% 場景。
<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)。
<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<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<!-- 等價於 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 | 去除後綴前的字符(,) |
<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。
<!-- 查詢 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") 或封裝 DTOtest="map.key != null"掌握 6 大標籤組合拳:where/set 處理結構關鍵字,if/choose 處理業務邏輯,trim 處理特殊場景,foreach 處理批量。配合 @Param 規範參數,動態 SQL 即變得優雅且可維護。