Mybatis的 #{}与${}区别

在mybatis查询时,参数传递方式可以是#{}或者是$ {}。
两者的区别是:
一, #{}传参时会将传入参数当成是一个字符串,为这个字符串加上引号。而$ {}则不会加引号 例:

select * from user where name = #{name}  //如果传的name是"小明"
对应的sql执行的语句就是
select * from user where name = "小明"

select * from user where name = ${name}
对应执行
select * from user where name = 小明 //这中查询条件对应的值就一般都会用#,不加”“的话sql无法执行
${}一般用来传表名、字段名等数据库对象,如:order by ${}

二 , #{}能够很大程度防止sql注入,而${}无法防止sql注入,所以能用#{}的时候就尽量使用#{}。
为什么说#{}能防止sql注入:
#{}在mybatis中的底层是运用了PreparedStatement 预编译,传入的参数会以 ? 形式显示,因为sql的输入只有在sql编译的时候起作用,当sql预编译完后,传入的参数就仅仅是参数,不会参与sql语句的生成,而 $ {}则没有使用预编译,传入的参数直接和sql进行拼接,由此会产生sql注入的漏洞。
$ {}没有预编译会造成sql注入的例子:

select * from user where name =  ${name} 

对于这样的sql语句,如果传参是 ** name = ‘sam or 1=1’ **
那么使用 ${}对应生成的sql就是:

select * from user where name = sam or 1=1

这样就会将全部数据查出来无法起到该有的作用,会带来较大问题。

发布了54 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/liutaiyi8/article/details/104781246
今日推荐