动态 SQL 语句指的是在程序运行过程中,根据条件或参数动态拼接、生成并执行的 SQL 语句,而不是在代码中写死一条固定的 SQL。
静态 SQL:SQL 语句在写代码时就固定了
动态 SQL:SQL 语句在运行时才确定,可能根据条件变化
SELECT * FROM user WHERE age > 18;
如果用户输入了姓名 → 加 WHERE name = ?
如果用户输入了年龄 → 加 WHERE age > ?
如果都没输入 → 不加条件
最终 SQL 可能是:
SELECT * FROM user WHERE name = '张三' AND age > 20;
也可能是:
SELECT * FROM user;
实际开发中,查询条件往往是可选的,例如:
如果写死 SQL,会导致:
String sql = "SELECT * FROM user WHERE 1=1";
if (name != null) {
sql += " AND name = '" + name + "'";
}
❌ 缺点
List<Object> params = new ArrayList<>();
String sql = "SELECT * FROM user WHERE 1=1";
if (name != null) {
sql += " AND name = ?";
params.add(name);
}
✅ 相对安全
✅ 实际项目中常见
<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 注入
✅ 可读性强
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 语句”,在真实项目中非常常见,但一定要注意 安全性和可维护性。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。