mybatis中的#{}用于传递查询的参数,用于从dao层传递一个string参数过来(也可以是其他参数),select * from 表名 order by age=#{age}
mybatis会把这个参数转换成一个字符串。select * from 表名 order by age=“age” 相当于jdbc中的预编译,安全。
而${}一般用于order by的后面,mybatis不会对这个参数进行任何的处理,直接生成了sql语句。例:传入一个年龄age的参数,select * from 表名 order by ${age}
mybatis生成的语句为 select * from 表名 order by age mybatis不会对$传递的参数做任何处理,相当于jdbc中的另外一种编译方式。
mybatis中#和$的区别举例说明
1 select * from user where name = “dato”;
2 select * from user where name = #{name};
3select * from user where name = ${name};
一般情况下,我们都不会注意到这里面有什么不一样的地方。因为这些sql都可以达到我们的目的,去查询名字叫dato的用户。
区别
动态 sql 是 mybatis 的强大特性之一,也是它优于其他 orm 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 boundsql 对象,也是在此处对动态 sql 进行处理的。在动态 sql 解析阶段, #{ } 和 ${ } 会有不同的表现
select * from user where name = #{name};
#{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:
select * from user where name = ?;
那么我们使用 ${}的时候
select * from user where name = ${name};
${}在动态解析的时候,会将我们传入的参数当做string字符串填充到我们的语句中,就会变成下面的语句
select * from user where name = “dato”;
预编译之前的 sql 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了。
综上所得, ${ } 变量的替换阶段是在动态 sql 解析阶段,而 #{ }变量的替换是在 dbms 中。
这是 #{} 和 ${} 我们能看到的主要的区别,除此之外,还有以下区别:
#方式能够很大程度防止sql注入。
$方式无法防止sql注入。
$方式一般用于传入数据库对象,例如传入表名。
一般能用#的就别用$.
所以我们在使用mybatis的时候,尽量的使用#方式,这是大家要注意的地方
对于mybatis中#和$绑定参数的区别总结
#{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{id},如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”。
${}将传入的数据直接显示生成在sql中。如:order by
${id},如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id,则解析成的sql为order
by id。
ps:在使用mybatis中还遇到的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句,比如要执行一个存储过程。
小米光伏电池背后的核心——MWT电池
台拟斥资10亿新台币补助家用LED灯
EV12AD550数字转换器的相关应用以及特点分析
使用MEMS与石英谐振器有什么应用优势
华为麒麟980处理器将于IFA发布 三星Galaxy S10旗舰三摄像头组合与华为不同
mybatis中#和$的区别
360宣布将于7月8日发布360儿童手表P1
工业过程控制中常用的传感器有哪些
投影机四大吊装方式及优缺点分析
迈入10Gbps时代!我国星地激光高速通信应用实验取得成功
如何将机械设计工作流程集成到电气设计工具中?
用控制器通用板改装滚筒洗衣机
对射光电开关工作原理
NTT以Tier 1全球网络为基础 助企业加速物联网布局
台积电在芯片制程工艺方面走在行业的前列
PLC如何应用于建筑的3D打印?
苹果或在本月最后一天发布新品 包含iPhone SE2
智能物联、物信融合,迎接AI智能化新时代
将600V输入的隔离反激式控制器的电源电压扩展至800V
电机保护控制器的特点和主要功能