编码技巧——Mybatis分页插件PageHelper使用

news2025/1/19 14:15:19

本篇介绍Mybatis分页插件PageHelper的使用,本质上是Mybatis拦截器起作用,在执行目标SQL之前添加count语句及拼接limit到目标SQL后面,这里不再赘述,Mybatis拦截器相关知识可参考Mybatis——拦截器Interceptor,本篇仅简单介绍如何让一个使用Mybatis+springboot的项目快速接入PageHelper;

背景:接到需求,需要对一个老工程新写几个分页查询及导出的接口;查看了这个工程的代码,发现历史的分页接口竟然是手动拼出来的,非常之丑陋,准备引入Mybatis自带的分页插件,顺带记录下遇到的问题和最终引入PageHelper的步骤;

遇到问题1:根据经验,只需要引入一个PageHelper的二方包,在springboot下,会自动注册Mybatis Interceptor并生效;发现SQL可以正常执行,但是分页参数都没有填充;所以问题应该是PageHelper并没有被正确的加入Mybatis拦截器列表,这一步可以通过打印原始的SQL来验证;

解决方案:继续引入pagehelper-spring-boot-starter并在配置类加载PageHelper的Bean;

遇到问题2:按照上述方案成功的引入了pagehelper,并且分页参数都被正常的填充;但是当把分页插件原生的com.github.pagehelper.Page<T>作为返参返回时,发现缺失了分页参数如total、pageNum、pageSize等;发现Page其实仅继承了java.util.ArrayList,因此序列化的时候会当做一个List处理,分页参数都缺失了;

解决方案:自己封装分页返参实体类;

总结下正确引入Mybatis分页插件PageHelper的姿势

(1)引入依赖

以下依赖建议放到dal模块:

        <!--pagehelper-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.2.0</version>
        </dependency>

以下依赖建议放到启动/配置boot模块

        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.12</version>
        </dependency>

(2)配置Bean

@Configuration
public class PageHelperConfig {

    @Bean
    public PageHelper pageHelper() {
        PageHelper pageHelper = new PageHelper();
        Properties properties = new Properties();
        properties.setProperty("offsetAsPageNum", "true");
        properties.setProperty("rowBoundsWithCount", "true");
        properties.setProperty("reasonable", "true");
        properties.setProperty("dialect", "mysql");
        pageHelper.setProperties(properties);
        return pageHelper;
    }
}

(3)封装返参

/**
 * @author Akira
 * @description 默认的分页查询的封装类
 */
@Data
public class DefaultPageDTO<T> {
    /**
     * 页码
     */
    private Integer pageNum;

    /**
     * 页面大小,默认size为10
     */
    private Integer pageSize;

    /**
     * 总数
     */
    private Long total;

    /**
     * 总页数
     */
    private Integer pages;

    /**
     * 查询记录列表
     */
    private List<T> records;

    /**
     * 将com.github.pagehelper.Page封装成能打印出分页参数的DefaultPageDTO
     *
     * @param page
     * @param <T,R>
     * @return
     */
    public static <T, R> DefaultPageDTO<R> init(Page<T> page, Function<T, R> converter) {
        DefaultPageDTO<R> defaultPageDTO = new DefaultPageDTO<>();
        defaultPageDTO.setPageNum(page.getPageNum());
        defaultPageDTO.setPages(page.getPages());
        defaultPageDTO.setTotal(page.getTotal());
        defaultPageDTO.setPageSize(page.getPageSize());
        if (page.getTotal() > 0) {
            defaultPageDTO.setRecords(page.getResult().stream().map(converter).collect(Collectors.toList()));
        }
        return defaultPageDTO;
    }

}

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

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

相关文章

12_AJAX

知识点1【定时器】&#xff08;重要&#xff09; 知识点2【日期Date对象】 知识点3【Math数学对象】&#xff08;了解&#xff09; ​编辑 知识点4【string对象】 indexof函数&#xff1a; substring()函数&#xff1a; 知识点5【全局函数】&#xff08;了解&#xff09; …

