mybatis #{} 与 ${} 的区别
Posted 随性如风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis #{} 与 ${} 的区别相关的知识,希望对你有一定的参考价值。
在mybatis中写sql的时候经常会用到#{},也可能用到${},它们都是用来获取接口方法参数的值的。接下来用示例展示两者的异同。
一、${}
${}用于SQL的拼接,比如在模糊查询的时候会用到如下sql:(注意:${value} ,大括号中只能填value.)
执行,查看日志:(输入的参数是一个String "o")
执行时的SQL语句实际上和上面是一样的。
由此可见,${}实现的是sql的拼接,直接将获取的值与两边的字符串进行拼接,组成该sql语句。但是,sql拼接的方式不安全,会引起SQL注入的问题,所以下面会用#{}来解决。
二、#{}
如果接口方法入参只有一个,那么在sql中#{任意名称}就可以获取到入参的值。如果是两个参数,则可以#{0}获取第一个参数值,#{1}获取第二个参数值。但是如果在参数前面用了@Param注解,则只能用注解中的名称来获取值,例如@param("username") String name , 那么在获取入参name的值时,只能用#{username}。
那么#{}中的值是怎么组合到sql中的呢。给出一个sql语句:
执行,查看日志:
可见#{}是一个占位符,原理类似preparedStatement.
如果是模糊查询就应该这样写:
执行,查看日志:
执行时的SQL是: select id,username from mmall_user where username like "%" \'o\' "%"; (o为参数)
对比用${}的SQL: select id,username from mmall_user where username like "%o%";
这样完成了模糊查询,还防止SQL注入。
总结:#{}是占位符的方式,${}是字符串拼接。两者都可以完成模糊查询,只是形式不一样。但#{}防SQL注入,所以用#{}更安全。
本文个人编写,水平有限,如有错误,恳请指出,欢迎讨论分享。
以上是关于mybatis #{} 与 ${} 的区别的主要内容,如果未能解决你的问题,请参考以下文章