mybatis中的#{}和${}的区别
2016-07-08 16:14
246 查看
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注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。
一般如果可以使用#{}就不要使用${}符号。
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注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。
相关文章推荐
- Varnish4.1.2代理缓存
- 根据两点经纬度计算距离
- django URL学习
- 完整的申请邓白氏编码的流程(手把手教你申请邓白氏编码)
- Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x1
- 喷码机报300V电源故障
- Java---三种文件拷贝的实现方法
- 练习20——函数和文件
- 记录一个android的代码网址
- Linux下启动Oracle服务和监听程序
- Android Studio的内存泄漏检测与解决
- Oracle安装后的默认账号以及一些基本操作
- UVA - 10474 Where is the Marble?
- 【noip暑假tarjan专题】
- cocos2dx中的声音
- 删除vector指定下标的元素
- DAG图与拓扑排序
- Layer3 OSPF网络类型和LSA1、2
- 工作环境配置
- opencv等待函数