使用动态 SQL 的核心原因是:SQL 语句不能(或不适合)在写代码时完全确定,需要根据运行时的条件灵活拼接。下面从“为什么要用”以及“常见场景”两个角度说明。
现实业务里,查询条件往往是可选的:
如果用静态 SQL,就需要写很多 if-else 或大量不同的 SQL,非常冗余。
✅ 动态 SQL 可以做到:
SELECT * FROM user
WHERE 1=1
<if test="name != null">
AND name = #{name}
</if>
<if test="age != null">
AND age = #{age}
</if>
手动拼接字符串 SQL 容易出错:
String sql = "select * from user where 1=1 ";
if (name != null) {
sql += " and name = '" + name + "'"; // 危险、易错
}
✅ 动态 SQL(如 MyBatis)能安全、可读、可维护地拼接 SQL
使用动态 SQL 可以:
否则可能出现:
getUserByName
getUserByAge
getUserByNameAndAge
getUserByStatus
...
有的 SQL 需要:
例如:
<choose>
<when test="role == 'ADMIN'">
AND 1=1
</when>
<otherwise>
AND create_user = #{userId}
</otherwise>
</choose>
SELECT * FROM ${tableName}
⚠️ 注意:这是动态 SQL 的高级用法,要防止 SQL 注入
❌ 条件完全固定、简单 CRUD
❌ 为了“炫技”而把简单 SQL 写复杂
❌ 动态 SQL 带来性能问题时(如生成复杂 OR / IN)
| 场景 | 静态 SQL | 动态 SQL |
|---|---|---|
| 条件固定 | ✅ | ❌ |
| 条件可选 | ❌ | ✅ |
| 多条件组合 | ❌ | ✅ |
| 业务复杂 | ❌ | ✅ |
| 代码简洁 | ✅ | ✅ |
当 SQL 需要根据条件“是否出现、如何出现”来决定时,就该用动态 SQL。
如果你愿意,我可以结合 MyBatis / JPA / JDBC 给你具体示例,或者帮你判断某个场景是否适合用动态 SQL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。