博为峰JavaEE技术文章 ——MyBatis Mapper $与#的区别

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’

以上语句将会执行错误,因为表名不能加引号。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容