MyBatis中#{}和${}的区别

MyBatis中#{}和${}的区别

  1. #{} 是预编译处理,是占位符,${} 是字符串替换、是拼接符;
  2. MyBatis 在处理 #{} 时,会将 sql 中的 #{} 替换为 ?,调用 PreparedStatement 来赋值;
  3. MyBatis 在处理 ${} 时,是把 ${} 替换成变量的值,调用 Statement 来赋值;
  4. 使用 #{} 可以有效地防止 SQL 注入,提高系统安全性。

示例:

name = zhangsan;
password = 1or 1=1;

#{}
SELECT * FROM user WHERE name = #{name} and password = #{password};
将转为:
SELECT * FROM user WHERE name = 'zhangsan' AND password = '1 or 1=1';

${}
SELECT * FROM user WHERE name = ${name} AND password = ${password};
将转为:
SELECT * FROM user WHERE name = zhangsan AND password = 1 or 1=1;

注意:

  1. 像 order by 后使用 ${},如果使用 #{} 会导致转换的时候多了一对单引号,从而排序失败。
  2. like 则需要根据表达式的书写进行选择。
  3. in 后如果使用 ${} ,可以直接操作;如果是 #{} ,需要循环遍历来进行操作。
例:name like"%"#{name}"%"  
Preparing: select * from bbs_brand WHERE namelike"%"?"%"and falg=? limit 0 , 10
Parameters:(String), 1(Integer)
使用了占位符来占位,写成SQL就是: name like "%"'莲'"%"没有问题
例:name like '%${name}%'
Preparing:select count(0) from (select * from bbs_brand WHERE name like'%莲%' and falg=?) as total
Parameters: 1(Integer)
使用$进行字符串的拼接,直接把传入的值,拼接上去了,没有任何问题
例:name like concat(concat('%',#{username}),'%')
Preparing: select count(0) from (select *from bbs_brand WHERE name like concat(concat('%',?),'%') and falg=?) as total
Parameters:(String), 1(Integer)
使用了cancat进行字符串的连接,同时使用了#进行占位
例:name like CONCAT('%','${name}','%')
Preparing: select count(0) from (select *from bbs_brand WHERE name like CONCAT('%','莲','%') and falg=?) as total
Parameters: 1(Integer)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值