MySQL 按照數據庫表字段動態排序 查詢列表信息
背景描述
項目中數據列表分頁展示的時候,前端使用的Table組件,每列自帶對當前頁的數據進行升序或者降序的排序。
但是客戶期望:隨機點擊某一列的時候,對查詢到的所有數據進行排序。
舉例說明:
查詢到的有100條數據,每頁10條,共10頁。前端Table組件,可以對當前頁的10條數據,進行排序,其他的9頁並不參與排序。
但是,實際期望是對查詢到的10頁數據均參與排序。
並且不是特定列,而是每列均可以按照升序或者降序,將查詢到的結果進行再次排序。
處理方式
由於前端技術的限制,需要在后端進行處理,對查詢列表的接口進行修改。
1、修改查詢實體類
首先需要在查詢條件的請求實體中,增加兩個字段 orderField 和 orderType,用於保存傳入字段名和排序的方式(升序ASC,降序DESC)
orderField:用於接收需要排序的字段
orderType:用於接收排序的方式,ASC,DESC,asc,desc
代碼如下:
// 對字段進行排序 private String orderField; // 存放排序字段 private String orderType; // ASC DESC public String getOrderField() { return orderField; } public void setOrderField(String orderField) { this.orderField = orderField; } public String getOrderType() { return orderType; } public void setOrderType(String orderType) { this.orderType = orderType; }
2、修改 mapper.xml 文件
找到MyBatis的Mapper文件中,在查詢列表方法的SQL。
增加如下代碼:
<if test="orderField != null and orderField != '' and orderType != null and orderType != ''"> ORDER BY ${orderField} ${orderType} </if>
【特別注意】:此處SQL的兩個參數,一定要使用 ${ } 接收,而不能使用 #{ }。否則,不會到達預期的效果。
${ }:不會對傳入的字符串進行處理。比如:傳入的是 create_time 和 desc,${ }處理后的效果是 ORDER BY create_time desc,可以實現按照 create_time字段倒序排序的效果。
#{ }:會對傳入的字符串進行處理。比如:傳入的是 create_time 和 desc,#{ }處理后的效果是 ORDER BY 'create_time' 'desc',會當成字符串常量,達不到按照 create_time字段倒序排序的效果。
當然,${ }可能會引發SQL注入。一般情況下,都是使用 #{ }的。只有這種不需要對傳入的值進行轉換的場景,才會使用 ${ }。
為了實現標題中的功能,恰好用到了 ${ } 的 這個特性而已。
3、增加接口調用字段
在傳參時,增加 orderField 和 orderType ,效果如下
{ "pageNum":1, "pageSize":5, "orderField":"create_time", "orderType":"desc" }
至此,按照傳入的字段名和排序方式進行排序的功能就實現了。