温馨提示×

温馨提示×

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

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

Dynamic SQL适合哪些场景

发布时间:2026-10-20 01:30:37 来源:亿速云 阅读:86 作者:小樊 栏目:数据库

**Dynamic SQL(动态 SQL)**指的是在程序运行时,根据条件动态拼接或生成 SQL 语句,而不是在代码中写死固定的 SQL。它并不是“任何时候都用”,而是在一些特定场景下非常合适。

下面按典型场景来说明 Dynamic SQL 适合用在哪些地方:


1. 查询条件不确定(最常见)

当查询条件数量、组合方式不固定时,动态 SQL 非常合适。

例子:

  • 用户搜索页面:
    • 可按「用户名」查
    • 可按「日期范围」查
    • 可按「状态」查
    • 也可什么都不填,查全部
SELECT * FROM user
WHERE 1=1
  <if test="username != null">
    AND username = #{username}
  </if>
  <if test="startDate != null">
    AND create_time >= #{startDate}
  </if>

✅ 适合:后台管理系统、报表查询、搜索接口


2. 表名或字段名在运行时才能确定

如果表名、列名不是固定的,只能用动态 SQL(或字符串拼接)。

例子:

  • 按年份分表:order_2023、order_2024
  • 不同业务使用不同字段名
SELECT * FROM ${tableName}
WHERE id = #{id}

⚠️ 注意:这种场景有 SQL 注入风险,必须严格控制输入


3. 批量操作(数量不固定)

批量插入、更新、删除时,数据条数通常不确定。

例子:批量插入

INSERT INTO user (id, name) VALUES
<foreach collection="list" item="item" separator=",">
  (#{item.id}, #{item.name})
</foreach>

✅ 适合:

  • Excel 导入
  • 批量审核
  • 批量状态变更

4. 排序字段和排序方式动态

用户可自由选择:

  • 按时间 / 价格 / 热度
  • 升序 / 降序
ORDER BY ${sortField} ${sortOrder}

⚠️ 排序字段必须是白名单控制,不能让用户直接传字符串


5. 分页 + 多条件查询

分页本身条件固定,但:

  • 查询条件多
  • 条件可空
  • 排序可变

这是 MyBatis 中 Dynamic SQL 使用最多的场景之一。


6. 报表 / OLAP 类查询

  • 维度不固定
  • 聚合字段不固定
  • 行转列、动态列

这类 SQL 很难写死,通常用动态 SQL 或代码生成 SQL。


7. 权限过滤(运行时决定)

不同角色看到的数据不同:

<if test="role == 'MANAGER'">
  AND department_id = #{deptId}
</if>

✅ 适合:

  • 多租户
  • 数据权限
  • 组织架构隔离

不适合使用 Dynamic SQL 的场景

❌ 简单固定查询(直接写死 SQL 更清晰)
❌ 高频简单 SQL(动态拼接有性能和维护成本)
❌ 可以静态建模解决的问题


总结一句话

Dynamic SQL 适合“结构相似,但条件、表、字段、数量在运行时才确定”的场景。

如果你愿意,我也可以:

  • 用 MyBatis / JPA / JDBC 举例
  • 对比 动态 SQL vs 静态 SQL
  • 讲 动态 SQL 的安全写法(防注入)
向AI问一下细节

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

AI
助
手