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.......)
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支援的資料量不太,資料量越大越慢。為什麼?可以自行百度。