sql语句中使用#{}与${}的区别

在我们自己写sql语句的时候,有的时候需要动态传参,这个时候就需要使用#{}和${}这两个符号作为sql语句来传参

区别:

1:#{}是占位符,${}是拼接符
2:Mybatis处理#{}的时候会自动将sql语句中的#{}替换成?号,调用PreparedStatement来赋值.
如: select * from student where name = #{studentName};
设studentName= zhangsan
在日志中我们就可以看到解析时会将sql语句中的#{studentName}变成?
在日志中的sql语句如下: 
 select * from student where name = ?;
这个?就是你传递的studentName的值zhangsan,而且会自动识别你传递参数的类型。
3:Mybatis处理${}时是直接在sql语句后面拼接你所传参数的值,调用Statement来赋值。
如:select * from student where name = ${userName}
设userName = lisi
看日志就可以发现会把userName中的值拼接上去
在日志中的sql语句如下
select * from student where name = lisi;

但需要注意的点是,在使用${}的时候,并不会自动识别类型,参数的值是什么,就拼接什么
如果你所传的参数是String类型,你在sql语句中使用${}就需要在外面加上单引号(双引号都行)。
sql语句如下所示
select * from student where name = '${userName}'
4:使用${}会出现sql注入的问题

比如一个登录表单,攻击者在用户名字段输入 admin' --,如果后端SQL语句是

SELECT * FROM users WHERE username = '[用户输入]' AND password = '[用户输入]'

则实际执行的SQL语句变成了

SELECT * FROM users WHERE username = 'admin' --' AND password = '[用户输入]'

这里 -- 后面的内容被注释掉,因此SQL语句实际上忽略了密码检查。

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值