mybatis中的#{}和${}的区别

来源:互联网 发布:淘宝商城秋冬服饰团购 编辑:程序博客网 时间:2024/06/18 12:53

mybatis中的#{}与${}的区别
一般如果可以使用#{}就不要使用${}符号。
1.如果是在mapper中
#{param}会产生PreparedStatement,并且可以安全地设置参数(=?)的值。以为sql语句已经预编译好了,传入参数的时候,不会重新生产sql语句。安全性高。
${parem}则直接将{}号中的param插入字符串,会产生sql注入的问题:
例如:select * from userwhere userName= ${userName} 
输出的结果为
select * from userwhere userName= “小明”
3)在特定场景下,例如如果在使用诸如order by '{param}',这时候就可以使用${}
4)#{}方式能够很大程度防止sql注入,${}方式无法防止sql注入
5)${}方式一般用于传入数据库对象,例如传入表名

字符串替换
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。







0 0