关于实现mybatisorderby排序传递参数实现问题记录
⼀ 问题场景:本⼈项⽬纯纯的后端系统 并且项⽬前端采⽤纯纯的原⽣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注⼊