本文整理了 MyBatis 中进行 CRUD 操作时常用的动态 SQL 标签及其使用方式,适合初学者查阅和实践。
1. <if>
:条件判断
用于在满足条件时拼接 SQL 片段。
<select id="selectUser" parameterType="map" resultType="User">
SELECT * FROM user
<where>
<if test="name != null and name != ''">
name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
test
是唯一属性,使用 OGNL 表达式判断变量是否存在或满足条件。
2. <choose> / <when> / <otherwise>
:类似 switch-case
用于多分支选择。
<select id="getUser" parameterType="map" resultType="User">
SELECT * FROM user
<where>
<choose>
<when test="id != null">
id = #{id}
</when>
<when test="name != null">
name = #{name}
</when>
<otherwise>
1 = 1
</otherwise>
</choose>
</where>
</select>
3. <where>
:自动处理 WHERE
和 AND
自动去掉首个 AND
或 OR
,并在需要时自动加上 WHERE
。
<where>
<if test="name != null">name = #{name}</if>
<if test="age != null">AND age = #{age}</if>
</where>
4. <set>
:用于 UPDATE
自动拼接字段
会自动去除最后一个逗号,并加上 SET
。
<update id="updateUser" parameterType="User">
UPDATE user
<set>
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
</set>
WHERE id = #{id}
</update>
5. <foreach>
:用于批量操作(插入、删除、IN)
批量插入:
<insert id="batchInsert" parameterType="list">
INSERT INTO user (name, age) VALUES
<foreach collection="list" item="user" separator=",">
(#{user.name}, #{user.age})
</foreach>
</insert>
IN
查询:
<select id="selectByIds" parameterType="list" resultType="User">
SELECT * FROM user WHERE id IN
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
6. <trim>
:自定义修剪逻辑(替代 <set>
/ <where>
)
用于去除开头或结尾的多余 SQL 关键词。
<update id="updateUser" parameterType="User">
UPDATE user
<trim prefix="SET" suffixOverrides=",">
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
</trim>
WHERE id = #{id}
</update>