Mybatis-Plus实现分页查询

一、Mybatis-Plus通过QueryWrapper

1.1 分页查询(针对需要聚合的数据)

  1. 创建一个 QueryWrapper 实例,用于构建查询条件,OpHighRiskExposureDO为与数据库对应的实体类。

    QueryWrapper<OpHighRiskExposureDO> wrapper = new QueryWrapper<>();

2.使用分页工厂创建分页对象,执行查询,并返回结果集,结果类型为 Page<Map<String, Object>>;其中 selectMapsPage 方法将查询结果以 Map<String, Object> 的形式返回。PageFactory.buildPage(opHighRiskExposureReq)是用于构建一个Page对象。

复制代码
Page<Map<String, Object>> page = opHighRiskExposureMapper.selectMapsPage(PageFactory.buildPage(opHighRiskExposureReq), wrapper);
  1. 将查询结果转换为目标分页结果类型 Page<OpHighRiskExposureRespVO>,并设置分页信息 ; 设置记录列表、当前页、每页大小和总记录数,最后通过工厂方法返回封装的 PageResult。

    PageResultFactory.createPageResult(new Page<OpHighRiskExposureRespVO>()
    .setRecords(exposureRespList) // 设置查询结果转换后的记录列表
    .setCurrent(page.getCurrent()) // 设置当前页号
    .setSize(page.getSize()) // 设置每页记录数
    .setTotal(page.getTotal())); // 设置总记录数

1.2 分页查询(不需要聚合的情况,三行解决分页查询问题)

  • QueryWrapper:用于构建查询条件和排序规则。

  • 选择字段与排序 :选择所有字段并按 exposure_time 降序排列。

  • 分页查询 :使用 PageFactory.buildPage 方法创建分页对象,并执行查询,获取分页数据。

  • 结果转换 :使用 PageResultFactory.createPageResult 将查询结果转换为指定的分页结果类型并返回。

  • 注意:这里的OpHighRiskExposureDO是和你数据库里建的表的字段和类型一一对应的,不能改变,OpHighRiskExposureRespVO是你和前端交互的实体类,字段名字和OpHighRiskExposureDO大差不差,但是字段类型可以根据前端需求作出改变。

    // 定义查询高危暴露数据的方法,返回分页结果 PageResult<OpHighRiskExposureRespVO>
    public PageResult<OpHighRiskExposureRespVO> queryHighRiskExposures(OpHighRiskExposureReq opHighRiskExposureReq) {

    复制代码
      // 创建 QueryWrapper 实例,用于构建查询条件
      QueryWrapper<OpHighRiskExposureDO> wrapper = new QueryWrapper<>();
    
      // 选择所有字段,并按 exposure_time 字段进行降序排序
      // select("*") 表示选择所有列,orderByDesc 设置降序排列
      wrapper.select("*").orderByDesc("exposure_time");
    
      // 使用分页工厂类创建分页对象,并执行查询
      // selectPage 方法返回分页结果 Page<OpHighRiskExposureDO>,包含查询结果及分页信息
      Page<OpHighRiskExposureDO> page = opHighRiskExposureMapper.selectPage(PageFactory.buildPage(opHighRiskExposureReq), wrapper);
    
      // 使用工厂方法 createPageResult,将查询结果转换为 PageResult<OpHighRiskExposureRespVO> 类型并返回
      // 这里的 OpHighRiskExposureRespVO.class 指定了转换的目标类型
      return PageResultFactory.createPageResult(page, OpHighRiskExposureRespVO.class);

    }

二、Mybatis-Plus通过XML文件实现分页查

1.首先根据传进来的请求体建立一个page对象

复制代码
Page<AttackedCustomersRespVO> page = PageFactory.buildPage(attackedCustomersReqDTO);

2.调用mapper时候需要把这个page对象传入

复制代码
   Page<AttackedCustomersRespVO> pageResult = customerRiskMonitoringMapper.getAttackedCustomersPage(page, customerScope, sortType, evtTimeBegin, evtTimeEnd, orgPathList, orgName);

注意:mapper中的对象要返回Page对象,这样xml文件才会自动解析

复制代码
Page<AttackedCustomersRespVO> getAttackedCustomersPage(Page<AttackedCustomersRespVO> page,
                                                           @Param("customerScope") Integer customerScope,
                                                           @Param("sortType") Integer sortType,
                                                           @Param("startTime") Date startTime,
                                                           @Param("endTime") Date endTime,
                                                           @Param("orgPathList") List<String> orgPathList,
                                                           @Param("orgName") String orgName);
  1. 构造返回分页对象

    return PageResultFactory.createPageResult(pageResult);

4.xml文件中都不用传page参数

在 MyBatis 中,如果你看了 XML 映射文件,发现根本没有显式地使用 Page 参数,依然能实现分页的原因是 MyBatis-Plus 提供了 分页插件(PaginationInterceptor)和自动分页功能,分页的实现实际上是通过拦截器在执行 SQL 查询之前自动处理的,而不需要在 XML 中手动编写分页逻辑。

如何实现自动分页?

  • 分页插件的拦截作用 : MyBatis-Plus 通过其分页插件(PaginationInterceptor)来拦截和修改查询 SQL。分页插件会在执行查询之前检查 Page 类型的参数,获取页码和每页的记录数,然后在查询的 SQL 中自动加入 LIMIT 或其他数据库特有的分页语句。你并不需要在 XML 中显式地处理分页。

  • Page 对象的作用 : 当你传入 Page 类型的参数时,MyBatis-Plus 会自动识别该对象,并在内部对 SQL 进行修改。Page 对象封装了当前页码、每页记录数等信息,这些信息会在执行 SQL 查询时被用到。

  • 没有显式调用 Page 参数的原因 : 在 XML 中并不需要显式地使用 Page 参数,因为分页插件已经完成了对 SQL 的自动修改。分页插件会动态生成分页相关的 SQL 语句,而 XML 文件中的 SQL 只需要关注查询的基本条件和字段,不需要考虑分页逻辑。

  • 分页插件初始化在 MyBatis-Plus 中,分页插件通常在配置类中初始化,使用 @BeanSqlSessionFactory 配置等方式,将分页插件 PaginationInterceptor 注入到 MyBatis 的执行器中。

  • 当你调用该方法时,Page<AttackedCustomersRespVO> 会携带分页信息(例如,当前页码和每页条数)。分页插件会自动读取这些信息,并在执行查询时修改 SQL,生成类似下面的分页查询:

    复制代码
    SELECT * FROM attacked_customers
    WHERE customer_scope = #{customerScope}
    AND sort_type = #{sortType}
    AND start_time >= #{startTime}
    AND end_time <= #{endTime}
    LIMIT #{page.start}, #{page.size}
相关推荐
fouryears_234171 小时前
Flutter InheritedWidget 详解:从生命周期到数据流动的完整解析
开发语言·flutter·客户端·dart
我好喜欢你~1 小时前
C#---StopWatch类
开发语言·c#
桦说编程3 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen3 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研3 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
记忆不曾留3 小时前
Mybatis 源码解读-SqlSession 会话源码和Executor SQL操作执行器源码
mybatis·二级缓存·sqlsession会话·executor执行器·一级缓存localcache
没有bug.的程序员3 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋4 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cui__OaO4 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
阿华的代码王国4 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端