温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

动态SQL有什么作用

发布时间:2026-07-14 08:17:08 来源:亿速云 阅读:84 作者:小樊 栏目:数据库

动态 SQL(Dynamic SQL) 指的是在程序运行时,根据条件动态拼接或生成 SQL 语句,而不是在编译期就写死 SQL。它在实际开发中非常重要,主要作用如下:


一、核心作用

1️⃣ 根据条件动态拼接 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 更灵活
  • 减少重复代码

2️⃣ 实现灵活的查询条件(多条件搜索)

动态 SQL 常用于:

  • 搜索功能
  • 高级筛选
  • 报表查询

例如:

  • 用户可能只填了“姓名”
  • 用户可能同时填了“姓名 + 时间范围”
  • 用户可能什么都不填(查全部)

动态 SQL 可以自动适配这些情况。


3️⃣ 动态生成表名、字段名(慎用)

在某些特殊场景(如分表、动态字段)中,表名或字段名是变化的。

SELECT * FROM ${tableName}

⚠️ 注意:

  • ${}SQL 注入风险
  • 一般不建议用于用户输入

4️⃣ 动态控制更新字段(UPDATE)

更新时只更新有值的字段,而不是全部字段。

<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
  • 写多个 update 方法

5️⃣ 构建复杂 SQL(IN、排序、分页)

动态 IN 查询

<foreach collection="ids" item="id" open="(" close=")" separator=",">
  #{id}
</foreach>

动态排序

ORDER BY ${sortField} ${sortOrder}

二、动态 SQL 的优点

灵活性高
减少 SQL 数量
适配复杂业务查询
提高代码可维护性


三、动态 SQL 的缺点与风险

可读性下降(SQL 分散在 XML 或代码中)
调试困难
容易写出 SQL 注入漏洞(尤其是 ${}
性能问题(某些数据库无法缓存执行计划)


四、常见使用场景总结

场景 是否适合动态 SQL
多条件查询 ✅ 非常适合
可选更新字段 ✅ 非常适合
分表查询 ⚠️ 可用但需谨慎
固定简单 SQL ❌ 不建议
用户输入直接拼 SQL ❌ 禁止

五、一句话总结

动态 SQL 的作用就是:让 SQL 能根据运行时的条件自动变化,从而适应复杂多变的业务需求。

如果你愿意,我也可以结合 MyBatis / JPA / JDBC 给你具体示例对比。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI