mybatis动态排序不生效
sql如下:
select * from table_name order by #{field}
造成问题原因:
mybatis动态参数
#{}方式传参数会使用preparedstatement预编译处理方式,参数是以?占位符的方式传递。可以看到mybaits的sql日志如下:
==> Preparing: SELECT * FROM table_name ORDER BY ?
==> Parameters: time(String)
preparedstatement预编译方式的参数替换的原理1可知预编译方式会对参数加上’'引号,生成的最终sql如下:
SELECT * FROM table_name ORDER BY 'time'
以上sql数据库不能正常解析 order by 后面的字段,这就是我们排序失效的原因
解决办法
将#{}参数方式改成${}参数方式即可。
原因: ${}参数的方式是简单的字符串替换。
在动态解析阶段,该 sql 语句会被解析成:
select * from table_name order by time
总结
- #{}方式传参数只能处理值参数 不能传递表名,字段等参数
- ${}字符串替换,可以动态处理表名,字段参数,但是使用这种方式必须注意sql注入的风险,对参数做好校验处理
备注:preparedstatement具体实现原理见:com.mysql.jdbc.PreparedStatement中的setString方法源码 ↩︎