Android使用高德地图实现运动轨迹绘制和轨迹回放

功能的实现完全是使用高德地图进行实现的&#xff0c;先看一下效果图吧&#xff01; 下图是在绘制轨迹的过程&#xff1a; 下图是在轨迹回放的过程&#xff1a; 下图是记录运动的时间区间&#xff1a; 其实这个实现起来还是很容易的&#xff0c;总体逻辑就是&#xff1a;定位—…

Meter接口测试使用教程哪里找?

接口测试是测试工程师的必备技能之一&#xff0c;运用JMeter工具一步步实现接口请求&#xff0c;数据参数化&#xff0c;断言等操作&#xff0c;通过常见的企业实际测试场景详解JMeter各项技术使用&#xff0c;最后结合Jenkins持续集成实现企业级小程序接口自动化测试&#xff…

数据结构(6)树形结构——平衡二叉树(JAVA代码实现)

目录 6.1.概述 6.2.AVL树 6.2.1.概述 6.2.2.旋转 1.RR旋转 2.LL旋转 3.LR旋转 4.RL旋转 6.2.3.代码实现 6.1.概述 二叉搜索树存在一个问题&#xff0c;就是树的姿态和数据的插入顺序是有关系的&#xff0c;有时候树会变成某一边的子树高度过高&#xff0c;甚至直接退化成…

百度联合哈尔滨发布城市大模型“冰城-百度·文心”, 助力城市智能化建设

本文已在【飞桨PaddlePaddle】公众号平台发布&#xff0c;详情请戳链接&#xff1a;百度联合哈尔滨发布城市大模型“冰城-百度文心”&#xff0c; 助力城市智能化建设 近日&#xff0c;哈尔滨市人民政府与百度携手&#xff0c;联合发布面向城市领域的行业大模型——冰城-百度文…

PyTorch学习笔记-损失函数与反向传播

1. 损失函数 具有深度学习理论基础的同学对损失函数和反向传播一定不陌生&#xff0c;在此不详细展开理论介绍。损失函数是指用于计算标签值和预测值之间差异的函数&#xff0c;在机器学习过程中&#xff0c;有多种损失函数可供选择&#xff0c;典型的有距离向量&#xff0c;绝…

【Oracle系列4】Oracle 数据库的层次结构,常见的GUI连接用具

【Oracle系列4】Oracle 数据库的层次结构 跟mysql不一样&#xff0c;mysql连上后能看到所有库&#xff0c;库下面直接就是表了。 跟pgsql也不一样&#xff0c;pgsql连上后&#xff0c;也是可以看到所有库&#xff0c;库下面是schema&#xff0c;schema下面才是表&#xff08;…

G1D25-蜜汁APEX-RAGA代码运行友友第一次跑模型

一、APEX 英伟达开发的&#xff0c;压缩数据的框架 &#xff08;一&#xff09;安装bug 直接安装 https://blog.csdn.net/weixin_47658790/article/details/115055505 &#xff08;二&#xff09;运行bug 然后运行又出现了bug----------------------- IndexError: tuple …

沉睡者IT - 10个问题说清楚:什么是元宇宙?

欢迎关注沉睡者IT&#xff0c;点上面关注我 ↑ ↑ 人们对于元宇宙的构想十分多元且抽象&#xff0c;这十个问题将抽象的元宇宙具象化&#xff0c;帮助人们更好地理解。 一、什么是元宇宙&#xff1f; 1)元宇宙概念的提出 元宇宙在很长一段时间内仅存在于文学与影视作品中。…

一、spring框架的演变

1.微服务架构的演进过程 1.1 单体架构单机部署 1.运行在tomcat里面&#xff0c;并发量QPS一般在200多个请求左右&#xff0c;同一个jvm进程&#xff0c;直接import就行。 2.不同的功能模块可能只用文件夹区分。 3.缺点&#xff1a;并发量太小&#xff08;如果是电商系…

【pygame游戏】用Python实现一个蔡徐坤大战篮球的小游戏,可还行?【附源码】

