关于实现mybatis order by 排序传递参数实现 问题记录

一    问题场景:本人项目纯纯的后端系统  并且项目前端采用纯纯的原生js 实现

1)表格  通过查询列表数据放入到域中  前段采用 for循环的方式实现遍历生成列表

2)分页实现本人是公司内部自定义实现的分页没有采用任何外部框架  分页实现是公司内部自定义封装的

要求:要点击列表表头字段实现按照表头信息排序

解决思路:

由于我的列表是由多个表中数据关联查询出来的所以要实现根据不同的列头实现排序   那么久要将查询结果在包装成一个表  在通过select * from 结果表  order by 排序字段  方式实现

涉及问题:传递排序列 头  对应的表字段  同时传递 排序方式  是asc 还是desc 两个参数

二  解决

1)有问题了???  mybatis 传参  大家都会  常采用的方式   #{} 方式接收参数占位  这样可以防止sql注入  #{}实现预编译

我同样在mybatis mapper.xml 文件中通过   select * from 表  order by #{字段} #{排序方式}

查看打印日志:完全正确  并且将日志信息拷贝出来到数据库执行打印sql  没有问题

然而。。。。。在通过断点却发现一直查询结果并没有实现排序??????????????

问题:mybatis #{} 在接收参数的时候会给接收的参数  添加双引号   那么上面的sql 实现就是

select * from table_name order by  "fullName"   "desc"

这种形式的日志是无法发现的  同时在编译过程以及运行都没有报错但是   将"fullName"  以及 “desc”  解析时候“fullName” 并没有当表中字段解析 “desc” 也认为是一个字符串  没有识别说是数据库关键字  导致查询没有异常 但是不能正确返回查询结果

2)解决方案

将#{} 替换成${}

select * from table_name order by ${}${}    但是${} 无法防止sql注入

上一篇:帝国CMS系统标签e:loop调用的附加SQL条件和排序参数


下一篇:玩得一手好注入之order by排序篇