温馨提示×

温馨提示×

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

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

何为Dynamic SQL动态

发布时间:2026-09-08 22:54:12 来源:亿速云 阅读:86 作者:小樊 栏目:数据库

Dynamic SQL(动态 SQL) 通常指在程序运行期间,根据条件或输入动态生成并执行的 SQL 语句,而不是在代码中写死的一条固定 SQL。


一、什么是 Dynamic SQL

普通 SQL 是“静态”的,例如:

SELECT * FROM user WHERE id = 1;

而动态 SQL 是在运行时拼出来或条件化生成的,例如:

SELECT * FROM user
WHERE 1=1
  AND name LIKE ? 
  AND age > ?

其中 nameage 是否出现,由运行时的参数决定。


二、为什么需要动态 SQL

常见场景:

  • 多条件查询(有的条件有,有的没有)
  • 排序字段、排序方式不确定
  • 不同角色看到不同字段
  • 批量操作(IN 参数个数不固定)

三、常见实现方式

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

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

⚠️ 容易 SQL 注入,不安全


2️⃣ 预编译 + 条件拼接(推荐)

StringBuilder sql = new StringBuilder("SELECT * FROM user WHERE 1=1");
List<Object> params = new ArrayList<>();

if (name != null) {
    sql.append(" AND name LIKE ?");
    params.add("%" + name + "%");
}

✅ 安全、可维护


3️⃣ MyBatis 中的 Dynamic SQL(最常见)

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

或注解方式:

@SelectProvider(type = UserSqlBuilder.class, method = "buildSql")

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

EXEC('SELECT * FROM ' + @tableName);

⚠️ 也要防注入


四、动态 SQL 的优缺点

✅ 优点

  • 灵活
  • 减少冗余 SQL
  • 适配复杂业务

❌ 缺点

  • 可读性差
  • 调试困难
  • 易出 SQL 注入(若不规范)

五、一句话总结

Dynamic SQL = 运行时根据条件“动态生成”的 SQL 语句,用于解决不确定、灵活的数据库查询需求。

如果你指的是 MyBatis / JPA / 某种具体语言中的动态 SQL,可以告诉我,我可以针对性讲。

向AI问一下细节

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

AI