我对使用$ vs #
感到困惑。我没有找到任何指南。我用它们作为
name = #{name}
,name like '%${word}%'
,order by name ${orderAs}
,where name = #{word}
有时,这些工作正常,但有时,参数不包括在内或给我错误
org.apache.ibatis.reflection.ReflectionException:没有getter 对于名为'name'的财产.......
所以,我想知道何时使用$
或#
?
答案 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}