天天看點

Mybatis 中 order by 排序失敗的解決方法

在 mybatis 的 xml中,為一個SQL語句配置order by 子句時,需要這個排序的字段是前端傳遞過來的,而且排序的順序(升序 OR 降序)也是由前端傳遞過來的。對于這種需求,我起初寫成了下面這樣:

然後,預計它的輸出應該是類似于下面這樣的

但是,真正運作時,你會發現,mybatis将會抛出異常,告訴你參數的個數不比對。

我debug大概看了一下原因,對于上面這個SQL,mybatis會把它編譯成:

然後,有兩個待使用的參數值:

① condition.field  =  "user_name"
② condition.sortRule = "DESC"
           

但是,在替換參數時,由于第一個?是被 ` ` 包住的,而 ` ` 在MYSQL中就是用來包覆字段名的(可以避免 與 SQL 關鍵字沖突等問題),是以,mybatis會把第一個?就當成是字段的名稱,進而不會進行值的替換,隻會用condition.field的值替換第二個?的值,變成:

上面這個轉換後的語句,我們會發現兩個問題:

  1. 第一個?沒有被替換
  2. “user_name”帶了一對“”

為了解決這兩個問題,mybatis提供了另一種綁定參數的方式: ${param}

是以,現在,我們把原始的SQL語句改成如下:

這個時候,我們就可以獲得正确的結果了

這個時候,也許有人會問,這種情況下,為什麼第一個?會被替換掉呢?

對于這個問題,我也沒有仔細調查,可能是mybatis的特殊處理吧。

最後,對于${ }的用法,需要注意以下幾點:

  • $方式無法防止Sql注入,是以,對于使用前端傳過來的值的時候,一定要進行轉義,不要直接使用
  • 一般能用#的就别用$。
  • $方式一般用于傳入資料庫對象,例如傳入表名、排序規則等