温馨提示×

温馨提示×

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

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

动态SQL和普通SQL区别

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

动态 SQL 和普通 SQL(又叫静态 SQL)的主要区别在于 SQL 语句是否在编译期确定,以及 是否可以在运行时动态拼接/生成。下面从多个角度对比说明,并给出典型使用场景。


一、核心区别总结

对比项 普通 SQL(静态 SQL) 动态 SQL
SQL 是否固定 ✅ 编译期已确定 ❌ 运行时才确定
是否可拼接条件 ❌ 不能 ✅ 可以
灵活性
编译优化 好(可预编译) 较差(部分无法预编译)
SQL 注入风险 低(参数化时) 高(拼接字符串时)
可读性 稍差
常见使用场景 固定查询 条件不确定的查询

二、什么是普通 SQL(静态 SQL)

普通 SQL 是指在代码中 SQL 语句是固定写死的,参数通常通过占位符(?@参数)传入。

示例(Java + JDBC)

String sql = "SELECT * FROM user WHERE id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 10);

✅ SQL 结构不变
✅ 只有参数变化
✅ 数据库可以预编译 SQL


三、什么是动态 SQL

动态 SQL 是指 SQL 语句在 运行时根据条件动态拼接生成,例如:

  • 可选查询条件
  • 不同状态走不同 SQL
  • 动态排序、分页

示例(简单拼接)

String sql = "SELECT * FROM user WHERE 1=1";
if (name != null) {
    sql += " AND name = '" + name + "'";
}

⚠️ 有严重 SQL 注入风险(不推荐)


示例(MyBatis 动态 SQL)

<select id="findUser" parameterType="map" resultType="User">
  SELECT * FROM user
  <where>
    <if test="name != null">
      AND name = #{name}
    </if>
    <if test="age != null">
      AND age = #{age}
    </if>
  </where>
</select>

✅ SQL 在运行时动态生成
✅ 使用 #{} 防止 SQL 注入
✅ 条件灵活


四、动态 SQL 常见实现方式

1️⃣ 字符串拼接(不推荐)

  • 灵活但危险
  • 易 SQL 注入

2️⃣ 框架支持(推荐)

  • MyBatis <if>/<choose>/<foreach>
  • Hibernate JPA Criteria API
  • Spring Data JPA Specification

3️⃣ 存储过程中的动态 SQL

EXEC('SELECT * FROM user WHERE id = ' + @id)

五、性能与安全问题

性能

  • 普通 SQL:可预编译、缓存执行计划 ✅
  • 动态 SQL:可能每次重新解析 SQL ❌

安全

  • ✅ 普通 SQL + 参数化查询 → 安全
  • ❌ 动态 SQL + 字符串拼接 → SQL 注入风险

✅ 正确做法:
动态 SQL + 参数化查询(占位符)


六、什么时候用动态 SQL?

✅ 适合使用动态 SQL 的场景:

  • 多条件筛选(有些条件可为空)
  • 后台管理系统查询
  • 报表查询
  • 动态排序 / 分页
  • 表名或字段名动态变化(少见)

❌ 不适合:

  • 简单固定查询
  • 高并发核心接口(尽量用静态 SQL)

七、一句话总结

普通 SQL 是“写死的 SQL”,动态 SQL 是“运行期拼出来的 SQL”。
动态 SQL 更灵活,但复杂性、性能和安全风险也更高。

如果你愿意,我也可以:

  • MyBatis / JPA / JDBC 对比示例
  • 分析你当前项目是否该用动态 SQL
  • 帮你重构一段“拼接 SQL”为安全写法
向AI问一下细节

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

AI