Dynamic SQL(动态 SQL) 通常指在程序运行期间,根据条件或输入动态生成并执行的 SQL 语句,而不是在代码中写死的一条固定 SQL。
普通 SQL 是“静态”的,例如:
SELECT * FROM user WHERE id = 1;
而动态 SQL 是在运行时拼出来或条件化生成的,例如:
SELECT * FROM user
WHERE 1=1
AND name LIKE ?
AND age > ?
其中 name、age 是否出现,由运行时的参数决定。
常见场景:
String sql = "SELECT * FROM user WHERE 1=1";
if (name != null) {
sql += " AND name LIKE '%" + name + "%'";
}
⚠️ 容易 SQL 注入,不安全
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 + "%");
}
✅ 安全、可维护
<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")
EXEC('SELECT * FROM ' + @tableName);
⚠️ 也要防注入
✅ 优点
❌ 缺点
Dynamic SQL = 运行时根据条件“动态生成”的 SQL 语句,用于解决不确定、灵活的数据库查询需求。
如果你指的是 MyBatis / JPA / 某种具体语言中的动态 SQL,可以告诉我,我可以针对性讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。