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 >    

编译后会加上 “ ”:

扫描二维码关注公众号,回复: 12719900 查看本文章
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 结构不同下理解 #{ } ${}。

猜你喜欢

转载自blog.csdn.net/weng74/article/details/107610570