Mybatis在配置Mapper.xml文件时,一定会使用到动态SQL查询,也就是要传递动态参数。在Mybatis中有两种表示动态参数的方式,一种是“$”,另一种是“#”,那么这两者有什么不同之处呢?今天小博老师就给大家介绍一下两者的区别。
比如,如下一个SQL语句:
Select * from company where name =”boweifeng”
写成动态参数的方式可以写成:
1.Select * from company where name = #{name}
也可以写成:
2.Select * from company where name = ${name}
两者的区别在于,如果传递的参数是“boweifeng”,第一种写法,会被动态解析为预编译语句:
Select * from company where name = ?
一个#{ }被解析为一个参数占位符? 。参数将会在DBMS中进行写入。从效率上讲,第一种写法执行效率较高,因为相同的预编译语句可以被数据库进行缓存,重复利用。同时预编译语句还可以防止SQL注入。
如果是第二种写法,上述的SQL语句则会被解析为如下:
Select * from company where name =“boweifeng”
我们发现预编译之前的SQL 语句已经不再包含变量了,完全是常量数据。综上所述,${}变量在动态SQL 解析阶段进行替换,而 #{ }变量的替换是在 DBMS 执行时进行。
注意:
表名作为变量时,必须使用${ }。
因为,表名是字符串,使用sql 占位符替换字符串时会带上单引号 '',导致 sql 语法错误,例如:
select * from #{tableName}
预编译之后的sql 变为:
select * from?
如果传入的参数是company,则在占位符进行变量替换后,语句变成如下:
select * from‘company’
以上语句将会执行错误,因为表名不能加引号。