动态 SQL(Dynamic SQL) 指的是在程序运行时,根据条件动态拼接或生成 SQL 语句,而不是在编译期就写死 SQL。它在实际开发中非常重要,主要作用如下:
在查询、更新等场景中,条件往往是可选的,动态 SQL 可以根据参数是否存在,自动决定是否拼接条件。
示例(MyBatis):
<select id="findUser" parameterType="map" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
</select>
✅ 好处:
if-else动态 SQL 常用于:
例如:
动态 SQL 可以自动适配这些情况。
在某些特殊场景(如分表、动态字段)中,表名或字段名是变化的。
SELECT * FROM ${tableName}
⚠️ 注意:
${} 有 SQL 注入风险更新时只更新有值的字段,而不是全部字段。
<update id="updateUser">
UPDATE user
<set>
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
</set>
WHERE id = #{id}
</update>
✅ 避免:
null<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
ORDER BY ${sortField} ${sortOrder}
✅ 灵活性高
✅ 减少 SQL 数量
✅ 适配复杂业务查询
✅ 提高代码可维护性
❌ 可读性下降(SQL 分散在 XML 或代码中)
❌ 调试困难
❌ 容易写出 SQL 注入漏洞(尤其是 ${})
❌ 性能问题(某些数据库无法缓存执行计划)
| 场景 | 是否适合动态 SQL |
|---|---|
| 多条件查询 | ✅ 非常适合 |
| 可选更新字段 | ✅ 非常适合 |
| 分表查询 | ⚠️ 可用但需谨慎 |
| 固定简单 SQL | ❌ 不建议 |
| 用户输入直接拼 SQL | ❌ 禁止 |
动态 SQL 的作用就是:让 SQL 能根据运行时的条件自动变化,从而适应复杂多变的业务需求。
如果你愿意,我也可以结合 MyBatis / JPA / JDBC 给你具体示例对比。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。