DIY mybatisPlus的分页插件

目录

    • 起因
    • 修改
      • 定义接口
      • 重写MyPage的方法
    • 实践测试

起因

在我们通过list返回的列表页,出现了一个需要数据合计的需求,例如一个订单1块钱,那么所有订单加起来多少钱,那么list一般都通过分页返回,而统计所有订单又不能只统计分页的那几条数据,因此需要在查询一下数据库,如果通过left join去查询并在list中加个字段好像又不太合适

mybatisPlus自带了分页插件,但是在page中又不能set我们需要返回的合计数据,不过通过上次修改了poi的源码后,我们只要能看到源码就能轻易扒出来源码进行修改

修改

定义接口

继承原先的IPage接口,在此基础上进行扩展

import com.baomidou.mybatisplus.core.metadata.IPage;public interface MyPage<T> extends IPage<T> {/*** 获取自定义内容** @return 自定义内容*/Object getContent();/*** 设置自定义内容* @param content 自定义内容* @return*/MyPage<T> setContent(Object content);
}

重写MyPage的方法

通过重写MyPage接口的方式实现diy分页

public class MyPageImpl<T> implements MyPage<T> {private static final long serialVersionUID = 8545996863226528798L;/*** 查询数据列表*/protected List<T> records;/*** 总数*/protected long total;/*** 每页显示条数,默认 10*/protected long size;/*** 当前页*/protected long current;/*** 排序字段信息*/protected List<OrderItem> orders;/*** 自动优化 COUNT SQL*/protected boolean optimizeCountSql;/*** 是否进行 count 查询*/protected boolean searchCount;/*** countId*/protected String countId;/*** maxLimit*/protected Long maxLimit;/*** 自定义Object*/protected Object content;public MyPageImpl() {this.records = Collections.emptyList();this.total = 0L;this.size = 10L;this.current = 1L;this.orders = new ArrayList();this.optimizeCountSql = true;this.searchCount = true;this.content = null;}/*** 分页构造函数** @param current 当前页* @param size    每页显示条数*/public MyPageImpl(long current, long size) {this(current, size, 0L);}public MyPageImpl(long current, long size, long total) {this(current, size, total, true);}public MyPageImpl(long current, long size, boolean searchCount) {this(current, size, 0L, searchCount);}public MyPageImpl(long current, long size, long total, boolean searchCount) {this.records = Collections.emptyList();this.total = 0L;this.size = 10L;this.current = 1L;this.orders = new ArrayList();this.optimizeCountSql = true;this.searchCount = true;if (current > 1L) {this.current = current;}this.size = size;this.total = total;this.searchCount = searchCount;}public MyPageImpl(long current, long size, long total, boolean searchCount, Object content) {this.records = Collections.emptyList();this.total = 0L;this.size = 10L;this.current = 1L;this.orders = new ArrayList();this.optimizeCountSql = true;this.searchCount = true;if (current > 1L) {this.current = current;}this.size = size;this.total = total;this.searchCount = searchCount;this.content = content;}/*** 是否存在上一页** @return true / false*/public boolean hasPrevious() {return this.current > 1L;}/*** 是否存在下一页** @return true / false*/public boolean hasNext() {return this.current < this.getPages();}public List<T> getRecords() {return this.records;}public MyPageImpl<T> setRecords(List<T> records) {this.records = records;return this;}public long getTotal() {return this.total;}public MyPageImpl<T> setTotal(long total) {this.total = total;return this;}public Object getContent() {return this.content;}public MyPageImpl<T> setContent(Object content) {this.content = content;return this;}public long getSize() {return this.size;}public MyPageImpl<T> setSize(long size) {this.size = size;return this;}public long getCurrent() {return this.current;}public MyPageImpl<T> setCurrent(long current) {this.current = current;return this;}public String countId() {return this.countId;}public Long maxLimit() {return this.maxLimit;}/*** 查找 order 中正序排序的字段数组** @param filter 过滤器* @return 返回正序排列的字段数组*/private String[] mapOrderToArray(Predicate<OrderItem> filter) {List<String> columns = new ArrayList(this.orders.size());this.orders.forEach((i) -> {if (filter.test(i)) {columns.add(i.getColumn());}});return columns.toArray(new String[0]);}/*** 移除符合条件的条件** @param filter 条件判断*/private void removeOrder(Predicate<OrderItem> filter) {for (int i = this.orders.size() - 1; i >= 0; --i) {if (filter.test(this.orders.get(i))) {this.orders.remove(i);}}}/*** 添加新的排序条件,构造条件可以使用工厂:{@link OrderItem#(String, boolean)}** @param items 条件* @return 返回分页参数本身*/public MyPageImpl<T> addOrder(OrderItem... items) {this.orders.addAll(Arrays.asList(items));return this;}/*** 添加新的排序条件,构造条件可以使用工厂:{@link OrderItem#(String, boolean)}** @param items 条件* @return 返回分页参数本身*/public MyPageImpl<T> addOrder(List<OrderItem> items) {this.orders.addAll(items);return this;}public List<OrderItem> orders() {return this.orders;}public boolean optimizeCountSql() {return this.optimizeCountSql;}public boolean searchCount() {return this.total >= 0L && this.searchCount;}public MyPageImpl<T> setSearchCount(boolean searchCount) {this.searchCount = searchCount;return this;}public MyPageImpl<T> setOptimizeCountSql(boolean optimizeCountSql) {this.optimizeCountSql = optimizeCountSql;return this;}public long getPages() {return MyPage.super.getPages();}/* --------------- 以下为静态构造方式 --------------- */public static <T> MyPageImpl<T> of(long current, long size) {return of(current, size, 0L);}public static <T> MyPageImpl<T> of(long current, long size, long total) {return of(current, size, total, true);}public static <T> MyPageImpl<T> of(long current, long size, boolean searchCount) {return of(current, size, 0L, searchCount);}public static <T> MyPageImpl<T> of(long current, long size, long total, boolean searchCount) {return new MyPageImpl<>(current, size, total, searchCount);}/*** --begin------------- 未来抛弃移除的方法 -------------begin--* 该部分属性转移至 {@link PageDTO}*//*** @deprecated*/@Deprecatedpublic String getCountId() {return this.countId;}/*** @deprecated*/@Deprecatedpublic Long getMaxLimit() {return this.maxLimit;}/*** @deprecated*/@Deprecatedpublic List<OrderItem> getOrders() {return this.orders;}/*** @deprecated*/@Deprecatedpublic boolean isOptimizeCountSql() {return this.optimizeCountSql;}/*** @deprecated*/@Deprecatedpublic boolean isSearchCount() {return this.searchCount;}public void setOrders(final List<OrderItem> orders) {this.orders = orders;}public void setCountId(final String countId) {this.countId = countId;}public void setMaxLimit(final Long maxLimit) {this.maxLimit = maxLimit;}/** --end------------- 未来抛弃移除的方法 -------------end-- */
}

