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