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 #{} 与 ${} 的区别的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate与Mybatis的区别

面试 Ibatis与mybatis区别

mybatis与hibernate的区别

mybatis 中 $ 与 # 的区别

mybatis与hibernate的相同点与区别

Mybatis:#与$区别