实践测试

	//获取分页信息MyPageImpl<InStoreDtl> page = new MyPageImpl<>(pageNo, pageSize);//返回我们自定义的分页对象MyPage<InStoreDtl> pageList = inStoreDtlMapper.listByMainCode(mainCode, page);//获取合计的数据Map<String, Object> countMap = inStoreDtlMapper.selectCountNum(mainCode);pageList.setContent(countMap);return pageList;

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

量化研究---小果因子分析系统使用教程,可转债macd因子为例子

文章链接 量化研究---小果因子分析系统使用教程&#xff0c;可转债macd因子为例子 (qq.com) 因子分析是一种多维变量统计分析方法&#xff0c;用于从多个变量中提取少数公共因子。 具体来说&#xff0c;因子分析的核心目的是通过研究变量之间的相关性&#xff0c;将多个相关联…

Spring 事务 (编程式 声明式, Spring 事务传播机制)

事务 事务是一组操作的集合, 是一个不可分割的整体 事务会把所有的操作作为一个整体, 一起向数据库提交或是撤销操作请求. 所以这组操作要么同时成功, 要么同时失败 Spring 中事务的实现 编程式 (手动写代码操作事务)声明式 (通过注解自动开启和提交事务) 编程式事务 开启事务 …

Module外贸主题开心版下载-v5.7.0版本WordPress企业模板

主题下载地址&#xff1a;Module外贸主题开心版下载-v5.7.0版本 Module主题介绍&#xff1a;采用全新模块化开发&#xff0c;首页模块可视化拖拽自由组合&#xff0c;可自定义搭建出不同行业适用的企业网站。同时主题全面支持WPML多语言切换&#xff0c;可轻松搭建外贸网站。W…

torchEEG工具箱

文章信息: 题目&#xff1a;TorchEEGEMO&#xff1a;基于脑电图的情绪识别深度学习工具箱 期刊&#xff1a;Expert Systems with Applications 环境&#xff1a;pytorch 1.11.0 CUDA 11.3 摘要&#xff1a; ​ 一个python工具箱TorchEEG&#xff0c;将工作流程分为五个模块…

学习STM32第十六天

RTC实时时钟 一、简介 RTC是一个独立的BCD格式定时器&#xff0c;提供一个时钟日历&#xff0c;两个可编程报警中断&#xff0c;一个具有中断功能周期性可编程唤醒标志&#xff0c;RTC和时钟配置系统处于后备区域。 通过两个32位寄存器以BCD格式实现秒、分钟、小时&#xff08…

OKCC搭建配置什么样的服务器合适

OKCC呼叫中心系统是一种采用软硬件结合的架构方式、及分布式的IP技术&#xff0c;从多角度为企业提供整合的一体化解决方案。因此&#xff0c;搭建OKCC呼叫中心系统所使用的服务器应该满足以下几点要求&#xff1a; 稳定性&#xff1a;服务器需要具有较高的稳定性和可靠性&…

STM32之不使用MicroLIB

一、microlib介绍 microlib 是缺省 C 库的备选库,功能上不具备某些 ISO C 特性。 microlib 进行了高度优化以使代码变得很小,功能比缺省 C 库少,用于必须在极少量内存环境下运行的深层嵌入式应用程序。 二、不使用microlib的原因 由于microlib不支持C++开发,因此在使用C…

