1. 程式人生 > >Mybatis 中 order by 排序失敗的解決方法

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

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

ORDER BY `#{condition.field}` #{condition.sortRule}

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

ORDER BY `user_name` DESC

但是,真正執行時,你會發現,mybatis將會丟擲異常,告訴你引數的個數不匹配。
我debug大概看了一下原因,對於上面這個SQL,mybatis會把它編譯成:

ORDER
BY `?` ?

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

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

但是,在替換引數時,由於第一個?是被 ` ` 包住的,而 ` ` 在MYSQL中就是用來括住欄位名的(可以避免 與 SQL 關鍵字衝突等問題),所以,mybatis會把第一個就當成是欄位的名稱,從而不會進行值的替換,只會用condition.field的值替換第二個的值,變成:

ORDER BY `?` "user_name"

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

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

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

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

ORDER BY `${condition.field}` ${condition.sortRule}

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

ORDER BY `user_name` DESC

這個時候,也許有人會問,這種情況下,為什麼第一個會被替換掉呢?
對於這個問題,我也沒有仔細調查,可能是mybatis的特殊處理吧。

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

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

相關推薦

Mybatis order by 排序失敗解決方法

在 mybatis 的 xml中,為一個SQL語句配置order by 子句時,需要這個排序的欄位是前端傳遞過來的,而且排序的順序(升序 OR 降序)也是由前端傳遞過來的。對於這種需求,我起初寫成了下面這樣: ORDER BY `#{condition.f

sqlserverorder by 排序用法

ORDER BY 語句用於根據指定的列對結果集進行排序,ORDER BY 語句預設按照升序對記錄進行排序,如果您希望按照降序對記錄進行排序,可以使用 DESC 關鍵字。 排序可以是升序的 (ASC),也可以是降序的 (DESC)。如果未指定是升序還是降序,就假定為 A

MybatisOrder By排序問題

    曾寫過一篇部落格,是接觸了一段時間的mybatis開發總結的:《Mybatis,懷疑--使用--感悟》。又過去了一段時間,前不久和別人聯調介面,遇到了mybatis的排序問題。這篇部落格就來總

解決SQL Server查詢使用Union或Union All後Order by排序無效的bug(好神奇啊!!)

http://www.ourcodelife.com/article-415-1.html 首先,在程式人生網站上,需要負責任的指出的是在SQL Server查詢中使用Union或Union All後Order by排序無效,我不確認是不是微軟的bug,不過這裡卻是我實際程式設計工作的經驗,但願大家看到

Oracle使用Order By排序時結果順序不穩定的解決辦法

Oracle的分頁查詢是沒有進行任何排序操作的,Oracle是順序的從資料塊中讀取符合條件的資料返回到客戶端。 而Oracle的排序演算法不具有穩定性,也就是說,對於排序鍵值相等的資料,這種演算法完成

xamppapache點擊啟動失敗解決方法

expec 錯誤 his exp 使用 check eth you err 錯誤提示: 9:15:53 AM [Apache] Error: Apache shutdown unexpectedly.9:15:53 AM [Apache] This may be due

阿裏雲ECS在CentOS 6.9使用Nginx提示:nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)的解決方法

命令 led spm 屏蔽 def fault 執行 ddr aliyun 說明: 1、[::]:80這個是IPv6的地址。 2、阿裏雲截至到今天還不支持IPv6。 解決方式: 1、普通解決方式:開啟IPv6的支持,不過這個方法在阿裏雲行不通。 vim /et

解決Oracle分頁使用order by排序造成分頁順序不對的問題

今天在做專案的時候,在使用JPA對訂單進行按時間排序的時候發現查分頁資料的時候有點問題。我先一頁設定一條資料,然後發現第一頁和第二頁的資料居然一樣。下面給出我BaseDao中的JPA分頁方法: @Override public List<T> f

當SQLORDER BY排序欄位值相同時,查詢結果是什麼?

簡書 Wwwwei轉載請註明原創出處,謝謝!前言  資料庫分頁是後臺經常要使用的技術手段,有時候進行資料庫查詢會根據業務需要對某一欄位排序,那麼當待排序欄位值相同時,我們得到的查詢結果會是什麼呢?問題描述  資料分頁時需要根據資料記錄建立時間create_time欄位倒序,即使用order

mysqlorder by 指定排序

原 mysql中order by 可以指定排序 2017年05月19日 17:01:26 qq_36340642 閱讀數:27528 這裡

檢視幹嘛不能用Order by排序

這個問題不高深,甚至有那麼一點多此一舉.既然都用到檢視了,幹嘛還要在檢視中用排序呢?檢視就存了sql語句了,那我們在使用檢視的時候只在檢視後面指定ORDERY BY不就行了. 先來看看語句: SELECT * FROM TESTS ORDER BY AddTime D

mysqlorder by 可以指定排序

mysql表的排序 ORDER BY field1 [ASC [DESC]], [field2…] [ASC [DESC]],… 這裡是想讓它以 num 排序 但是 num=-1的那條資料單獨為最大值 法一:field( field1,val1,val2,…

Mysql5.7版本group by 子查詢order by 無效的問題解決辦法

我們都知道group by 會選擇保留第一條資料,預設是按照id排序的,如果我們想通過別的欄位排序,比如最後建立的那條記錄,可以先按照建立時間降序,再group by即可得到每個分組的最新建立的資料。 例: 通過如下sql查出兩條資料 SELECT * FROM xxx WHERE gr

oracle的order by排序中空字串處理方法

oracle的order by排序中空字串處理方法   2009-09-18 14:02:56|  分類: 資料庫、sql |  標籤: |字號大中小 訂閱 1、預設處理   Oracle在Or

當SQLORDER BY排序欄位值相同時,查詢結果排序

原文地址:https://blog.csdn.net/wwwwei_csdn/article/details/78181197前言  資料庫分頁是後臺經常要使用的技術手段,有時候進行資料庫查詢會根據業務需要對某一欄位排序,那麼當待排序欄位值相同時,我們得到的查詢結果會是什麼呢?問題描述  資料分

若sql語句order by指定了多個欄位,則怎麼排序

舉個例子吧:order by id desc,time desc先是按 id 降序排列 (優先)如果 id 欄位 有些是一樣的話 再按time 降序排列 (前提是滿足id降序排列)  order by name, age desc  name優先name一樣的話 就按a

js XMLHttpRequest XMLHTTP 請求URL包含中文時請求失敗解決方法

寫 XMLHttpRequest  XMLHTTP 請求時,遇到箇中文URL,結果請求失敗,找了好多資料,說什麼用 escape(URL)還要兩次,完全無用,更錯,仔細看看不使用escape時伺服器返回了,HTTP 錯誤 404.11 - Not Found請求篩選模組被配置

Oracle資料庫order by排序之null值處理方法

最近在忙活公司產品後臺的資料報表,在對業務資料排序時候,發現有些欄位的記錄是null值,這時排序便出現了有違我們使用習慣的資料大小順序問題。在Oracle中規定,在Order by排序時預設認為null是最大值,所以如果是ASC升序則被排在最後,而DESC降序則排在最前。

mybatis ORDER BY排序問題

<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" > select <include refid="Ba

MYSQL升級到5.7的後GROUP BY語句出錯解決方法

今天用mysql執行GROUP BY 語句的時候碰到 which is not functionally dependent on columns in GROUP BY clause的問題,發現5.6以及之前的mysql中GROUP BY中的列不一定到出現在select