温馨提示×

温馨提示×

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

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

为什么要用动态SQL

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

使用动态 SQL 的核心原因是:SQL 语句不能(或不适合)在写代码时完全确定,需要根据运行时的条件灵活拼接。下面从“为什么要用”以及“常见场景”两个角度说明。


一、为什么要用动态 SQL?

1️⃣ 查询条件不确定

现实业务里,查询条件往往是可选的

  • 用户可能只填了姓名
  • 也可能同时填了姓名 + 年龄 + 状态
  • 还可能什么都不填,查全部数据

如果用静态 SQL,就需要写很多 if-else 或大量不同的 SQL,非常冗余。

✅ 动态 SQL 可以做到:

SELECT * FROM user
WHERE 1=1
<if test="name != null">
  AND name = #{name}
</if>
<if test="age != null">
  AND age = #{age}
</if>

2️⃣ 避免 SQL 拼接错误

手动拼接字符串 SQL 容易出错:

String sql = "select * from user where 1=1 ";
if (name != null) {
    sql += " and name = '" + name + "'"; // 危险、易错
}
  • 容易漏空格
  • 容易 SQL 注入
  • 可读性差

✅ 动态 SQL(如 MyBatis)能安全、可读、可维护地拼接 SQL


3️⃣ 提高代码复用性

使用动态 SQL 可以:

  • 用一条 SQL 适配多种查询场景
  • 减少重复 SQL 片段
  • 统一维护逻辑

否则可能出现:

getUserByName
getUserByAge
getUserByNameAndAge
getUserByStatus
...

4️⃣ 支持复杂业务规则

有的 SQL 需要:

  • 根据状态走不同逻辑
  • 根据时间范围动态加条件
  • 根据权限过滤数据

例如:

<choose>
  <when test="role == 'ADMIN'">
    AND 1=1
  </when>
  <otherwise>
    AND create_user = #{userId}
  </otherwise>
</choose>

5️⃣ 动态表名 / 动态字段(高级场景)

  • 分表场景(order_2024、order_2025)
  • 动态字段(不同业务不同列)
SELECT * FROM ${tableName}

⚠️ 注意:这是动态 SQL 的高级用法,要防止 SQL 注入


二、什么时候“不应该”用动态 SQL?

❌ 条件完全固定、简单 CRUD
❌ 为了“炫技”而把简单 SQL 写复杂
❌ 动态 SQL 带来性能问题时(如生成复杂 OR / IN)


三、对比总结

场景 静态 SQL 动态 SQL
条件固定
条件可选
多条件组合
业务复杂
代码简洁

四、一句话总结

当 SQL 需要根据条件“是否出现、如何出现”来决定时,就该用动态 SQL。

如果你愿意,我可以结合 MyBatis / JPA / JDBC 给你具体示例,或者帮你判断某个场景是否适合用动态 SQL。

向AI问一下细节

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

AI