码迷,mamicode.com
首页 > 其他好文 > 详细

mybatis #{} 与 ${} 的区别

时间:2018-06-02 22:50:57      阅读:652      评论:0      收藏:0      [点我收藏+]

标签:statement   问题   有一个   示例   获取值   的区别   span   注意   获取   

在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 #{} 与 ${} 的区别

标签:statement   问题   有一个   示例   获取值   的区别   span   注意   获取   

原文地址:https://www.cnblogs.com/wanghang-learning/p/9127303.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!