MySQL 按照數據庫表字段動態排序 查詢列表信息


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"
}

 

 

至此,按照傳入的字段名和排序方式進行排序的功能就實現了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM