MyBatis/Ibatis中#和$的区别

本文详细介绍了MyBatis中#与$符号在SQL参数处理上的不同作用及应用场景。#能够有效防止SQL注入,适合大多数场景;而$则适用于传入数据库对象如表名的情况,但存在SQL注入风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MyBatis/Ibatis中#和$的区别

  1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
  2.  $将传入的数据直接显示生成在sql中。如:order by ${user_id},如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.
  3.  #方式能够很大程度防止sql注入
  4. $方式无法防止Sql注入
  5. $方式一般用于传入数据库对象,例如传入表名. 
  6. 一般能用#的就别用$..

 

关于#方式的防sql注入解释:

  使用#会被Mybatis预编译, 用占位符的方式把参数放到sql中执行, 而$符号会直接执行

关于预编译:

数据库执行sql也会先编译下(有点类似于java),编译完后叫执行计划,等执行sql时就运行执行计划而不是sql,

也是说,预编译阶段会把参数外的sql先编译(所以叫预编译),告诉数据库我要执行这条,而不是参数中什么奇怪的语句,

  以上属于个人见解,不足之处请多多指教

关于sql注入: https://www.cnblogs.com/zouqin/p/5314827.html

参考:https://www.cnblogs.com/wuyun-blog/p/4697144.html  (上图参考了这里,将文字转成了图片)

参考:http://blog.youkuaiyun.com/downkang/article/details/12499197/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

米二

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

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

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

打赏作者

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

抵扣说明:

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

余额充值