#{} 和 ${}的区别
更新: 2025/12/6 字数: 0 字 时长: 0 分钟
#{}会预编译,MyBatis将其替换成?,也会自动进行类型处理,不需要手动添加引号,可以有效防止SQL注入(使用场景:参数值的传递,例如WHERE、INSERT等)
参数值会安全地传递给
?,即使传入恶意参数如' OR '1'='1,也只会被当作一个普通的字符串值,不会破坏SQL结构。
${}直接字符串替换,纯粹的字符串拼接,存在SQL注入风险,(使用场景:动态SQL部分,例如表名、列名等)
xml
<!-- 使用 ${} 的危险写法 -->
<select id="login" resultType="User">
SELECT * FROM user
WHERE username = '${username}' AND password = '${password}'
</select>-- 在SQL中是注释,后面的条件被注释掉了,攻击者就能以admin身份登录,最后得到的结果是:
sql
SELECT * FROM user
WHERE username = 'admin' -- ' AND password = '任意密码'