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”。

sqlorderby{user_id},如果傳入的值是111,那麼解析成sql時的值為order by 111, 如果傳入的值是id,則解析成的sql為order by id。

方式能夠很大程度防止sql注入。

Sql方式一般用於傳入資料庫物件,例如傳入表名。
一般能用#的就別用$。
ps: 在使用mybatis中還遇到