Python制作坤坤打篮球小游戏序言准备工作开发环境效果预览开始界面游戏规则结束游戏代码实现序言 话说在前面&#xff0c;我不是小黑子~ 我是超级大黑子&#x1f60f; 表弟大周末的跑来我家&#xff0c;没事干天天骚扰我&#xff0c;搞得我都不能跟小姐姐好好聊天了&#xf…

【813. 最大平均值和的分组】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定数组 nums 和一个整数 k 。我们将给定的数组 nums 分成 最多 k 个相邻的非空子数组 。 分数 由每个子数组内的平均值的总和构成。 注意我们必须使用 nums 数组中的每一个数进行分组&#xff0c;…

3DMAX森林树木植物插Forest Pack Pro 预设库安装教程

Forest Pack是世界上最流行的3dMax森林树木植物散布插件。它提供了一个完整的解决方案来创建广阔的物体区域&#xff0c;从树木和植物到建筑物、人群、骨料、地面覆盖物、岩石等等。模拟大型场景总是非常困难&#xff0c;但这个插件可以帮助您以较少的难度进行模拟。 Forest P…

最近面试 Java 开发的感受:就以平时项目经验面试,通过估计很难

在上周&#xff0c;我密集面试了若干位 Java 后端的候选人&#xff0c;工作经验在 3 到 5 年间。我的标准其实不复杂&#xff1a;第一能干活&#xff0c;第二 Java 基础要好&#xff0c;第三最好熟悉些分布式框架&#xff0c;我相信其它公司招初级开发时&#xff0c;应该也照着…

CountDownLatch

目录 1 前言 2 常用方法 3 示例 4 解析 4.1 countDown() 4.2 await() 源码 1 前言 countDownLatch&#xff08; 门阀、 计数器&#xff09;是多线程控制的一种工具 &#xff0c;它用来协调各个线程之间的同步。 countDownLatch相当于一个计数器&#xff0c;能够使…

51单片机学习笔记3 C51数据类型及最小系统

51单片机学习笔记3 C51数据类型一、 C51数据类型1. 基本类型2. C51扩充数据类型3. C51运算量&#xff08;1&#xff09;常量&#xff08;2&#xff09;变量&#xff08;3&#xff09;位运算符&#xff08;4&#xff09;逗号运算符4. 数组二、51 最小系统构成1. 晶振电路2. 复位…

EIGRP_协议知识点

EIGRP协议一、汇总1.配置(接口下)2.修改AD值(全局下)二、Stub特性2.1实验配置:三、路由泄露四、控制路由更新工具-Distribute-list(分发列表)一、汇总 EIGRP的自动汇总&#xff1a;EIGRP自动汇总只能汇总本地产生的路由&#xff0c;不能汇总从邻居学习的路由&#xff0c;会自动…

聊聊雪花算法?

随便聊聊 哈喽&#xff0c;大家好&#xff0c;最近换了份工作&#xff0c;虽然后端技术栈是老了点&#xff0c;但是呢&#xff0c;这边的前端技术确是现在市面上最新的那一套技术&#xff1a;Vue3ViteTSXPinaElement-PlusNativeUI。我本人主要是学后端的&#xff0c;确被拉去做…

2022王道OS 1.2 操作系统的发展与分类

2022 王道OS 操作系统的发展与分类 文章目录2022 王道OS 操作系统的发展与分类知识总览OS的发展与分类手工操作阶段批处理阶段--单道批处理系统批处理阶段--多道批处理系统分时操作系统实时操作系统其他几种OS知识回顾与重要考点文章目录2022 王道OS 操作系统的发展与分类知识总…

【Android App】勾勒出三维立方体和球体以及它们的转动图形讲解及实战(附源码和演示视频 超详细)

需要源码或运行有问题请点赞关注收藏后评论区留言~~~ 一、轮廓勾勒 勾勒三维物体轮廓线条的步骤如下&#xff1a; &#xff08;1&#xff09;调用glEnableClientState方法启用顶点开关 &#xff08;2&#xff09;调用glVertexPointer方法指定三维物体的顶点坐标集合 &#…