1. 程式人生 > >SpringBoot下dataTable分頁實現

SpringBoot下dataTable分頁實現

dataTable的分頁可以前端實現,但是前端實現的分頁是假分頁(從後臺獲取所有資料,再快取分頁處理),這樣做確實方便開發,但是隨著資料量逐漸增大,查詢的訊息越來越低,每次都在查詢的時候卡住幾秒。所以假分頁相當不實用了。

在分頁前,自己做了一個簡單的分頁資料量查詢測試,分頁資料在100條以內的查詢效率幾乎無感,分頁資料在100-1000條的查詢訊息逐漸慢了下來。進行資料庫大量查詢時,可以對資料進行分頁查詢(10000條資料查詢100次100條比一次性查詢10000條資料快)。

dataTable分頁實現:

網頁程式碼如下,隨便寫的,不用在意顯示的是什麼。

  <div class="box box-primary no-border">
        <div class="box-header no-border" style="margin-bottom: -10px;">
        </div>
        <div class="box-body">
            <table class="table table-bordered dataTable display aoTable" style="font-size: 12px;width: 100%;">
                <thead>
                <tr>
                    <th>id</th>
                    <th>userId</th>
                    <th>password</th>
                    <th>nickname</th>
                    <th>avarUrl</th>
                 </tr>
                </thead>
                <tbody>
                </tbody>
            </table>
        </div>
    </div>

js程式碼如下,dataTable的基本屬性網上能夠查詢到,最重要的是bServerSide:true開始後端請求,fnServerData:傳送請求的時候執行的是如下方法。sAjaxSource:傳送請求的短連結,這樣我們就能把分頁需要的部分資料傳送到後臺。

(function (ele) {

    var table = ele.find('.dataTable').dataTable({
        'bServerSide': true,
        bLengthChange: false, //支援變更頁面顯示資料行數
        bPaginate: true,  //顯示翻頁按鈕
        "ordering": false,
        "iDisplayLength": 50,
        "fnServerData": function (sSource, aoData, fnCallback) {
            $.ajax({
                "type": 'post',
                "url": sSource,
                "dataType": "json",
                "data": {
                    "aoData": JSON.stringify(aoData)
                }
                , "success": function (resp) {
                    fnCallback(resp);
                }
            });
        }, "sAjaxSource": app.path + "/get/userList",
        "aoColumns": [{
            "mData": "startTime"
        }, {
            "mData": "endTime"
             
        }]});}
        );

Java程式碼:

在Contorller中短連結請求引數中需要加上如下圖所示的程式碼,注意:這裡的TableRequest是封裝好的一個請求,通過Converter將String字串轉換成了物件。aaData實際上是一個Json字串,可以打印出來檢視,這裡不在詳細講述,一般只需要取出4個引數就行實現後端分頁。

iDisplayLength:該頁顯示的資料條數

sEcho:請求的次數

iDisplayStart:開始的位置

searchMap:查詢條件,可以多條件查詢

service程式碼如下:

從tableRequest取出資料,分頁查詢資料庫返回結果集。計算一下user的總數。將資料封裝到Map中。這裡需要注意的是:按照字面意思itotalRecords確實是應該放總查詢資料量,iTotalDisplayRecords為當前頁要展示的資料量。而實際的使用過程中,這兩個資料應該是反了過來(em.......)

。不知道是不是我的理解有問題~反正只有這樣操作才正確。返回的結果是一個字串,js程式碼可以識別result的引數並進行相應的配置。

        Integer start = tableRequest.getiDisplayStart();
        Integer limit = tableRequest.getiDisplayLength();
        List<User> list = userMapper.selectByMark(tableRequest.getSearchMap(), start, limit);
        //計算總數
        int totalCount = userMapper.count();
        Map<String, Object> result = new HashMap<>();
        result.put("aaData",list);
        result.put("iTotalDisplayRecords",totalCount);
        result.put("iTotalRecords",list.size());
        result.put("sEcho",tableRequest.getsEcho());
        return JSONObject.toJSONString(result);

Mybits配置檔案的Sql語句:寫的一個簡單的sql ,可以根據自己的需求進行相應的變化,排序可以在這裡先排序好。

select * from `user` order by id limit #{start},#{limit}。這種sql支援的資料量不太,資料量越大越慢。為什麼?可以自行百度。