一 問題場景:本人項目純純的后端系統 並且項目前端采用純純的原生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注入