当前位置:   article > 正文

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

pagehelper配置
  • 前言 

在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页。

前端分页

一次性请求数据表格中的所有记录(ajax),然后在前端缓存并且计算count和分页逻辑,一般前端组件(例如dataTable)会提供分页动作。

特点是:简单,很适合小规模的web平台;当数据量大的时候会产生性能问题,在查询和网络传输的时间会很长。

后端分页

ajax请求中指定页码(pageNum)和每页的大小(pageSize),后端查询出当页的数据返回,前端只负责渲染。

特点是:复杂一些;性能瓶颈在MySQL的查询性能,这个当然可以调优解决。一般来说,web开发使用的是这种方式。

我们说的也是后端分页。

  • MySQL对分页的支持

简单来说MySQL对分页的支持是通过limit子句。请看下面的例子。

  1. limit关键字的用法是
  2. LIMIT [offset,] rows
  3. offset是相对于首行的偏移量(首行是0),rows是返回条数。
  4. # 每页10条记录,取第一页,返回的是前10条记录
  5. select * from tableA limit 0,10;
  6. # 每页10条记录,取第二页,返回的是第11条记录,到第20条记录,
  7. 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依赖

Mybatis的配置就不多提了。PageHelper的依赖如下。需要新的版本可以去maven上自行选择

  1. <!-- pagehelper 分页插件 -->
  2. <dependency>
  3. <groupId>com.github.pagehelper</groupId>
  4. <artifactId>pagehelper-spring-boot-starter</artifactId>
  5. <version>1.4.0</version>
  6. </dependency>

2、Mybatis对PageHelper的配置

打开Mybatis配置文件,一般在Resource路径下。我这里叫mybatis-config.xml。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  3. <configuration>
  4. <plugins>
  5. <plugin interceptor="com.github.pagehelper.PageHelper">
  6. <property name="dialect" value="mysql"/>
  7. <property name="offsetAsPageNum" value="false"/>
  8. <property name="rowBoundsWithCount" value="false"/>
  9. <property name="pageSizeZero" value="true"/>
  10. <property name="reasonable" value="false"/>
  11. <property name="supportMethodsArguments" value="false"/>
  12. <property name="returnPageInfo" value="none"/>
  13. </plugin>
  14. </plugins>
  15. </configuration>  

这里要注意的是PageHelper相关的配置。 一般只有需要设置数据库为mysql即可,Springmvc4.0以上的版本已经不需要设置数据库;springboot 什么都不设置,用默认的就可以。导入依赖即可

项目中使用具体步骤如下:
(1) Controller 接收参数的时候把分页参数带上

  1. @GetMapping("/query")
  2. public Result query(@RequestParam Integer pageNum,@RequestParam Integer pageSize)
  3. {
  4. //由于目前业务只有查询全部的情况,所以入参的条件设置为null,sql无where条件
  5. return channelInfoService.selectChannelInfoList(null, pageNum, pageSize);
  6. }

(2)在业务代码需要分页的地方构建分页方法.若依使用的是PageHelper 代码如下:

  1. if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
  2. PageHelper.startPage(pageNum, pageSize);
  3. }
  1. @Override
  2. public Result selectChannelInfoList(ChannelInfo channelInfo,Integer pageNum,Integer pageSize) {
  3. if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
  4. PageHelper.startPage(pageNum, pageSize);
  5. }
  6. List<ChannelInfo> channelInfos = channelInfoMapper.selectChannelInfoList(channelInfo);
  7. if (CollectionUtils.isNotEmpty(channelInfos)){
  8. return Result.success(channelInfos);
  9. }
  10. return Result.fail("1001","通道信息不存在");
  11. }

返回:

注意:我们可以通过PageInfo<AlarmRecordChannelNameVo> pageInfo = new PageInfo<AlarmRecordChannelNameVo>(alarmRecords);获取PageInfo对象,拿到分页的信息数据,PageInfo很强大

  1. @Override
  2. public Result selectAlarmRecord(Map<String,Object> queryMap) {
  3. if (StringUtils.isEmpty((String) queryMap.get("pageNum"))|| StringUtils.isEmpty((String)queryMap.get("pageSize"))){
  4. return Result.fail("1001","入参错误,pageNum和pageSize必填");
  5. }
  6. int pageNum = Integer.parseInt((String)queryMap.get("pageNum"));
  7. int pageSize = Integer.parseInt((String)queryMap.get("pageSize"));
  8. PageHelper.startPage(pageNum, pageSize);
  9. logger.info("查询条件:" + queryMap.toString());
  10. //查询
  11. List<AlarmRecordChannelNameVo> alarmRecords = alarmRecordMapper.selectAlarmRecord(queryMap);
  12. PageInfo<AlarmRecordChannelNameVo> pageInfo = new PageInfo<AlarmRecordChannelNameVo>(alarmRecords);
  13. long pageInfoTotal = pageInfo.getTotal(); //总数
  14. int pageInfoPageSize = pageInfo.getPageSize(); //每页的数量
  15. int pageInfoPageNum = pageInfo.getPageNum(); //当前页
  16. int pageInfopages = pageInfo.getPages(); //总页数
  17. Pagination pagination = new Pagination(pageInfoPageNum,pageInfoPageSize,pageInfoTotal,pageInfopages);
  18. HashMap<String,Object> alarmMap = new HashMap<String, Object>(4);
  19. alarmMap.put("alarmRecords",alarmRecords);
  20. alarmMap.put("pagination",pagination);
  21. if (CollectionUtils.isNotEmpty(alarmRecords)){
  22. return Result.success(alarmMap);
  23. }
  24. return Result.fail("200","查询失败,记录不存在");
  25. }

若依框架用的是mybatis的pagehelper插件,是通过request获取param来拿的

参考博客:Springboot Mybatis使用pageHelper实现分页查询_小目标青年的博客-CSDN博客_springboot分页查询mybatis

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/88359
推荐阅读
相关标签
  

闽ICP备14008679号