MyBatis 动态 SQL 标签详解教程:_set_、_trim_、_sql_、_choose_、_when_
一、动态 SQL 核心标签概览
在 MyBatis 中,动态 SQL 允许根据条件灵活拼接 SQL 语句。以下是本文重点讲解的标签及其作用:
标签 | 用途 | 典型场景 |
---|---|---|
<set> | 动态生成 SET 子句,自动去除末尾逗号 | 更新操作中处理非空字段 |
<trim> | 自定义前缀/后缀,修剪多余字符 | 灵活处理 WHERE 或 SET 子句 |
<sql> + <include> | 复用 SQL 片段 | 减少重复代码 |
<choose> | 多条件分支选择(类似 switch-case ) | 多选一条件过滤 |
二、标签详解与代码示例
以下结合用户提供的 EmpMapper.xml
和测试代码进行解析。
1. <set>
标签
用途:动态生成 UPDATE
语句的 SET
子句,自动处理逗号。
核心属性:无,内部通过 <if>
判断字段是否需要更新。
(1) 代码示例
<update id="updateEmp">UPDATE emp<set><if test="name != null">name = #{name},</if><if test="age != null">age = #{age},</if><if test="addr != null">addr = #{addr},</if><if test="salary != null">salary = #{salary},</if></set>WHERE id = #{id}
</update>
(2) 运行逻辑
- 输入:
Emp
对象中name="张四"
,其他字段为null
。 - 生成 SQL:
UPDATE emp SET name = '张四' WHERE id = 1
- 自动去逗号:即使
name
的<if>
内写了逗号,<set>
会智能删除末尾逗号。
(3) 对比 <trim>
实现
<set>
是 <trim>
的简化写法,等价于:
<trim prefix="SET" suffixOverrides