mybatis动态排序不生效

  • Post author:
  • Post category:其他




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注入的风险,对参数做好校验处理

  1. 备注:preparedstatement具体实现原理见:com.mysql.jdbc.PreparedStatement中的setString方法源码

    ↩︎



版权声明:本文为DaiH09原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。