在 MyBatis 中,“动态 SQL”指的是根据条件动态拼接 SQL 语句,常用于查询、更新等场景。MyBatis 提供了一些标签来实现动态 SQL。
下面按常用方式 + 示例说明(基于 XML 方式,最常用)。
| 标签 | 作用 |
|---|---|
<if> |
条件判断 |
<where> |
自动处理 WHERE 和多余 AND/OR |
<set> |
更新时自动处理 SET 和逗号 |
<choose><when><otherwise> |
类似 if-else |
<foreach> |
遍历集合(IN、批量) |
<trim> |
自定义前缀/后缀处理 |
<if> + <where>(最常用)List<User> selectUser(User user);
<select id="selectUser" resultType="User">
SELECT * FROM user
<where>
<if test="name != null and name != ''">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</where>
</select>
✅ 特点:
<where> 会自动去掉多余的 AND<set> 动态更新<update id="updateUser">
UPDATE user
<set>
<if test="name != null">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
</set>
WHERE id = #{id}
</update>
✅ <set> 会自动去掉最后一个逗号
<choose>(if / else if / else)<select id="selectUser" resultType="User">
SELECT * FROM user
<where>
<choose>
<when test="name != null">
AND name = #{name}
</when>
<when test="age != null">
AND age = #{age}
</when>
<otherwise>
AND status = 1
</otherwise>
</choose>
</where>
</select>
<foreach>(IN / 批量)<select id="selectByIds" resultType="User">
SELECT * FROM user
WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
<insert id="batchInsert">
INSERT INTO user(name, age) VALUES
<foreach collection="list" item="u" separator=",">
(#{u.name}, #{u.age})
</foreach>
</insert>
<trim>(更灵活)<trim prefix="WHERE" prefixOverrides="AND | OR">
<if test="name != null">
AND name = #{name}
</if>
</trim>
@Select({
"<script>",
"SELECT * FROM user",
"<where>",
"<if test='name != null'> AND name = #{name} </if>",
"</where>",
"</script>"
})
List<User> selectUser(@Param("name") String name);
test 中是 OGNL 表达式
age != nullname != null and name != ''@Param如果你愿意,我可以:
你更想看哪一种?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。