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"
上面這個轉換後的語句,我們會發現兩個問題:
- 第一個?沒有被替換
- “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
sqlserver中order by 排序用法
ORDER BY 語句用於根據指定的列對結果集進行排序,ORDER BY 語句預設按照升序對記錄進行排序,如果您希望按照降序對記錄進行排序,可以使用 DESC 關鍵字。 排序可以是升序的 (ASC),也可以是降序的 (DESC)。如果未指定是升序還是降序,就假定為 A
Mybatis,Order 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的排序演算法不具有穩定性,也就是說,對於排序鍵值相等的資料,這種演算法完成
xampp中apache點擊啟動失敗解決方法
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
當SQL中ORDER BY待排序欄位值相同時,查詢結果是什麼?
簡書 Wwwwei轉載請註明原創出處,謝謝!前言 資料庫分頁是後臺經常要使用的技術手段,有時候進行資料庫查詢會根據業務需要對某一欄位排序,那麼當待排序欄位值相同時,我們得到的查詢結果會是什麼呢?問題描述 資料分頁時需要根據資料記錄建立時間create_time欄位倒序,即使用order
mysql中order 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
mysql中order 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
當SQL中ORDER 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