Mybatis中#{}和${}的区别

在开发时使用到mybatis框架,会看到xml文件中有#{},也有${},那么它们之间有什么区别呢?本文就来详细的介绍一下它们之间的区别。

通俗的讲,#{} 相当于对数据加上双引号,${} 相当于直接显示数据。

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值,相当于字符串拼接

例如传入字符串var="id"

  • #{}将传入的数据都当成一个字符串,会对自动传入的数据加引号:
select #{var} from user;

会被解析成:

select 'id' from user;

然后放到数据库去查询,它的查询结果为:

在这里插入图片描述

  • ${}将传入的数据都当成一个字符串,会对自动传入的数据加引号。
select ${var} from user;

会被解析成:

select id from user;

然后放到数据库去查询,它的查询结果为:
在这里插入图片描述

因此

#{} 方式适合用于传入查询条件
${} 方式一般用于传入数据库对象,例如传入表名、列名。一般在项目中我们要根据不同的业务场景可能需要去查询不同的列,或是不同的表,就可以用${}。

重点:#{}方式能够很大程度防止sql注入,${}方式无法防止Sql注入。

比如我要查询用户名为qqq的密码,通过上面的解析我们知道,使用#{}的话需这样传值userName = “qqq”;如果使用${}的话需要这么传 userName = “'qqq'”。因为如果你使用${}时userName = "qqq"的解析出来是qqq。放到数据库查询是会报错的,如下:
在这里插入图片描述

然后使用userName = "'qqq'"解析出来是'qqq',查询如下:
在这里插入图片描述
这是正常的。

SQL注入的重点来了,本来我们查询条件限制了只查用户qqq的密码,但是这个时候如果别有用心的人把把查询条件userName的值输入为"'qqq' or 1=1",这个时候的sql如下:

在这里插入图片描述
这个时候是不是所有用户的密码都查出来了。因此${}是会有sql注入的风险的,很少会用到它。

如果使用#{}的话,sql会是这样的:
在这里插入图片描述
可以有效防止sql注入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿诚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值