MyBatis #{}为什么防注入?#{}与${}区别

#{}与${}的区别

  • #{}一定不能写在引号里面,${}一定要写在引号里面

  • 如果是pojo、map类型的参数,无论是#{}还是${}里面都是些属性名

  • 如果是简单类型的参数,#{}里面可以写任意字符串,但是${}里面只能写value(以前的版本)

  • #{}  能防止sql 注入,${}  不能防止sql 注入

实验

准备数据库

 Mapper.xml

    <select id="findAll" resultType="cn.appmy.pojo.User" parameterType="String">
        select * from tb_user where mobile=#{value}
    </select>

传参查询

List<User> userList = userDao.findAll("51515");
for (User user : userList) {
    System.out.println(user);
}

打印结果

传参查询

List<User> userList = userDao.findAll("51515' and password='0");
for (User user : userList) {
    System.out.println(user);
}

当使用#{}进行SQL注入查询时,MyBatis无法有效查询打印数据

这时保持Java语句不变,改变mapper.xml

    <select id="findAll" resultType="cn.appmy.day0220.pojo.User" parameterType="String">
        select * from tb_user where mobile= '${value}'
    </select>

打印结果

 总结:#{}不是简单的拼接SQL语句,#{}可以有效的防止SQL注入;而${}不能防止SQL注入。

#{}为什么防注入?

  • 使用#{}引入参数,其实是先使用“?”占位符,然后再设置参数。 #{} 不会改变原本的SQL规则,不管占位符里面的什么字符都不影响SQL原本的查询结构。占位符 “?” 处会被完整替换,因此可以防止SQL注入。
  • 而使用${}引入参数的话,是直接拼接SQL语句。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_慎

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

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

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

打赏作者

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

抵扣说明:

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

余额充值