mybatis使用order by #{}失效问题
解决方法:使用${}
注意这里主要是要区分mybatis的#{}和${}的区别,以及要防止order by{}注入问题
问题复现
查询一个分页需要根据create_time(创建时间)或update_time(修改时间)来进行升序或降序排列
入参传了以下两个字段
orderType (时间)
orderBy (升序/降序)
0----create_time
1----update_time
0----desc
1----asc
测试发现根本没有按时间升降序排列
<choose>
<when test="orderType != null and orderType != '' and orderBy != null and orderBy != ''">
order by #{orderType} #{orderBy}
</when>
<otherwise>order by create_time desc</otherwise>
</choose>
<--也未生效--!>
order by #{orderType} #{orderBy}
将#{}改为${}后生效,如下
<choose>
<when test="orderType != null and orderType != '' and orderBy != null and orderBy != ''">
order by ${orderType} ${orderBy}
</when>
<otherwise>order by create_time desc</otherwise>
</choose>
order by ${orderType} ${orderBy}
原因分析:
#{}是经过预编译的,是安全的
${}是未经过预编译的,只是取变量的值,是不安全的,存在sql注入
mybatis中order by / group by / like 某个字段的时候,要用${},不能用#{}
#{}将变量的值转化为字符串,即加上’ '。例:#{time}------>‘time’
${}是直接输出变量的值。例:${time}----->time
使用${}一定要手动处理一下输入的内容,判断一下输入的参数是否正常。防止潜在的SQL注入攻击
评论