Mybatis排序無效問題解決
阿新 • • 發佈:2019-01-10
問題:
Mybatis在對映XML檔案中配置了排序項,但排序結果總是沒有變化。
分析:
經過查閱網上資料,才發現原來是變數定義轉義問題
(1)對於形如#{variable} 的變數,Mybatis會將其視為字串值,在變數替換成功後,預設地給變數值加上引號。例如:
order by #{variable1}
假設variable1傳入值為“name”,則最終SQL語句等同為:
order by “name”
而這個結果在日誌裡是發現不了的,該句子語法檢查亦能通過,可以執行。
(2)對於形如${variable}的變數,Mybatis會將其視作直接變數,即在變數替換成功後,不會再給其加上引號。例如:
order by ${variable1}
假設variable1傳入值為“name”,則最終SQL語句等同為:
order by name
為想要的正確結果。
解決:
所以,對於order by變數的傳入,應使用{}形式,否則,在使用ORACLE資料庫時:
(1)ORDER by #{sortField} #{sortOrder}
會出現“ORA-01745: 無效的主機/繫結變數名“
(2)ORDER by ${sortField} #{sortOrder}
”ORA-00907: 缺失右括號“異常。
(3)ORDER by {sortOrder}
結果正確。
參考:
mybatis中order by排序無效問題
將傳入的資料都當成一個字串,會對自動傳入的資料加一個雙引號。如:order by #{user_id},如果傳入的值是111,那麼解析成sql時的值為order by “111”, 如果傳入的值是id,則解析成的sql為order by “id”。
{user_id},如果傳入的值是111,那麼解析成sql時的值為order by 111, 如果傳入的值是id,則解析成的sql為order by id。
方式能夠很大程度防止sql注入。
方式一般用於傳入資料庫物件,例如傳入表名。
一般能用#的就別用$。
ps: 在使用mybatis中還遇到