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。

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

时间: 2024-07-29 17:25:25

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

mybatis中的变量#与$

ibatis中使用select top #num# * from tableName出现错误.由于初次用ibatis还不知道在它里边拼写SQL语句的一些规则,导致一些自认为很平常的SQL语句,在它这里翻了船. select top #number#这种写法是不正确的,原因待查.正确的书写方式是 select top $number$ . 下面这段话是在网络里找到的它也没给出具体的解释,只是说这是什么SQL的动态写法,不明所以. 在iBATIS中,对于top参数,只能用动态SQL方式.如<sele

MyBatis中关于resultType和resultMap的区别

MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的(对应着我们的model对象中的实体),而resultMap则是对外部ResultMap的引用(提前定义了db和model之间的隐射key-->value关系),但是resultType跟resultMap不能同时存在. 在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值.

[转载]C++中 引用&amp;与取地址&amp;的区别

一个是用来传值的 一个是用来获取首地址的 &(引用)==>出现在变量声明语句中位于变量左边时,表示声明的是引用.     例如: int &rf; // 声明一个int型的引用rf.&(取地址运算符)==>在给变量赋初值时出现在等号右边或在执行语句中作为一元运算符出现时                  表示取对象的地址. 在C++中,既有引用又有取地址,好多人对引用和取地址不是很清楚,因此也无法区分.其实他们的区别可以用一句话概括:和类型在一起的是引用,和变量在一起的

PHP字符串中引用变量问题

php中字符串引用变量主要是数据库操作字符串的不同 1,普通字符串引用变量 a.外层必须引用双引号 b.字符串中的变量可写如:$s 或者{$s} 2.数据库操作字符串(数据库操作指令) a.字符串外层必须使用双引号 b.变量必须用大括号{}(赋值字符串属性时除外) 如: `    c.当需变量与数据库属性相赋值或者作逻辑运算时,需要对应数据属性的类型:如     上述代码中数据库中的属性 title,authordid,content均为字符串,所以变量要用单引号'{$title}'或者'$ti

PHP接口中的静态变量、常量与类中静态变量、常量的区别

接口: 1 不能够定义静态变量(常量除外) 2 定义的常量 const YOUCONST = VALUE,不能在子类中覆盖,在子类中以 interfaceName::YOUCONST的方式调用 3 不能使用parent::YOUCONST的方式调用接口的常量 类: 1 const 变量可以使用parent::YOUCONST的方式,className::YOUCONST的方式在子类中访问 2 const定义的变量,在子类中可以被覆盖 3 当然在类中可以定义静态成员变量了 示例: <?phpint

Java中成员变量和局部变量的区别

java面向对象过程中,最基本的两类变量就是成员变量和局部变量 成员变量是写在类中并且写在方法外部,一般写在每个类的头部,用于初始化或者方法操作,作用域是整个类被实例化到被销毁,中间变量都可以被外部方法(权限为public时)或者内部方法所共享使用,并且可以保持变量的值,就是多个方法可以复用该变量,成员变量一般要加权限修饰符,并且定义成员变量的时候系统会给初始值0 而局部变量作用域只在方法内部,当方法调用完毕,该变量也自动消失,并且只有方法本身可以使用,其他方法或类都不能使用该变量,也就是方法本

C#中成员变量和局部变量的区别

成员变量: 定义:在类中定义的变量称为成员变量 作用范围:在整个类中都有效 分类:成员变量又可分为实例变量和静态变量(加上关键字static) class test1 { int a = 33; //实例变量,在类test1中有效 static int b = 45: //静态变量,在整个程序中都有效,其他类中可以调用 } 局部变量: 定义:在方法中定义的变量称为局部变量 作用范围:当前定义的方法内有效,方法调用被销毁,不能在其他类中进行调用 原文地址:https://www.cnblogs.c

Mybatis中collection和association的使用区别

1. 关联-association2. 集合-collection 比如同时有User.java和Card.java两个类 User.java如下: public class User{ private Card card_one; private List<Card> card_many; } 在映射card_one属性时用association标签, 映射card_many时用collection标签. 所以association是用于一对一和多对一,而collection是用于一对多的关

【Shell】在字符串中引用变量

注意:注意办出的字符串要使用双引号括起来 localhost:~ xxxx$ a='abc' localhost:~ xxxx$ echo $a abc localhost:~ xxxx$ b='bbbb$a' #使用单引号 括起字符串,会原样输出变量名 localhost:~ xxxx$ echo $b bbbb$a l localhost:~ xxxx$ b="bbbb$a" #使用双引号 括起字符串,手会引用变量值 localhost:~ xxxx$ echo $b bbbbab