springboot 分页插件PageHelper的配置和使用方法

时间:2024-03-09 14:04:39
  • 前言

    在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