MyBatis-Plus模块扩展分页查询

文章目录

    • 1.说明
    • 2.common-mybatis-plus-starter
        • 1.目录结构
        • 2.MybatisPLusAutoConfiguration.java 添加MyBatis Plus分页插件
        • 3.PlusPageResult.java MyBatis Plus 分页对象的增强版
        • 4.SunPlusPageHelper.java 分页工具类
    • 3.EasyCode模板修改
    • 4.common-mybatis-plus-starter-demo 分页代码说明
        • 1.ExampleTableController.java
        • 2.ExampleTableService.java
        • 3.ExampleTableServiceImpl.java
        • 4.ExampleTableMapper.java
        • 5.ExampleTableMapper.xml

1.说明

  1. 对MyBatisPlus的分页插件进行扩展,并且实现一行调用分页
  2. 对EasyCode模板进行升级

2.common-mybatis-plus-starter

1.目录结构

CleanShot 2025-01-26 at 13.41.08@2x

2.MybatisPLusAutoConfiguration.java 添加MyBatis Plus分页插件
/*** 添加MyBatis Plus分页插件*/
@Bean
@ConditionalOnMissingBean
public MybatisPlusInterceptor mybatisPlusInterceptor() {log.info("MybatisPlusInterceptor.PaginationInnerInterceptor 注入成功!");MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 如果配置多个插件, 切记分页最后添加interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;
}
3.PlusPageResult.java MyBatis Plus 分页对象的增强版
package cn.sunxiansheng.mybatis.plus.page.plus;import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import lombok.*;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** PlusPageResult 是 MyBatis Plus 分页对象的增强版。* <p>* 此类扩展了分页功能,兼容 MyBatis Plus 的 {@link IPage} 接口,并添加了额外的元数据字段,* 如总页数、起始和结束位置、是否有上一页/下一页等。* </p>** @param <T> 分页中记录的类型* @Author sun* @Create 2025/1/26 09:57* @Version 2.0*/
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class PlusPageResult<T> implements IPage<T> {private static final long serialVersionUID = 1L;/*** 当前页码,从 1 开始*/private long current = 1;/*** 每页显示的记录数*/private long size = 10;/*** 总记录条数*/private long total = 0;/*** 当前页的记录列表*/private List<T> records = new ArrayList<>();/*** 排序信息列表*/private List<OrderItem> orders = new ArrayList<>();/*** 当前页的起始记录位置*/private long start;/*** 当前页的结束记录位置*/private long end;/*** 总页数*/private long totalPages;/*** 是否有下一页*/private boolean hasNextPage;/*** 是否有上一页*/private boolean hasPreviousPage;/*** 自定义构造器。** @param current 当前页码* @param size    每页显示的记录数* @param total   总记录条数* @param records 当前页的记录列表*/public PlusPageResult(long current, long size, long total, List<T> records) {this.current = current;this.size = size;this.total = total;this.records = records != null ? records : Collections.emptyList();calculateMetaData();}// ========== IPage 接口方法实现 ==========/*** 获取当前页的记录列表。** @return 当前页的记录列表*/@Overridepublic List<T> getRecords() {return records;}/*** 设置当前页的记录列表。** @param records 当前页的记录列表* @return 当前分页对象*/@Overridepublic IPage<T> setRecords(List<T> records) {this.records = records;return this;}/*** 获取总记录条数。** @return 总记录条数*/@Overridepublic long getTotal() {return total;}/*** 设置总记录条数。** @param total 总记录条数* @return 当前分页对象*/@Overridepublic IPage<T> setTotal(long total) {this.total = total;calculateMetaData();return this;}/*** 获取每页显示的记录数。** @return 每页显示的记录数*/@Overridepublic long getSize() {return size;}/*** 设置每页显示的记录数。** @param size 每页显示的记录数* @return 当前分页对象*/@Overridepublic IPage<T> setSize(long size) {this.size = size;calculateMetaData();return this;}/*** 获取当前页码。** @return 当前页码*/@Overridepublic long getCurrent() {return current;}/*** 设置当前页码。** @param current 当前页码* @return 当前分页对象*/@Overridepublic IPage<T> setCurrent(long current) {this.current = current;calculateMetaData();return this;}/*** 获取排序信息列表。** @return 排序信息列表*/@Overridepublic List<OrderItem> orders() {return orders;}// ========== 功能扩展 ==========/*** 计算分页的元数据信息,包括总页数、起始/结束位置,以及是否有上一页和下一页。*/private void calculateMetaData() {// 计算总页数if (size > 0) {this.totalPages = (total / size) + (total % size == 0 ? 0 : 1);} else {this.totalPages = 0;}// 计算起始和结束位置if (size > 0) {this.start = (current - 1) * size + 1;this.end = Math.min(current * size, total);} else {this.start = 1;this.end = total;}// 是否有上一页和下一页this.hasPreviousPage = current > 1;this.hasNextPage = current < totalPages;}
}
4.SunPlusPageHelper.java 分页工具类
package cn.sunxiansheng.mybatis.plus.page.plus;import java.util.function.Function;/*** SunPlusPageHelper 是一个 MyBatis Plus 分页工具类。* <p>* 提供静态方法简化分页查询的逻辑,用户可以通过提供查询逻辑的函数来完成分页数据的获取。* </p>** @Author sun* @Create 2025/1/26 12:11* @Version 1.0*/
public class SunPlusPageHelper {/*** 执行分页查询。* <p>* 此方法通过创建一个 {@link PlusPageResult} 分页对象并传递给查询函数,返回查询结果。* </p>** @param current  当前页码,从 1 开始* @param pageSize 每页显示的记录数* @param clazz    分页对象中的记录类型的 {@link Class} 类型* @param function 分页查询的函数,接收 {@link PlusPageResult} 参数并返回查询结果* @param <T>      分页记录的类型* @return 包含分页结果的 {@link PlusPageResult} 对象*/public static <T> PlusPageResult<T> paginate(long current, long pageSize, Class<T> clazz, Function<PlusPageResult<T>, PlusPageResult<T>> function) {// 创建分页对象PlusPageResult<T> pageResult = (PlusPageResult<T>) new PlusPageResult<T>().setCurrent(current).setSize(pageSize);// 使用分页对象作为参数进行分页查询并返回查询结果return function.apply(pageResult);}
}

3.EasyCode模板修改

CleanShot 2025-01-26 at 14.52.33@2x

4.common-mybatis-plus-starter-demo 分页代码说明

1.ExampleTableController.java
/*** 分页查询数据。** @param exampleTableReq 分页查询请求对象* @return 分页查询结果封装*/
@GetMapping("/queryPage")
public PlusPageResult<ExampleTableVo> queryPage(@RequestBody ExampleTableReq exampleTableReq) {// ============================== 参数校验 ==============================// 可以添加必要的参数校验逻辑// ============================== 调用Service层 ==============================return exampleTableService.queryPage(exampleTableReq);
}
2.ExampleTableService.java
package cn.sunxiansheng.mybatis.plus.service;import cn.sunxiansheng.mybatis.plus.base.service.SunRaysBaseService;
import cn.sunxiansheng.mybatis.plus.entity.po.ExampleTable;
import cn.sunxiansheng.mybatis.plus.entity.req.ExampleTableReq;
import cn.sunxiansheng.mybatis.plus.entity.vo.ExampleTableVo;
import cn.sunxiansheng.mybatis.plus.page.plus.PlusPageResult;/*** 示例表(ExampleTable)Service接口:定义业务逻辑** @author sun* @since 2025-01-26 14:33:02*/
public interface ExampleTableService extends SunRaysBaseService<ExampleTable, java.lang.Integer> {/*** 使用MyBatis Plus 的分页插件进行分页查询** @param exampleTableReq 请求参数,需要携带pageNo和pageSize* @return 返回vo的PlusPageResult*/PlusPageResult<ExampleTableVo> queryPage(ExampleTableReq exampleTableReq);
}
3.ExampleTableServiceImpl.java
@Override
@Transactional(rollbackFor = Exception.class) // 开启事务
public PlusPageResult<ExampleTableVo> queryPage(ExampleTableReq exampleTableReq) {// 将req转换为poExampleTable po = ExampleTableConverter.INSTANCE.convertReq2Po(exampleTableReq);// 分页查询PlusPageResult<ExampleTable> poPageResult = SunPlusPageHelper.paginate(exampleTableReq.getPageNo(),exampleTableReq.getPageSize(),ExampleTable.class,(plusPageResult) -> {// 这里会给出已经封装好的page对象,开发者必须携带!后面的参数就是查询的条件,可自定义return exampleTableMapper.queryPage(plusPageResult, po);});// 将po转换为vo并返回return ExampleTableConverter.INSTANCE.convertPoPage2VoPage(poPageResult);
}
4.ExampleTableMapper.java
/*** MyBatisPlus 分页插件的分页查询** @param plusPageResult* @param po* @return*/
PlusPageResult<ExampleTable> queryPage(@Param("plusPageResult") PlusPageResult<ExampleTable> plusPageResult, @Param("po") ExampleTable po);
5.ExampleTableMapper.xml
<!-- MyBatisPlus 分页插件的分页查询 -->
<select id="queryPage" resultMap="ExampleTableMap">select id, user_name, user_email, phone_number, home_address, account_status, create_by, create_time, update_by,update_time, is_deletedfrom example_table<where><if test="po.id != null">and id = #{po.id}</if><if test="po.userName != null and po.userName != ''">and user_name = #{po.userName}</if><if test="po.userEmail != null and po.userEmail != ''">and user_email = #{po.userEmail}</if><if test="po.phoneNumber != null and po.phoneNumber != ''">and phone_number = #{po.phoneNumber}</if><if test="po.homeAddress != null and po.homeAddress != ''">and home_address = #{po.homeAddress}</if><if test="po.accountStatus != null">and account_status = #{po.accountStatus}</if><if test="po.createBy != null and po.createBy != ''">and create_by = #{po.createBy}</if><if test="po.createTime != null">and create_time = #{po.createTime}</if><if test="po.updateBy != null and po.updateBy != ''">and update_by = #{po.updateBy}</if><if test="po.updateTime != null">and update_time = #{po.updateTime}</if><if test="po.isDeleted != null">and is_deleted = #{po.isDeleted}</if>and is_deleted = 0</where>
</select>

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

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

相关文章

TestHubo基础教程-创建项目

TestHubo是一款国产开源一站式测试工具&#xff0c;涵盖功能测试、接口测试、性能测试&#xff0c;以及 Web 和 App 测试&#xff0c;可以满足不同类型项目的测试需求。本文将介绍如何快速创建第一个项目&#xff0c;以快速入门上手。 1、创建项目 在 TestHubo 中&#xff0c;…

Pythong 解决Pycharm 运行太慢

Pythong 解决Pycharm 运行太慢 官方给Pycharm自身占用的最大内存设低估了限制,我的Pycharm刚开始默认是256mb。 首先找到自己的Pycharm安装目录 根据合适自己的改 保存&#xff0c;重启Pycharm

【Cocos TypeScript 零基础 15.1】

目录 见缝插针UI脚本针脚本球脚本心得_旋转心得_更改父节点心得_缓动动画成品展示图 见缝插针 本人只是看了老师的大纲,中途不明白不会的时候再去看的视频 所以代码可能与老师代码有出入 SIKI_学院_点击跳转 UI脚本 import { _decorator, Camera, color, Component, directo…

docker部署单机版doris,完整无坑

文章目录 一、部署1、修改内核参数2、下载Docker 开发环境镜像3、下载安装包4、启动镜像5、配置fe6、配置be7、远程连接 二、运维命令参考资料 一、部署 1、修改内核参数 在启动doris的be时&#xff0c;需要将 Linux 操作系统的内核参数设置为2000000&#xff0c;这里是Doris…

docker 进阶命令(基于Ubuntu)

数据卷 Volume: 目录映射, 目录挂载 匿名绑定: 匿名绑定的 volume 在容器删除的时候, 数据卷也会被删除, 匿名绑定是不能做到持久化的, 地址一般是 /var/lib/docker/volumes/xxxxx/_data 绑定卷时修改宿主机的目录或文件, 容器内的数据也会同步修改, 反之亦然 # 查看所有 vo…

指针复习 ( 下 )

这是指针复习的第二篇&#xff0c;主要介绍指针与数组、函数的应用。 一、指针与数组 1.1 数组名的理解 在说明指针与数组的关系之前&#xff0c;我们必须要先了解「数组名」的意义 我们在指针复习 ( 下 ) 中&#xff0c;指针整数的部份有写过下面这段代码 int arr[10] {1,…

ElementUI 的组件 Switch(开关)如何让文字显示在按钮上

效果图&#xff1a; 一、引入switch组件 给组件自定义一个类&#xff1a;tableScopeSwitch&#xff0c;设置开关的值和对应展示的文字&#xff08;开为 1&#xff0c;并展示启用&#xff1b;关为 0&#xff0c;并展示禁用&#xff09;。 <div class"tableScopeSwitch…

Linux---系统函数

一、打开文件open #include <fcntl.h> int open(const char *pathname&#xff0c;int flags); int open(const char *pathname&#xff0c;int flags&#xff0c;mode_t mode); 功能: 打开或创建文件 参数: pathname //打开的文件名 flags //操作的标志…

智能编程助手功能革新与价值重塑之:GitHub Copilot

引言&#xff1a; GitHub Copilot 的最新更新为开发者带来了显著变化&#xff0c;其中 Agent Mode 功能尤为引人注目。该模式能够自动识别并修复代码错误、自动生成终端命令&#xff0c;并具备多级任务推理能力&#xff0c;这使得开发者在开发复杂功能时&#xff0c;可大幅减少…

Elasticsearch+Logstash+Kibana可视化集群部署

文章目录 1.组件介绍简述2.集群规划3.Es组件部署4.Logstash组件部署5.Kibana组件部署6.Kibana的基础使用 1.组件介绍简述 Elasticsearch&#xff1a;开源实时分布式搜索和分析引擎&#xff0c;支持大规模数据存储和高吞吐量&#xff0c;提供丰富的搜索功能和可扩展性。 Logsta…

SpringBoot多数据源实践:基于场景的构建、实现和事务一体化研究

1. 多数据源应用场景剖析 1.1 业务驱动的多数据源需求 数据量与业务复杂度引发的分库分表&#xff1a;在现代企业级应用中&#xff0c;随着业务的不断拓展和用户量的持续增长&#xff0c;数据量呈爆炸式增长。例如&#xff0c;在大型电商平台中&#xff0c;用户数据、订单数据…

LabVIEW 中dde.llbDDE 通信功能

在 LabVIEW 功能体系中&#xff0c;位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\dde.llb 的 dde.llb 库占据着重要的地位。作为一个与动态数据交换&#xff08;DDE&#xff09;紧密相关的库文件&#xff0c;它为 LabVIEW 用户提供了与其他…

数据结构-栈和队列的应用

目录 前言一、栈的应用&#xff08;迷宫问题&#xff09;1.1 问题描述1.2 算法选择1.3 算法精化1.4 算法实现1.5 问题结果 二、队列的应用&#xff08;农夫过河问题&#xff09;2.1 问题描述2.2 算法选择2.3 算法精化2.4 算法实现2.5 问题结果 总结 前言 本篇文章使用两个例子…

SkyWalking 10.1.0 实战:从零构建全链路监控,解锁微服务性能优化新境界

文章目录 前言一、集成SkyWalking二、SkyWalking使用三、SkyWalking性能剖析四、SkyWalking 告警推送4.1 配置告警规则4.2 配置告警通知地址4.3 下发告警信息4.4 测试告警4.5 慢SQL查询 总结 前言 在传统监控系统中&#xff0c;我们通过进程监控和日志分析来发现系统问题&…

AIGC图生视频保姆级教程

一、AI文生图高阶技巧 推荐工具 ▸ MidJourney&#xff08;艺术感最强&#xff09; ▸ DALLE 3&#xff08;与ChatGPT深度联动&#xff09; ▸ Leonardo.ai&#xff08;精细化参数控制&#xff09; 核心策略 提示词架构&#xff1a; [主体描述][环境氛围][镜头语言][风格参数…

springboot整合mybatis-plus【详细版】

目录 一&#xff0c;简介 1. 什么是mybatis-plus2.mybatis-plus特点 二&#xff0c;搭建基本环境 1. 导入基本依赖&#xff1a;2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三&#xff0c;基本知识介绍 1. 基本注解 T…

利用亚马逊云科技RDS for SQL Server配置向量数据存储

生成式人工智能&#xff08;AI&#xff09;正迎来又一个快速发展期&#xff0c;引起了开发者们的广泛关注。将生成式能力集成到商业服务和解决方案中变得非常重要。当前的生成式AI解决方案是机器学习和深度学习模型逐步进化迭代的结果。从深度学习到生成式AI的质变飞跃主要是由…

c++ 多线程知识汇总

一、std::thread std::thread 是 C11 引入的标准库中的线程类&#xff0c;用于创建和管理线程 1. 带参数的构造函数 template <class F, class... Args> std::thread::thread(F&& f, Args&&... args);F&& f&#xff1a;线程要执行的函数&…

H5接入支付宝手机网站支付并实现

小程序文档 - 支付宝文档中心 1.登录 支付宝开放平台 创建 网页/移动应用 2.填写创建应用信息 3.配置开发设置 4.网页/移动应用&#xff1a;需要手动上线。提交审核后&#xff0c;预计 1 个工作日的审核时间。详细步骤可点击查看 上线应用 。应用上线后&#xff0c;还需要完成…

字节二面:DNS是什么?是什么原理?

写在前面 最近有个同学后台私信让我出一个DNS的工作原理&#xff0c;面试的时候居然问到了&#xff0c;所以就简单聊聊DNS的工作原理吧&#xff01; 1. DNS 的核心作用 DNS&#xff08;域名系统&#xff0c;Domain Name System&#xff09;是互联网中用于将人类可读的域名转…