Mybatis排序無效問題解決方法
阿新 • • 發佈:2019-01-03
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 之後要使用$而非#。
分析:
經過查閱網上資料,才發現原來是變數定義轉義問題
(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 之後要使用$而非#。