引言:
这是我在做一个项目,查询结果需要保证数据的顺序性,用到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风险的,但是#{}会有特殊处理,这个得深入源码得知。