博为峰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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值