**Dynamic SQL(动态 SQL)**指的是在程序运行时,根据条件动态拼接或生成 SQL 语句,而不是在代码中写死固定的 SQL。它并不是“任何时候都用”,而是在一些特定场景下非常合适。
下面按典型场景来说明 Dynamic SQL 适合用在哪些地方:
当查询条件数量、组合方式不固定时,动态 SQL 非常合适。
例子:
SELECT * FROM user
WHERE 1=1
<if test="username != null">
AND username = #{username}
</if>
<if test="startDate != null">
AND create_time >= #{startDate}
</if>
✅ 适合:后台管理系统、报表查询、搜索接口
如果表名、列名不是固定的,只能用动态 SQL(或字符串拼接)。
例子:
order_2023、order_2024SELECT * FROM ${tableName}
WHERE id = #{id}
⚠️ 注意:这种场景有 SQL 注入风险,必须严格控制输入
批量插入、更新、删除时,数据条数通常不确定。
例子:批量插入
INSERT INTO user (id, name) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.id}, #{item.name})
</foreach>
✅ 适合:
用户可自由选择:
ORDER BY ${sortField} ${sortOrder}
⚠️ 排序字段必须是白名单控制,不能让用户直接传字符串
分页本身条件固定,但:
这是 MyBatis 中 Dynamic SQL 使用最多的场景之一。
这类 SQL 很难写死,通常用动态 SQL 或代码生成 SQL。
不同角色看到的数据不同:
<if test="role == 'MANAGER'">
AND department_id = #{deptId}
</if>
✅ 适合:
❌ 简单固定查询(直接写死 SQL 更清晰)
❌ 高频简单 SQL(动态拼接有性能和维护成本)
❌ 可以静态建模解决的问题
Dynamic SQL 适合“结构相似,但条件、表、字段、数量在运行时才确定”的场景。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。