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注入攻击。

因此,我们推荐尽可能使用#{}来传递参数,除非你明确知道你在做什么。

发表评论

后才能评论