element plus el-date-picker type=“datetime“ 限制年月日 时分秒选择

如何限制el-date-picker组件的时分秒选中&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 文档 文档在这里&#xff1a;DateTimePicker 日期时间选择器 | Element Plus 它提供的disabled-date给我们来限制日期选择 nice&#xff01;&…

2024年3月洗衣机大家电线上电商(京东天猫淘宝)销量排行榜

鲸参谋监测的线上电商&#xff08;京东天猫淘宝&#xff09;平台3月份的洗衣机大家电销售数据已出炉&#xff01; 根据鲸参谋数据显示&#xff0c;今年3月份&#xff0c;线上电商平台洗衣机的销量累计约224万件&#xff0c;环比增长了29%&#xff0c;环比增长了约29%&#xff…

网络变压器在网络分析仪上能通过测试,装上设备后网速达不到呢?

Hqst华轩盛(石门盈盛)电子导读&#xff1a;今天和大家一起探讨网络变压器在网络分析仪上能通过测试&#xff0c;装上设备后网通设备网速达不到的可能原因及其处理方式 一、出现这种情况可能有以下原因&#xff1a; 1.1. 设备兼容性问题&#xff1a;设备其它元器件与 网络…

MATLAB绘制复杂分段函数图像

MATLAB绘制复杂分段函数图像 clc;close all;clear all;warning off;%清除变量 rand(seed, 200); randn(seed, 200) % 定义 x 范围和分辨率 x linspace(-2, 2, 1000); % 初始化 y 数组 y zeros(size(x)); % 分段定义函数 y(x < 0) x(x < 0).^2; y(x > 0 …

使用Termux在Android设备上编译运行SpecCPU2006

Spec CPU 2006 的使用说明&#xff08;曲线救国版&#xff09; 因本部分实验用到的Spec CPU2006依赖于多个编译工具包&#xff0c;因此对源码的编译要在配置好环境的Linux设备上运行&#xff0c;根据实验发现&#xff0c;现有的环境&#xff08;包括adb和termux&#xff09;都不…

FreeRTOS之动态创建任务与删除任务

1.本文是利用FreeRTOS来动态创建任务和删除任务。主要是使用FreeRTOS的两个API函数&#xff1a;xTaskCreate()和vTaskDelete()。 任务1和任务2是让LED0、LED1闪烁。任务3是当按键按下时删除任务1。 使用动态创建任务时&#xff0c;需要动态的堆中申请任务所需的内存空间&…

Flask实战

from flask import Flask appFlask(__name__)点击Flask同时点击键盘ctrl即可查看Flask的默认初始化函数 def __init__(self,import_name: str,static_url_path: str | None None,static_folder: str | os.PathLike[str] | None "static",static_host: str | None …

安装docker的PHP环境NLMP环境在国产deepin操作系统上

1: 先安装docker 安装完后执行,权限设置 sudo usermod -aG docker $USER或者sudo usermod -aG docker kentrl#添加当前用户到Docker用户组中 sudo newgrp docker#更新用户组数据,必须执行否则无效 sudo systemctl restart docker 先看目录结构: 2:按照目录结构挂载磁盘,…

JavaScript(五)-正则表达式

文章目录 正则表达式正则表达式的介绍语法元字符修饰符 正则表达式 正则表达式的介绍 什么是正则表达式 正则表达式&#xff08;Regular expression&#xff09;是用于匹配字符串中字符组合的模式&#xff0c;在JavaScript中&#xff0c;正则表达式也是对象通常用来查找、替…

UE5数字孪生系列笔记(四)

场景的切换 创建一个按钮的用户界面UMG 创建一个Actor&#xff0c;然后将此按钮UMG添加到组件Actor中 调节几个全屏的背景 运行结果 目标点切换功能制作 设置角色到这个按钮的位置效果 按钮被点击就进行跳转 多个地点的切换与旋转 将之前的目标点切换逻辑替换成旋转的逻…

气象观测站点数据下载与处理

一、下载途径 全国400多个气象站气候数据&#xff08;1942-2022&#xff09; 王晓磊&#xff1a;中国空气质量/气象历史数据 | 北京市空气质量历史数据 气象数据免费下载网站整理 中国气象站观测的气象数据怎么下载 二、R语言处理 2.1 提取站点文件 library(dplyr) library(…

集成智能楼宇的微网系统多时间尺度MPC调度方法(附带Matlab代码)

含多智能楼宇的微网示意图如图所示&#xff0c;包括多个智能楼宇、微网可控分布式电源 、储能系统以及通信链路。其中&#xff0c;每个智能楼宇系统包括制冷设备、常规用电设备以及屋顶光伏系统。各单元功能介绍如下 针对含多智能楼宇的微网系统&#xff0c;提出一种基于模型预…

gpt能生成ppt吗

gpt能生成ppt吗 GPT是一个高度通用的工具&#xff0c;适用于多种场景和领域&#xff0c;制作ppt只是它强大功能的冰山一角&#xff0c;具体包括&#xff1a; 信息查询与解释&#xff1a; 提供科学、技术、历史、文化等领域的详细解释和背景信息。 解答疑问&#xff0c;帮助…