MyBatis 动态 SQL 笔记

AI-摘要
LNotes-AI GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
MyBatis 动态 SQL 笔记
Liuxz动态 SQL 是 MyBatis 核心特性之一,支持根据不同条件动态拼接 SQL 语句,灵活适配复杂业务场景。
一、核心标签分类
| 标签类型 | 包含标签 | 作用 |
|---|---|---|
| 条件判断 | <if>、<where>、<choose> |
按条件动态拼接 SQL 片段 |
| 片段控制 | <trim>、<set> |
智能处理 SQL 片段的前缀、后缀(如 WHERE、SET 关键字) |
| 循环遍历 | <foreach> |
遍历集合 / 数组,动态生成批量操作 SQL |
| 片段复用 | <sql>、<include> |
抽取可复用的 SQL 片段,提升代码复用性 |
二、条件判断标签
1. <if> + <where>
作用:根据条件动态拼接 WHERE 子句,自动处理 AND/OR 关键字冗余问题。
示例:
1 | <select id="selectEmployeeByCondition" resultType="employee"> |
- 若
empName和empSalary都不为空,生成WHERE emp_name=? AND emp_salary>?。 - 若某条件不满足,
<where>会自动剔除多余的AND/OR。
2. <choose> + <when> + <otherwise>
作用:多条件分支,仅执行第一个满足条件的分支(类似 Java if-else if-else)。
示例:
1 | <select id="selectEmployeeByConditionByChoose" resultType="com.atguigu.mybatis.entity.Employee"> |
- 若
empName不为空,执行emp_name=?; - 若
empName为空但empSalary < 3000,执行emp_salary < 3000; - 若都不满足,执行
1=1(查询所有)。
三、片段控制标签
1. <trim>
作用:通过自定义前缀、后缀和覆盖规则,灵活控制 SQL 片段的拼接(可替代 <where>、<set>)。
属性说明:
prefix:为 SQL 片段添加前缀(如WHERE)。suffix:为 SQL 片段添加后缀。prefixOverrides:覆盖前缀的冗余关键字(如AND、OR)。suffixOverrides:覆盖后缀的冗余关键字(如,)。
示例:
1 | <select id="selectEmployeeByConditionByTrim" resultType="com.atguigu.mybatis.entity.Employee"> |
2. <set>
作用:专用于 UPDATE 语句,自动处理 SET 子句中冗余的 ,。
示例:
1 | <update id="updateEmployeeDynamic"> |
四、循环遍历标签 <foreach>
作用:遍历集合 / 数组,动态生成批量操作 SQL(如批量插入、批量查询 IN 条件)。
属性说明:
collection:要遍历的集合 / 数组(必填)。item:遍历过程中每个元素的别名(必填)。separator:元素之间的分隔符(如,、;)。open:SQL 片段的前缀(如values、()。close:SQL 片段的后缀(如))。index:遍历 List 时为索引,遍历 Map 时为键。
示例 1:批量插入
1 | <foreach collection="empList" item="emp" separator="," open="values" index="myIndex"> |
生成 SQL:values (?,0,?,?), (?,1,?,?)
示例 2:批量更新(需开启 allowMultiQueries=true)
1 | <update id="updateEmployeeBatch"> |
生成 SQL:update ... where ...; update ... where ...
五、SQL 片段复用 <sql> + <include>
作用:抽取可复用的 SQL 片段(如列名、条件),通过 <include> 引用,提升代码复用性。
示例:
1 | <!-- 抽取可复用的列名片段 --> |
六、特殊字符转义
在 XML 中,以下特殊字符需使用转义字符,否则会导致解析错误:
| 原始字符 | 转义字符 |
|---|---|
& |
& |
< |
< |
> |
> |
" |
" |
' |
' |
示例:empSalary < 3000 表示 empSalary < 3000。
七、动态 SQL 优势
- 灵活性:根据业务条件动态生成 SQL,适配复杂查询场景。
- 简洁性:通过标签自动处理 SQL 冗余(如多余的
AND、SET后的,)。 - 复用性:通过
<sql>抽取片段,减少重复代码。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果



