MyBatis mapper文件中的变量引用方式#{}与${}的差别

使用#{}传入参数,sql语句解析时会加上“,当成字符串去解析
例如:select * from student where id=#{id}
相当于 select * from student where id="1001"

使用${}传入参数,sql解析时什么都不会加,直接生成sql语句
例如:select * from student where id=${id}
相当于 select * from student where id=1001

使用#{}可以防止sql注入也就是语句的拼接。
${}使用在order by排序语句中 通常这些使用$的字符串是基本上不会变的。
能用#就尽量不要用${}原因是:

会引起sql注入,${}会直接参与sql编译,影响sql语句的预编译。。
我总结的两者的根本区别就是一个带引号一个不带引号。。

例子:

select * from student where name=#{name}
select * from student where name=${name}

两者编译完后都会变成:select * from student where name="zs"

但是两者在预编译处理时的步骤是不一样的

使用#{}在预编译处理时是把参数部分用一个占位符?来代替变成:

select * from student where name=?

而使用${}则是简单的字符串的替换,在动态解析的阶段会被解析成:

selecct * from student where name="zs"

{}的参数替换是发生在DBMS中,而${}则是发生在动态解析时。

如果表明变为user;delete user;

那么 select * from ${tableName} where name=#{name}

就会变成 select * from user; delete user 两个操作 先查询表 然后删除表,这样就会对数据库造成损伤,所以能用#{}就尽量用#{}。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值