关于Mybatis查询和数据库中查询结果集不一致的情况

引言:

        这是我在做一个项目,查询结果需要保证数据的顺序性,用到order by。

问题:

        这里是使用mybatis查询打的sql日志,可以看一下,没啥问题

SQL: 
select * from file_info WHERE user_id = ? and folder_type = ? and file_id in (?,? ) order by ?
Params: 
829030398086232(String),
1(Integer), 
uT07u2iDalME92R(String), LlUg5oCk4YhWtot(String), 
field(file_id,"uT07u2iDalME92R","LlUg5oCk4YhWtot") (String) 

        下面这里是我将数据添加进去,通过数据库查询。

select * from file_info 
WHERE 
user_id = '829030398086232' 
and folder_type = 1 
and file_id in ('uT07u2iDalME92R','LlUg5oCk4YhWtot') 
order by field(file_id,'uT07u2iDalME92R','LlUg5oCk4YhWtot')

上面的两个SQL完全没问题,我需要的结果集是:

        'uT07u2iDalME92R'   的数据在第0个

        'LlUg5oCk4YhWtot'  的数据在第1个

实际上的结果:

 

解决:

        由于对mybatis的原理不够熟悉,没有深入源码,这个问题的出现在于 #{}  和 ${} 这两占位符的区别,前者为防止sql注入等攻击,会对数据进行特殊处理,相对安全,后者则没有特殊处理,直接进行字符串拼接,会有SQL注入等问题。所以一般都直接选择使用 #{} 这种方式,忽略了${},实际上在order by中,是不会有sql风险的,但是#{}会有特殊处理,这个得深入源码得知。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值