#{}和${}的区别

在使用mybatis的时候我们会使用到#{}和${}这两个符号来为sql语句传参数

那么这两者有什么区别呢?

1.#{}是预编译处理,是占位符,${}是字符串替换,是拼接符

2.Mybatis在处理#{}的时候会将sql中的#{}替换成?号,调用PreparedStatement来赋值

如:select * from user where name = #{userName};设userName=tjh
看日志我们可以看到解析时将#{userName}替换成了 ?
select * from user where name = ?;
然后再把tjh放进去,外面加上单引号

3.Mybatis在处理 的时候就是把 {}的时候就是把 的时候就是把{}替换成变量的值,调用Statement来赋值

如:select * from user where name = #{userName};设userName=tjh
看日志可以发现就是直接把值拼接上去了
select * from user where name = tjh;
这极有可能发生sql注入;

4.#{}的变量替换是在DBMS中、变量替换后,#{}对应的变量自动加上单引号
5.${}的变量替换实在DBMS外、变量替换后, ${}对应的变量不会加上单引号
6.使用#{}可以有效的防止sql注入,提高系统的安全性

下面举一个简单的sql注入问题:
设数据库的user表中用户的userName为:tjh, password为:123,
用户登录时,当我们用${}进行查询时:

select count(*) from user where userName = ${} and password = ${}

这显示可以进行正常的登录,但是当有人不知道账号的密码,恶意登录时,可以这样做:

在这里插入图片描述
这时,实际执行的sql语句是:

select count(*) from user where userName = 'tjh' and password = 1 or 1 = 1

依然可以登录成功,这就是sql注入最简单的例子,但是当使用#{}时,会自动将输入的入参加上单引号,就不会发生上面的情况。
参考自:https://blog.csdn.net/m0_53611007/article/details/120955414

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大格橘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值