何时使用$ vs#?

时间:2016-10-10 08:34:52

标签: mybatis ibatis

我对使用$ vs #感到困惑。我没有找到任何指南。我用它们作为
name = #{name}name like '%${word}%'order by name ${orderAs}where name = #{word}
有时,这些工作正常,但有时,参数不包括在内或给我错误

  

org.apache.ibatis.reflection.ReflectionException:没有getter   对于名为'name'的财产.......

所以,我想知道何时使用$#

2 个答案:

答案 0 :(得分:20)

在您的sql语句中使用myBatis指南#{}之后。

如果您查看Mapper XML Files部分中的任何MyBatis参考文件,它会明确表示:

  

注意参数表示法:

     

#{id}

否则${}用于

1-配置properties

例如:

<properties resource="org/mybatis/example/config.properties">
  <property name="username" value="dev_user"/>
  <property name="password" value="F2Fa3!33TYyg"/>
</properties>

然后可以像下一个一样使用属性:

<dataSource type="POOLED">
  <property name="username" value="${username}"/>
  <property name="password" value="${password}"/>
</dataSource>

2-字符串替换${}Parameters section):

  

默认情况下,使用#{}语法将导致MyBatis生成   PreparedStatement属性并安全地设置值   PreparedStatement参数(例如?)。虽然这更安全,更快速   几乎总是首选,有时你只想直接注入一个   字符串未修改为SQL语句。例如,对于ORDER BY,   你可以使用这样的东西:

     

ORDER BY $ {columnName}

     

这里MyBatis不会修改或转义字符串。

     

注意接受用户输入并将其提供给用户是不安全的   这种说法没有修改。这导致了潜在的SQL   注入攻击,因此您应该禁止用户输入   在这些领域,或者总是执行自己的逃脱和检查。

确切地说,name like '%${word}%' or命令名为{{orderAs}`,你需要使用字符串替换而不是预备语句。

答案 1 :(得分:1)

这个(${} - 简单变量)

SELECT * from user where name = ${name}

翻译成这个

SELECT * from user where name = 'Joe'

,但是(#{} - 相当于 JDBC 中的 PreparedStatement)

SELECT * from user where name = #{name}

翻译成

SELECT * from user where name =?

,所以最好的用法是

SELECT * from ${tablename} where name = #{name}