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

Posted justin-lin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis中引用变量符号$与#的区别解析相关的知识,希望对你有一定的参考价值。

例子

假设我们要通过创建时间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中引用变量符号$与#的区别解析的主要内容,如果未能解决你的问题,请参考以下文章

mybatis.xml文件中#与$符号的区别以及数学符号的处理

mybatis.xml文件中#与$符号的区别以及数学符号的处理

MyBatis中井号与美元符号的区别

Mybatis中#和$的区别

MyBatis 中#和$符号的区别

mybatis中如何写模糊查询