动态 SQL 是指在运行时根据条件动态拼接或生成 SQL 语句的技术,常见于 MyBatis、Hibernate、JDBC 以及各类 ORM 框架中。它在复杂业务查询场景下非常实用。
下面从核心优势、典型应用场景、注意事项三个方面说明。
动态 SQL 可以根据参数是否存在、是否为空、是否满足某些条件来决定是否拼接某段 SQL。
✅ 示例(MyBatis):
<select id="queryUser">
SELECT * FROM user
WHERE 1=1
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
优势:
不使用动态 SQL 时,往往需要写多个几乎相同的 SQL:
findByConditionA
findByConditionB
findByConditionAAndB
使用动态 SQL:
动态 SQL 将 SQL 与业务逻辑解耦:
动态 SQL 支持:
✅ 示例:
<choose>
<when test="sortBy == 'age'">ORDER BY age</when>
<when test="sortBy == 'name'">ORDER BY name</when>
<otherwise>ORDER BY id</otherwise>
</choose>
AND 或 WHERE 时出现语法错误主流框架对动态 SQL 支持良好:
| 框架 | 动态 SQL 方式 |
|---|---|
| MyBatis | XML / 注解 |
| Hibernate | Criteria / HQL |
| JPA | Specification |
| Spring JDBC | 手动拼接 / 工具类 |
✅ 后台管理系统(多条件查询)
✅ 报表系统(动态字段、动态排序)
✅ 搜索功能(模糊查询、范围查询)
✅ 分表分库(动态表名)
✅ 批量操作(动态 IN)
虽然动态 SQL 优势明显,但也有需要注意的问题:
❌ 不当拼接字符串:
"WHERE name = '" + name + "'"
✅ 应使用:
#{})✅ 建议:
✅ 建议:
动态 SQL 的最大优势是:在保持 SQL 结构清晰的前提下,实现灵活、可维护、可扩展的查询逻辑。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。