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

MyBatis中引用变量符号$与#的区别解析

时间:2019-01-28 23:49:57      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:png   引号   param   XML   strong   create   类型   key   分享图片   

例子

假设我们要通过创建时间create_time查询数据库表product里的具体条目

如果要查询创建时间大于等于“2019-01-29”的条目,那么SQL查询语句应是:

技术分享图片

 

select * from product where create_time >=“2019-01-29”,这时候返回了正确的数据

技术分享图片

 

用mybatis框架查询对应写法如下:

@Select({
            "SELECT * ",
            "FROM product WHERE #{key} = #{value};"
    })
    Product selectByProductCode(@Param("key")String key, @Param("value")String value);

这边是用MyBatis注解的方法,用XML的也是类似。

这是如果key传的是create_time,value为“2019-01-29”,那么应该也是可以正常返回的,结果确两条数据都返回了。

原因是上面的这条MyBatis转换成SQL如下:

select * from product where ‘create_time‘ >=“2019-01-29”;  

技术分享图片

和我们预想的不一样,将取值符号由#改成$即可返回正确的结果。

@Select({
            "SELECT * ",
            "FROM product WHERE ${key} = #{value};"
    })
    Product selectByProductCode(@Param("key")String key, @Param("value")String value);

解析

$用于取值是一般是取字符串,即直接把传过来的变量不经过处理直接丢到SQL,比如上面的key时或者下面这种情况(模糊匹配查询字符串的时候,这边以前缀匹配为例)
@Select({
            "SELECT * ",
            "FROM product WHERE ${key} like ‘${value}%‘;"
    })
    Product selectByProductCode(@Param("key")String key, @Param("value")String value);
#一般用于取变量,比如value传过来的类型是Long,Integer或者完整匹配的String等。会在变量前后加上单引号再丢到SQL。

 

MyBatis中引用变量符号$与#的区别解析

标签:png   引号   param   XML   strong   create   类型   key   分享图片   

原文地址:https://www.cnblogs.com/justin-lin/p/10332113.html

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