动态 SQL 有可能报错,但是否报错取决于你怎么写、运行环境以及 SQL 本身是否合法。下面从常见情况给你系统说明一下(以 MyBatis 动态 SQL 为例,其他语言思路也类似)。
<select id="selectUser">
SELECT * FROM user
<where>
<if test="name != null">
AND name = #{name}
</if>
</where>
</select>
✅ 只要:
就不会报错。
SELECT * FROM user
<where>
<if test="false">
AND 1=1
</if>
</where>
拼接后是:
SELECT * FROM user
✅ 正常执行,不报错。
<if test="true">
SELECT * FROM user WHERE
</if>
最终 SQL:
SELECT * FROM user WHERE
❌ 语法错误,数据库直接报错。
SELECT * FROM user
WHERE
<if test="name != null">
name = #{name}
</if>
如果 name == null:
SELECT * FROM user WHERE
❌ 报错。
✅ 正确做法:用 <where> 标签。
AND age = #{name}
数据库字段是 int,但传入 String:
❌ 报错(SQL 执行阶段)
${}(字符串替换)ORDER BY ${column}
如果 column = "id;":
ORDER BY id;
❌ 可能导致 SQL 注入或语法错误。
✅ 推荐用 #{},除非你非常确定安全。
<if test="name != null">
但 name 根本不存在于参数对象中:
❌ 可能抛 OGNL 异常。
SELECT * FROM not_exist_table
❌ 无论是不是动态 SQL,都会报错。
动态 SQL 只是“拼 SQL”,拼完之后和手写 SQL 没区别
所以:
| 层级 | 是否可能报错 |
|---|---|
| XML 解析 | ✅ |
| OGNL 表达式 | ✅ |
| SQL 拼接 | ✅ |
| SQL 执行 | ✅ |
✅ 推荐使用:
<where><set><trim>#{} 而不是 ${}✅ 开发建议:
动态 SQL 本身不会“必然报错”,但拼出来的 SQL 如果非法,就一定会报错。
如果你愿意,可以把你具体的 动态 SQL 代码贴出来,我可以直接帮你判断会不会报错、为什么报错。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。