温馨提示×

温馨提示×

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

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

什么是动态SQL语句

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

动态 SQL 语句指的是在程序运行过程中,根据条件或参数动态拼接、生成并执行的 SQL 语句,而不是在代码中写死一条固定的 SQL。


一、什么是动态 SQL(通俗理解)

静态 SQL:SQL 语句在写代码时就固定了
动态 SQL:SQL 语句在运行时才确定,可能根据条件变化

示例对比

静态 SQL(固定)

SELECT * FROM user WHERE age > 18;

动态 SQL(可变)

如果用户输入了姓名 → 加 WHERE name = ?
如果用户输入了年龄 → 加 WHERE age > ?
如果都没输入 → 不加条件

最终 SQL 可能是:

SELECT * FROM user WHERE name = '张三' AND age > 20;

也可能是:

SELECT * FROM user;

二、为什么需要动态 SQL

实际开发中,查询条件往往是可选的,例如:

  • 用户可能只填部分查询条件
  • 不同业务场景需要不同字段
  • 权限不同,查询字段不同

如果写死 SQL,会导致:

  • SQL 数量爆炸
  • 条件判断复杂
  • 可维护性差

三、动态 SQL 的常见实现方式

1️⃣ 在代码中拼接 SQL(不推荐)

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

缺点

  • 容易 SQL 注入
  • 可读性差
  • 难维护

2️⃣ 使用占位符 + 条件拼接(较安全)

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

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

✅ 相对安全
✅ 实际项目中常见


3️⃣ 使用框架的动态 SQL(✅ 推荐)

✅ MyBatis 动态 SQL(最典型)

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

✅ 自动处理 AND
✅ 防止 SQL 注入
✅ 可读性强


4️⃣ JPA / Hibernate 动态查询

CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class);

if (name != null) {
    cq.where(cb.equal(root.get("name"), name));
}

四、动态 SQL 的优缺点

✅ 优点

  • 灵活,适应复杂查询
  • 减少重复 SQL
  • 提高代码可维护性

❌ 缺点

  • 可读性略差
  • 调试困难
  • 使用不当容易 SQL 注入

五、动态 SQL 常见使用场景

  • 多条件查询(搜索功能)
  • 报表查询
  • 后台管理系统
  • 权限过滤
  • 动态表名 / 字段(慎用)

六、一句话总结

动态 SQL 就是“根据运行时的条件,动态生成 SQL 语句”,在真实项目中非常常见,但一定要注意 安全性和可维护性

如果你愿意,我可以:

  • Java / MyBatis / Spring Boot 举例
  • 对比 动态 SQL vs 静态 SQL
  • 动态 SQL 安全问题与防注入
向AI问一下细节

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

AI