| 標籤 | 用途 | 對應邏輯 |
|---|---|---|
<if> | 單條件判斷 | Java if |
<choose>/<when>/<otherwise> | 多條件互斥 | Java switch-case-default |
<trim> | 前後綴裁剪 | 手動控制 WHERE/SET 關鍵字 |
<where> | 智能 WHERE | 自動去除首個 AND/OR |
<set> | 智能 SET | 自動去除尾部逗號 |
<foreach> | 集合遍歷 | IN 子句、批次 INSERT |
<select id="findUserList" resultType="User">
SELECT * FROM user WHERE 1=1
<if test="id != null and id != ''">
AND id = #{id}
</if>
<if test="username != null and username != ''">
AND username LIKE CONCAT('%', #{username}, '%')
</if>
</select>
注意:WHERE 1=1 避免所有條件失效導致語法錯誤。
<select id="queryByName" resultType="User">
SELECT * FROM sys_user WHERE user_type_id = 1
<choose>
<when test="userName != null">AND user_name LIKE CONCAT('%', #{userName}, '%')</when>
<when test="nickName != null">AND nick_name LIKE CONCAT('%', #{nickName}, '%')</when>
<otherwise>AND is_valid = 1</otherwise>
</choose>
</select>
按順序匹配首個成立分支,類似 switch。
<select id="findMenu" resultType="Menu">
SELECT * FROM sys_menu
<trim prefix="WHERE" prefixOverrides="AND |OR">
<if test="id != null">AND id = #{id}</if>
<if test="name != null">AND menu_name LIKE #{name}</if>
</trim>
</select>
prefix:若內容非空,前面加 WHEREprefixOverrides:移除開頭的 AND/OR<!-- where 自動處理首個 AND/OR -->
<select id="findUser" resultType="User">
SELECT * FROM user
<where>
<if test="id != null">id = #{id}</if>
<if test="name != null">AND username = #{name}</if>
</where>
</select>
<!-- set 自動處理尾部逗號 -->
<update id="updateUser">
UPDATE user
<set>
<if test="name != null">username = #{name},</if>
<if test="email != null">email = #{email},</if>
</set>
WHERE id = #{id}
</update>
<select id="selectByIds" resultType="User">
SELECT * FROM user
<where>
<if test="list != null and !list.isEmpty()">
<foreach collection="list" item="u" open="AND id IN (" separator="," close=")">
#{u.id}
</foreach>
</if>
</where>
</select>
<select id="selectByArray" resultType="User">
SELECT * FROM user
<where>
<foreach collection="array" item="id" open="AND id IN (" separator="," close=")">
#{id}
</foreach>
</where>
</select>
MyBatis 自動將單一 List/Array 參數包裝為 Map,Key 分別為 list、array。
property != null — 非空判斷list != null and !list.isEmpty() — 集合非空map.containsKey('key') — Map 包含鍵obj.property — 存取屬性/Getter