1. 程式人生 > >Mybatis排序無效問題解決方法

Mybatis排序無效問題解決方法

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變數的傳入,應使用${}形式,同理,排序順序ASC/DESC的變數傳入,也應使用${}形式,否則,在使用Oracle資料庫時:


(1)ORDER by #{sortField}  #{sortOrder}


會出現“ORA-01745: 無效的主機/繫結變數名“


(2)ORDER by ${sortField}  #{sortOrder}
”ORA-00907: 缺失右括號“異常。


(3)ORDER by ${sortField}  ${sortOrder}
結果正確。
參考:
mybatis中order by排序無效問題


#將傳入的資料都當成一個字串,會對自動傳入的資料加一個雙引號。如:order by #{user_id},如果傳入的值是111,那麼解析成sql時的值為order by "111", 如果傳入的值是id,則解析成的sql為order by "id"。
$將傳入的資料直接顯示生成在sql中。如:order by ${user_id},如果傳入的值是111,那麼解析成sql時的值為order by 111, 如果傳入的值是id,則解析成的sql為order by id。
#方式能夠很大程度防止sql注入。
$方式無法防止Sql注入。
$方式一般用於傳入資料庫物件,例如傳入表名。
一般能用#的就別用$。
ps: 在使用mybatis中還遇到<![CDATA[]]>的用法,在該符號內的語句,將不會被當成字串來處理,而是直接當成sql語句,比如要執行一個儲存過程。


所以order by 之後要使用$而非#。