-
前言
在web開發過程中涉及到表格時,例如dataTable,就會產生分頁的需求,通常我們將分頁方式分為兩種:前端分頁和后端分頁。
1)前端分頁
一次性請求數據表格中的所有記錄(ajax),然后在前端緩存並且計算count和分頁邏輯,一般前端組件(例如dataTable)會提供分頁動作。
特點是:簡單,很適合小規模的web平台;當數據量大的時候會產生性能問題,在查詢和網絡傳輸的時間會很長。
2)后端分頁
在ajax請求中指定頁碼(pageNum)和每頁的大小(pageSize),后端查詢出當頁的數據返回,前端只負責渲染。
特點是:復雜一些;性能瓶頸在MySQL的查詢性能,這個當然可以調優解決。一般來說,web開發使用的是這種方式。
我們說的也是后端分頁。
- MySQL對分頁的支持
簡單來說MySQL對分頁的支持是通過limit子句。請看下面的例子。
limit關鍵字的用法是 LIMIT [offset,] rows offset是相對於首行的偏移量(首行是0),rows是返回條數。 # 每頁10條記錄,取第一頁,返回的是前10條記錄 select * from tableA limit 0,10; # 每頁10條記錄,取第二頁,返回的是第11條記錄,到第20條記錄, select * from tableA limit 10,10;
這里提一嘴的是,MySQL在處理分頁的時候是這樣的:
limit 1000,10 - 過濾出1010條數據,然后丟棄前1000條,保留10條。當偏移量大的時候,性能會有所下降。
limit 100000,10 - 會過濾10w+10條數據,然后丟棄前10w條。如果在分頁中發現了性能問題,可以根據這個思路調優。
- Mybatis分頁插件PageHelper
在使用Java Spring開發的時候,Mybatis算是對數據庫操作的利器了。不過在處理分頁的時候,Mybatis並沒有什么特別的方法,一般需要自己去寫limit子句實現,成本較高。好在有個PageHelper插件。
1、POM依賴
PageHelper的依賴如下。(這里有個坑,springboot引入的依賴和spring的依賴不一樣)
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.13</version>
</dependency>
2、application.yml 添加配置
# 分頁插件 pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql
3.Controller中實現分頁
@ApiOperation(value = "獲取電池采集歷史集合",httpMethod = "GET", notes = "獲取電池采集歷史集合") @ResponseBody @RequestMapping(value = {"/Pagelist"}, method = RequestMethod.GET) public Result getPageList( @ApiParam(value = "mac地址", required = true) String MAC, @ApiParam(value = "電池編號", required = true) Integer Number, @ApiParam(value = "開始時間", required = true) String starTime, @ApiParam(value = "結束時間", required = true) String endTime, @ApiParam(value = "分頁索引", required = true) Integer pageIndex, @ApiParam(value = "分頁條數", required = true) Integer pageSize) { try { PageHelper.startPage(pageIndex, pageSize); List<batteryinfoEntity> list = service.getAll(MAC,Number,starTime,endTime,null, null); PageInfo<batteryinfoEntity> pageInfo = new PageInfo<batteryinfoEntity>(list); //分頁列表,總數 return Result.successPage(pageInfo.getList(),(int)pageInfo.getTotal()); } catch (Exception ex) { System.out.println(ex.getMessage()); return Result.failure(ResponseCode.ERROR_999, ResponseMsg.QUERY_ERROR); } }
說明:service.getAll()方法就是正常的按業務查詢,PageHelper自動就注入分頁。
通過調試可以看到,sql 自動添加了 limit