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文件中#与$符号的区别以及数学符号的处理