MyBatis 的$和# 传参的区别?
在 MyBatis 中,#{}
和 ${}
都可以用于传递参数,但它们之间有一个重要的区别:
#{}
是安全的,它可以防止SQL注入。当你使用#{}
传递参数时,MyBatis 会将参数值作为预编译的参数,这意味着参数值会被正确地转义,从而防止了SQL注入。
例如:
<select id="selectUser" resultType="com.example.User">
SELECT * FROM user WHERE first_name = #{firstName}
</select>
在上面的例子中,如果firstName
的值是O'Reilly
,那么MyBatis 会生成如下的SQL语句:
SELECT * FROM user WHERE first_name = 'O''Reilly'
你可以看到,'
字符被正确地转义了。
${}
是不安全的,它不能防止SQL注入。当你使用${}
传递参数时,MyBatis 会将参数值直接插入到SQL语句中,这意味着参数值不会被转义。
例如:
<select id="selectUser" resultType="com.example.User">
SELECT * FROM user WHERE first_name = '${firstName}'
</select>
在上面的例子中,如果firstName
的值是O'Reilly
,那么MyBatis 会生成如下的SQL语句:
SELECT * FROM user WHERE first_name = 'O'Reilly'
你可以看到,'
字符没有被转义,这可能导致SQL语句执行失败,或者更糟糕的是,如果firstName
的值包含恶意的SQL语句,那么这可能导致SQL注入攻击。
因此,我们推荐尽可能使用#{}
来传递参数,除非你明确知道你在做什么。