MyBatis中#{}和${}的不同和${}的妙用

31 篇文章 0 订阅
19 篇文章 0 订阅

突然意识到sql语句的独特语义要和代码分离,我们就不能够在代码中写sql语句!!比如我要用${}在MyBatis的sql中拼接排序类型的时候,我就不能够在Java代码中直接写参数字符串为Order By哪儿个类型

#{}和${}的基本不同我就不想说了,这里要说的是进一步对占位符和字符拼接的字面语义的领悟!!

#{}和${}基本不同在这篇文章的最后有提到过

占位符:占位符就是在某个地方占领一个位置,把它单独作为某个东西,比如这里就是把它作为 值。 
字符拼接:字符拼接就是简单的对字符串拼接。没有特殊的其它含义。

问题出现:

不知道大家有没有想过一个问题

SELECT * FROM #{tableName} //有没有想过??

上面我们已经说过了占位符的意义就是作为值的存在,所以如果作为值的话,那么发送的sql语句就是这样的:

SELECT * FROM  ?

大家都知道MyBatis中这种sql语句是要经过预编译的,虽然MyBatis并没有真正的用上数据库的预编译功能(因为数据库的预编译默认是关闭的。。。而且MyBatis底层也是使用PreparedStatement和Statement这两个对象,大家可以参考我的一篇博客Presatement和Statement深入理解+MySQL的预编译)。

大家都知道,带问号的sql语句是要传递参数的,好!!假如!!我们传入了参数user,那么查询语句就是这样的:

SELECT * FROM  'user'
  • 请问,这种sql语句能够执行成功吗??试试就知道了!!

这里写图片描述

很明显语法错误!!

那么有什么办法能够解决呢??

没错!!!${}能够解决这个问题,${}的功能是直接进行字符串拼接。这也是为什么${}不能够防止一般的sql注入攻击。因为它是拼接啊!!

这样写就行了:

SELECT * FROM ${tableName} //如果传入基本类型如字符串时就要把tableName改为value才能够成功取值。
  • 这里写图片描述

普通sql注入过程:

SELECT * FROM user WHERE username like '' OR 'XX'='XX' OR ''

当用户输入:

' OR 'XX'='XX' OR '

这样就出现问题了。。。

这里写图片描述

最后总结下:

 
  1. 一般 ${}用在我们能够确定值的地方,也就是我们程序员自己赋值的地方。
  2. #{}一般用在用户输入值的地方!!
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Alex_81D

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

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

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

打赏作者

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

抵扣说明:

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

余额充值