1. MyBatis动态SQL的前世今生
作为一名长期使用MyBatis的开发者,我见证了动态SQL从最初的XML拼接发展到如今功能完备的标签体系。动态SQL本质上解决了传统JDBC开发中SQL语句硬编码的痛点——当业务需求变化时,我们需要不断修改Java代码中的SQL字符串,这种开发方式既低效又容易出错。
MyBatis通过OGNL表达式和一系列智能标签,将SQL的组装过程从Java代码转移到XML配置文件中。这种设计带来了三个显著优势:
- SQL与Java代码解耦,修改SQL不再需要重新编译部署
- 条件分支、循环等逻辑可以直接在XML中表达
- 自动处理参数类型转换和特殊字符转义
重要提示:虽然MyBatis提供了注解方式编写SQL,但复杂业务场景下XML配置方式仍然是首选,这也是为什么动态SQL标签体系如此重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心标签全解析与防注入机制
2.1 条件控制标签组
if标签是最基础的动态元素,它的test属性支持完整的OGNL表达式:
xml复制<select id="findActiveBlogWithTitleLike" resultType="Blog">
SELECT * FROM blog
WHERE state = 'ACTIVE'
<if test="title != null">
AND title like #{title}
</if>
</select>
choose/when/otherwise组合实现了Java中的switch-case逻辑:
xml复制<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM blog WHERE state = 'ACTIVE'
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null">
AND author_name like #{author}
</when>
<otherwise>
AND feat
