-
前言
在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