MyBatis #{} 和 ${} 的分别使用 和区别

MyBatis #{} 和 ${} 的分别使用 和区别

最近复习 MyBatis 对 #{} 和 ${} 进行了对比。

我直接给结论 #{} 适合 在表结构 确定的情况下使用 。

${} 适合 在表结构不确定的情况下使用。

以下是我的一下解释:

${} 是参数占位符 会在编写好sql 后 不进行预编译 直接将参数直接拼接,静态文本替换

<select  resultType="User">
   select * from user  where username=${username} 
</select>    

编译完以后是直接

select * form where username='翁艳敏'

而 #{} 是变量占位符 会在编写好sql 后提前进行预编译 然后将参数? 替换成我们写好的数据

<select  resultType="User">
    select * from user  where username=#{username} 
</select>    

这种情况下使用方式编译后的 sql #{}和${} 没有区别.

但我们在实际使用中刚刚的情况建议不要写 ${} 因为他使用的是直接拼接参数 容易造成sql 注入(表示没有遇见过),这么一说那么 那都使用 #{} 就完了吗,但存在即是合理, #{} 也是有存在的缺点,比如我我们的业务中sql 的结构不确定 (1,表格不确定 2,条件不确定 3,排序不确定 …) 使用#{} 就会存在问题 。

表格不确定的情况

<select  resultType="User">
	select * from #{tableName} 
</select >    

编译后会加上 “ ”:

select * from "user"

这个时候#{}的提前预编译 就不行了,就会mysql 语法就会报错 但是使用 ${} 就不会,因为是直接拼接。

<select  resultType="User">
	select * from ${tableName} 
</select > 
select *from user

以上这种情况是少数,还有一种场景是我们会遇到的就是 排序不确定的情况下:

<select  resultType="User">
	select * from user  order by #{order} #{method}
</select >  

就会编译失败得不到数据,但使用${} 就不会。

<select  resultType="User">
	select * from user  order by ${order}
</select >  

希望可以从sql 结构不同下理解 #{ } ${}。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值