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 结构不同下理解 #{ } ${}。