分页查询的原理及PageHelper插件的使用

本文介绍了分页查询的原理,包括物理分页和逻辑分页,并讨论了何时选择哪种方式。重点讲解了PageHelper插件在MyBatis中的使用,包括依赖引入、API调用以及插件的工作原理。同时,提到了PageHelper的合理化功能,确保页码值的正确性,并在测试中验证了这一特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 日志管理业务层开发

1. 分页

分页原理

  1. 分页在使用时的分类

    1. 物理分页:
      1. 在操作数据库中的表时,sql语句中使用了limit ?,?,此时sql语句返回的结果是分页结果
    2. 逻辑分页:
      1. 依赖程序的代码,其原理为:通过sql语句将数据库表中的所有数据都查询出,之后将数据保存在内存中,最终要显示的数据若涉及到分页,到内存中去查找数据返回.通过以上原理得出,逻辑分页在对数据库表的操作上没有limit
  2. 物理分页和逻辑分页的区别?

    1. 数据库压力:
      1. 物理分页对数据库查询操作次数多,数据库压力会更大点,相对而言,逻辑分页对数据库的压力会小
    2. 对服务器的压力:
      1. 物理分页对服务器的压力相对而言较小,逻辑分页因为要在内存存储大量数据,对服务器压力会大
    3. 什么情况应该选择哪种分页?
      1. 物理分页:数据量大,数据稳定性差时使用,来实现实时更新数据
      2. 逻辑分页:数据量小,数据稳定性高时使用,此时可以使用逻辑分页
  3. 实际工作中分页的实现:

    1. 通常会使用插件:目前市面上使用率较高的是mybatis的插件PageHelper

    2. PageHelper的使用:

      1. 需要导入该插件的依赖

      2. 在代码中使用PageHelper的api方法实现分页
        在这里插入图片描述

2. 日志列表查询业务层代码

  1. 业务层代码逻辑和以上图片中的业务层逻辑相同

  2. 准备工作:

    1. 定义业务异常的包以及父类以及会出现的子类业务异常

      1. 父类:ServiceException – 定义在base包下
      2. 子类业务异常:在service包下创建ex包,在该包下定义PageIllegalException异常类
    2. 注意点:

      1. 重写父类方法的快捷键:Ctrl+O

      2. 类中如何生成序列版本号:

        1. File->settings->Inspections->ser…->找到如下选项,勾选,即让idea检查序列版本号

在这里插入图片描述

  1. 业务层开发步骤:

    1. 创建LogService接口以及实现类LogServiceImpl

    2. 添加PageHelper的依赖

      1. 在idea中采用idea的联想功能注入依赖

      2. 更新maven

        <dependency>
                    <groupId>com.github.pagehelper</groupId>
                    <artifactId>pagehelper-spring-boot-starter</artifactId>
                    <version>1.2.13</version>
                </dependency>
        
    3. 在业务层实现类中写分页查询代码:

      @Service
      public class LogServiceImpl implements LogService {
          @Autowired
          LogMapper logMapper;
      
          @Override
          public PageInfo<Log> findLogList(String userName, Integer pageNum, Integer pageSize) {
              //参数非空判断
              if(pageNum==null || pageSize==null){
                  throw new PageIllegalException("查询日志列表异常!查询页码或每页显示数据量不能空!");
              }
              PageHelper.startPage(pageNum,pageSize);
              //调用mapper中的方法查询日志列表
              List<Log> list = logMapper.selectLogList(userName);
              PageInfo<Log> pageInfo = new PageInfo<>(list);
              return pageInfo;
          }
      }
      
    4. 写测试类,进行测试

      @SpringBootTest
      public class LogServiceTest {
          @Autowired
          LogService logService;
      
          @Test
          public void findLogList(){
              String  userName = null;
              Integer pageNum = 1;
              Integer pageSize = 6;
              PageInfo<Log> info = logService.findLogList(userName,pageNum,pageSize);
      
              System.err.println(info);
          }
      }
      
    5. PageHelper插件实现分页查询的原理:

      1. PageHelper插件分页的原理:
        使用了拦截器,对mybatis中的query操作进行拦截

在这里插入图片描述

  1. 控制台打印mybatis执行操作的sql语句

    1. 通过在yml文件中添加mybatis的配置信息来打印sql语句

      mybatis:
        mapper-locations: classpath:mappers/*.xml
        configuration:
          log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      
    2. 可能遇到的问题:

      1. 若service测试类执行报空指针异常,检查@Service注解添加是否正确,要在Service实现类上方添加,不是接口上方添加
  2. PageHelper分页插件的合理化功能:

    1. 场景:

      1. 由页面发起请求,请求某页的数据,会进行分页查询,页面通常都会传递一个页码值给服务器,页码值正确的应该是从1开始的正整数

        1. 比如:查询第1页,第2页,但是有可能出现查询第0页和查询的页码超过总页数,以上2种情况

          日志列表查询,假设每页显示6条数据,表中共有30条数据,即共5页
              此时,请求中有可能请求的是第0页的数据
              也有可能出现查询的页码为第6页
              此时,以上2种值我们视为不合理的值
          
    2. 合理化功能:

      1. 是指PageHelper插件在分页查询时,会对传递来的页码值进行合理化判断
        1. 若页码值<1,此时PageHelper将页码设置为1,
        2. 若页码值>total,此时pageHelper将页码值设置为最大页码
    3. PageHelper的合理化功能默认是关闭的,若要使用,必须通过配置来启动

      pagehelper:
        reasonable: true
      注意点:yml文件中key和vlaue之间必须间隔一个空格
      

      1.1 然后在ServiceImplTest测试类中,进行-1页,第8页测试,看pageInfo对象中的页码值是否进行了合理化处理

另外,用PageHelper查到的PageInfo中信息很全,相关属性均可以在前端页面取出使用,十分方便,以下是Json格式的截图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值