数据库中的 Dynamic SQL(动态 SQL),指的是在程序运行期间,根据条件或输入临时拼接、生成并执行的 SQL 语句,而不是在代码中写死的静态 SQL。
静态 SQL:SQL 语句在编译时就已确定
SELECT * FROM user WHERE id = 1;
动态 SQL:SQL 语句在运行时才决定
根据用户输入的查询条件,拼接出不同的 SQL
例如:
-- 根据是否有姓名条件动态拼接
SELECT * FROM user
WHERE 1=1
AND name LIKE ?
AND age > ?
查询条件不固定
表名或字段名运行时才确定
动态排序、分页
减少重复代码
String sql = "SELECT * FROM user WHERE 1=1";
if (name != null) {
sql += " AND name LIKE ?";
}
⚠️ 注意:容易 SQL 注入,必须用参数化。
MySQL 示例:
SET @sql = 'SELECT * FROM user';
SET @sql = CONCAT(@sql, ' WHERE age > 18');
PREPARE stmt FROM @sql;
EXECUTE stmt;
Oracle:
EXECUTE IMMEDIATE 'SELECT * FROM user WHERE id = 1';
<select id="findUser">
SELECT * FROM user
<where>
<if test="name != null">
AND name LIKE #{name}
</if>
<if test="age != null">
AND age > #{age}
</if>
</where>
</select>
✅ 使用 参数化查询(PreparedStatement)
❌ 不要直接拼接用户输入
✅ 白名单校验表名 / 字段名
✅ 限制动态 SQL 的使用范围
如果你愿意,我也可以:
你更想了解哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。