Mybatis分页框架-PageHelper

Mybatis分页框架-PageHelper

  • 一、PageHelper基础使用
    • 1.引入jar包
    • 2.配置conifg
    • 3.测试使用
  • 二、PageHelper的多种用法
    • 1.使用PageHelper.startPage传入对象
    • 2.不使用PageHelper.startPage,而使用PageHelper.offsetPage
    • 3.使用Lambda进行分页
    • 4.不使用PageHelper直接分页
    • 5.想要使用分页接口查询全部数据
    • 6.输入异常页码,也支持分页

这篇文章用以总结PageHelper分页插件的使用,PageHelper是Mybatis的分页插件,他的实现原理是基于Mybatis的拦截器QueryInterceptor 来实现的,通过拦截sql查询,来对sql进行增强改造,其实这种思想比比皆是。比如MP的分页插件也是这种思想,比如各种组件里的Interceptor也都是这种思想。这里总结下常用的用法。

一、PageHelper基础使用

java里常用的分页组件都是物理分页,基本没有逻辑分页。PageHelper也是物理分页插件。物理分页就是使用sql直接对数据进行分页处理,逻辑分页时数据全部查出来,然后再进行分页,这样再数据量大时,内容根本扛不住(除非系统比较小)。所以真正使用时都是使用PageHelper这种物理分页插件

1.引入jar包

没啥好说的,使用maven进行引入jar包,官方文档推荐使用最新版jar包,这里可以通过官网看看最新版是多少,如下图:
文章写作时间:2023-09-22
PageHelper最新版本:5.3.3
官网地址: PageHelper官网
本文使用Springboot版本:2.4.4
在这里插入图片描述

        <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.3</version><!-- 分页插件只会在编译期有用,这里可以声明为compile --><scope>compile</scope></dependency>

2.配置conifg

使用PageHelper必须配置他的分页拦截器PageInterceptor,这个分页拦截器正是使用PageHelper实现分页的关键。最主要的一点是需要我们指定数据库的方言(通俗说就是数据库的类型),因为不同数据库的分页实现是不同的,所以我们需要指明数据库这样PageHelper才可以帮助我们进行动态调整SQL。他具有以下配置项。
注意:如果不配置这个官方文档说也可以自己识别数据库方言,但笔者不配置时发现分页无法生效,验证了5.3.3 和 5.1.11 两个版本都是无法正常分页的,所以还是加上这个配置最好

import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
import java.util.Properties;/*** @author pcc* 这是分页插件PageHelper的配置信息* 使用PageHelper的原因是MP的分页对于多表分页查询和自定义查询的分页支持不够优秀*/
@Configuration
public class PageHelperConfig {/*** 可能存在多个连接工厂,是允许这么注入的*/@Resourceprivate List<SqlSessionFactory> sqlSessionFactoryList;@PostConstructpublic void initConfig(){PageInterceptor pageInterceptor = new PageInterceptor();Properties properties = new Properties();// 设置数据源方言,使用mysqlproperties.setProperty("helperDialect","mysql");pageInterceptor.setProperties(properties);sqlSessionFactoryList.forEach(factory ->factory.getConfiguration().addInterceptor(pageInterceptor));}
}

以上就完成了所有配置了,其实非常简单易用。

3.测试使用

使用其实也很简单,不过需要注意以下两点:

    1. 只有紧跟在PageHelper.startPage方法后的第一个Mybatis的查询(Select)方法会被分页。
    1. 不支持带有for update语句的分页
    1. 使用下面这种分页方式,查询方法返回结果必须是List<T>,因为PageHelper分页返回的对象是ArrayList类型的Page

下面是分页的代码:

    /*** 使用 PageHelper进行分页* @param tbTaskItemsVO 入参* @return 返回*/@PostMapping("/getTaskItemsPage2")public PageInfo<TbTaskItems> getTaskItems2(TbTaskItemsVO tbTaskItemsVO){PageHelper.startPage(tbTaskItemsVO.getPageNum(),tbTaskItemsVO.getPageSize());List<TbTaskItems> itemsList = iTbTaskItemsService.queryItems();PageInfo<TbTaskItems> pageInfo = new PageInfo<>(itemsList);return pageInfo;}

上面代码就可以正常实现分页了:
在这里插入图片描述
可以看到我们分页的关键信息都是正确的了,使用起来很简单,不过还是有几点需要说明下:

  • 1.PageHelper.startPage 传入的是pageNum,pageSize
  • 2.查询方法(这里是iTbTaskItemsService.queryItems)返回类型必须是ArrayList<T>或他的父类,这里虽然是使用List接收的返回值,看着和原方法没有区别,其实这里的iTbTaskItemsService.queryItems返回参数其实是Page,因为Page是ArrayList的子类所以可以这么写,所以我们方法定义时需要定义返回类型是ArrayList或者他的父类。

二、PageHelper的多种用法

实际工作场景中基本都是使用第一节中的用法就完全足够了,这里做下扩展,说下PageHelper的其他常用写法。下面前几种是比较常用的写法,除了这几种以外还可以支持传入RowBound,或者写查询方法声明分页参数,不过这两种不常用就不说了,感兴趣可以看官方文档:
PageHelper官方文档

1.使用PageHelper.startPage传入对象

这里使用和第一种区别不大,传入对象是第一种的重载方法,传入的对象就一个要求必须有pageNum、pageSize两个参数,且不能为空,这样也可以正常分页。

// 对于上面的写法就动如下代码即可:
PageHelper.startPage(tbTaskItemsVO);

2.不使用PageHelper.startPage,而使用PageHelper.offsetPage

这种写法和上面PageHelper.startPage(offSet,limit)的意义是从offSet的下标开始取数,取limit条数据,这种分页还得我们计算,比第一种稍微麻烦一些。

PageHelper.startPage(pageNum*PageSize,PageSize);

3.使用Lambda进行分页

PageHelper还支持Java8的lambda的写法,只要支持Java8肯定也支持匿名内部类的写法,这里就只展示Java8的写法了,Java7没有什么区别了

    /*** 使用 PageHelper进行分页* @param tbTaskItemsVO 入参* @return 返回*/@PostMapping("/getTaskItemsPage2")public PageInfo<TbTaskItems> getTaskItems2(TbTaskItemsVO tbTaskItemsVO){PageInfo<TbTaskItems> objectPageInfo = PageHelper.startPage(tbTaskItemsVO).doSelectPageInfo(() -> {iTbTaskItemsService.queryItems();});return objectPageInfo;}

4.不使用PageHelper直接分页

这种写法需要增加一个PageInterceptor的配置项,才可以支持,默认是不支持的,这种写法最简单,会让写代码的看不到分页的任何痕迹,但是这样反而不好,容易让人忽略,但是这种写法最简洁。

  • 1.新增配置项
// 配置supportMethodsArguments=true
// 分页插件会从查询方法的参数值中寻找pageNum,pageSize进行分页,找到就可以进行分页
import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;
import java.util.Properties;/*** @author pcc* 这是分页插件PageHelper的配置信息* 使用PageHelper的原因是MP的分页对于多表分页查询和自定义查询的分页支持不够优秀*/
@Configuration
public class PageHelperConfig {/*** 可能存在多个连接工厂,是允许这么注入的*/@Resourceprivate List<SqlSessionFactory> sqlSessionFactoryList;@PostConstructpublic void initConfig(){PageInterceptor pageInterceptor = new PageInterceptor();Properties properties = new Properties();// 设置数据源方言,使用mysqlproperties.setProperty("helperDialect","mysql");// 支持自动分页,需要保证查询方法的对象中必须含有pageNum,pageSizeproperties.setProperty("supportMethodsArguments","true");pageInterceptor.setProperties(properties);sqlSessionFactoryList.forEach(factory ->factory.getConfiguration().addInterceptor(pageInterceptor));}
}
  • 2.查询方法需要修改为传递对象或者Map也是可以的,不过都必须含有pageNum,pageSize才可以。
    /*** 使用 PageHelper进行分页* @param tbTaskItemsVO 入参* @return 返回*/@PostMapping("/getTaskItemsPage2")public PageInfo<TbTaskItems> getTaskItems2(TbTaskItemsVO tbTaskItemsVO){List<TbTaskItems> itemsList = iTbTaskItemsService.queryItems(tbTaskItemsVO);PageInfo<TbTaskItems> pageInfo = new PageInfo<>(itemsList);return pageInfo;}

5.想要使用分页接口查询全部数据

需要新增一个配置参数:pageSizeZero=true,配置这个参数后如果想要查询全部数据,只需要传递pageSize=0,就会默认查询全部数据,不过返回的还是Page信息。

// 只展示配置信息
public void initConfig(){PageInterceptor pageInterceptor = new PageInterceptor();Properties properties = new Properties();// 设置数据源方言,使用mysqlproperties.setProperty("helperDialect","mysql");// 支持自动分页,需要保证查询方法的对象中必须含有pageNum,pageSizeproperties.setProperty("supportMethodsArguments","true");// 支持查询全部信息properties.setProperty("pageSizeZero","true");pageInterceptor.setProperties(properties);sqlSessionFactoryList.forEach(factory ->factory.getConfiguration().addInterceptor(pageInterceptor));}

其他使用则没有区别了,就不重复举例了

6.输入异常页码,也支持分页

当输入异常页码也可以支持进行分页,需要增加配置:reasonable=true,当增加这个配置后,当pageNum<=0时,会查询第一页,pageNum>最大页,会查询最后一页。当然pageSize必须有值。

// 只展示配置信息
public void initConfig(){PageInterceptor pageInterceptor = new PageInterceptor();Properties properties = new Properties();// 设置数据源方言,使用mysqlproperties.setProperty("helperDialect","mysql");// 支持自动分页,需要保证查询方法的对象中必须含有pageNum,pageSizeproperties.setProperty("supportMethodsArguments","true");// 支持查询全部信息properties.setProperty("pageSizeZero","true");// 支持异常页码查询properties.setProperty("reasonable","true");pageInterceptor.setProperties(properties);sqlSessionFactoryList.forEach(factory ->factory.getConfiguration().addInterceptor(pageInterceptor));}

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

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

相关文章

Google拟放弃博通自行研发AI芯片 | 百能云芯

谷歌计划自行研发人工智能&#xff08;AI&#xff09;芯片&#xff0c;考虑将博通&#xff08;Broadcom&#xff09;从其供应商名单中剔除&#xff0c;但谷歌强调双方的合作关系不会受到影响。 根据美国网络媒体《The Information》的报道&#xff0c;谷歌高层正在讨论可能在20…

【计算机网络】图解路由器(二)

本系列包含&#xff1a; 图解路由器&#xff08;一&#xff09;图解路由器&#xff08;二&#xff09; 图解路由器&#xff08;二&#xff09; 21、什么是静态路由&#xff1f;22、什么是动态路由&#xff1f;23、动态路由有哪些类型&#xff1f;24、什么是 RIP &#xff1f;2…

Python教程(14)——Python函数的入门学习

函数是什么&#xff1f;在编程中&#xff0c;函数是一段可重用的代码块&#xff0c;用于完成特定任务或执行特定操作。它可以接输入参数并返回一个值或执行一系列操作。函数可以帮助程序员将代码模块化&#xff0c;提高代码的可读性和可维护性。 函数通常包括以下组成部分&…

排序算法之归并排序

一、归并排序的形象理解 原题链接 示例代码 void merge_sort(int q[], int l, int r) {if (l > r) return;int mid l r >> 1;merge_sort(q, l, mid), merge_sort(q, mid 1, r);int k 0, i l, j mid 1;while (i < mid && j < r) //第一处if (q[i]…

003 linux 自动化构建工具-make/makefile

前言 本文将会向您介绍make/makefile的原理与操作 引入 首先先向您介绍linux的编译器gcc的编译过程&#xff1a; 预处理 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。 预处理指令是以#号开头的代码行。 实例: gcc –E hello.c –o hello.i 选项“-E”,该选项的作…

iOS线上闪退问题解决方案

iOS线上闪退问题的收集工具是关键&#xff0c;它们可以帮助你及时发现和解决应用程序中的崩溃问题。以下是一些常用的iOS线上闪退问题收集工具及其使用方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

3.wifi开发,网络编程

网络协议栈LwIP WiFi UDP Clinet编程 WiFi UDP Server编程 WiFi TCP Client编程 WiFi TCP Server编程 一。LWIP原理介绍&#xff0c;API介绍&#xff0c;文件结构 1.Lwip支持的协议 2.API 3.文件结构 1.api目录&#xff1a;应用程序接口文件。 2.arch目录&#xff1a;与硬件和…

机器学习笔记:Huber Loss

1 介绍 Huber Loss是回归问题中的一种损失函数&#xff0c;它结合了均方误差MSE和绝对误差MAE的特点。 Huber Loss在误差较小的时候是平方损失&#xff0c;而在误差较大的时候是线性损失。因此&#xff0c;它在处理有噪声的数据时&#xff0c;尤其是存在离群点的情况下&#x…

nginx反向代理vue项目

文章目录 前言一、创建站点1.添加站点2.添加ssl证书 二、反向代理vue项目1.添加反向代理2.更改vue项目配置3.修改反向代理配置 前言 项目描述&#xff1a;前端vue项目、后端Java项目、首页WordPress项目 客户要求&#xff1a;使用宝塔进行部署 需求描述&#xff1a;客户只有一…

一文彻底理解synchronized(通俗易懂的synchronized)

目录 一、什么是synchronized 二、synchronized的四种用法 2.1、修饰一个代码块 2.2、修饰一个方法 2.3、修饰一个静态的方法 2.4、修饰一个类 三、使用案例分析 3.1、修饰一个代码块 3.2、修饰一个方法 3.3、修饰一个静态的方法 3.4、修饰一个类 3.5 经典用法&…

蓝桥杯 题库 简单 每日十题 day8

01 扫雷 题目描述 在一个n行列的方格图上有一些位置有地雷&#xff0c;另外一些位置为空。 请为每个空位置标一个整数&#xff0c;表示周围八个相邻的方格中有多少个地雷。 输入描述 输入的第一行包含两个整数n&#xff0c;m。 第2行到第n1行每行包含m个整数&#xff0c;相邻整…

Winform直接与Wpf交互

Winform项目中&#xff0c;可以直接使用wpf中的自定义控件和窗体 测试环境&#xff1a; vistual studio 2017 window 10 一 winform直接使用wpf的自定义控件 步骤如下&#xff1a; 1 新建winfrom项目&#xff0c;名为WinFormDemo&#xff0c;默认有一个名为Form1的窗体…

关于表单快速开发低代码技术平台的内容介绍

运用什么样的表单快速开发软件平台可以实现高效率创收&#xff1f;随着科技的进步和飞速发展&#xff0c;专业的低代码技术平台已经走入了很多企业的办公职场中&#xff0c;它们灵活、轻量级、优质、高效、易维护等优势特点&#xff0c;可以高效助力广大企业提质增效&#xff0…

位移贴图的实现原理

在以前的文章中介绍过GLTF编辑器 &#xff0c; 编辑器可以对模型的各种材质纹理进行编辑修改&#xff0c;但是有一些新手用户可能对这些材质纹理不太了解&#xff0c;所以我收集了一些资料对这些材质纹理做一下详细的介绍&#xff0c;今天这篇文章主要是介绍位移贴图。 1、什么…

stm32之智能垃圾桶实战

之前用过51做过一个垃圾桶的小项目&#xff0c;这里用32重新搞了一下。视频的效果和之前一样&#xff0c;可参考这个垃圾桶效果 。 一、项目描述&#xff08;同51&#xff09; 项目主要是模拟不用手动打开垃圾桶盖&#xff0c;而进行自动操作。自动打开的条件如下&#xff1a…

【二叉树魔法:链式结构与递归的纠缠】

本章重点 二叉树的链式存储二叉树链式结构的实现二叉树的遍历二叉树的节点个数以及高度二叉树的创建和销毁二叉树的优先遍历和广度优先遍历二叉树基础oj练习 1.二叉树的链式存储 二叉树的链式存储结构是指&#xff0c;用链表来表示一棵二叉树&#xff0c;即用链来指示元素的逻辑…

点云从入门到精通技术详解100篇-单期点云的高斯曲率定位桥梁潜在损伤技术研究

目录 前言 国内外研究现状 三维激光扫描对桥梁损伤检测的研究现状 基于点云高斯曲率损伤检测的研究现状 柱体偏差检测技术研究现状 存在的问题 法向量约束高斯曲率的 TLS 桥面潜在损伤区域探测 2.1 高斯曲率探伤的基本理论 2.2 点云拓扑关系建立的方法比较 2.2.1 KD-…

社区分享|MeterSphere变身“啄木鸟”,助力云帐房落地接口自动化测试

云帐房网络科技有限公司&#xff08;以下简称为“云帐房”&#xff09;成立于2015年3月&#xff0c;以“成为最值得信赖的税务智能公司”为愿景&#xff0c;运用人工智能、大数据等互联网技术&#xff0c;结合深厚的财税行业服务经验&#xff0c;为代账公司和中大型企业提供智能…

【2023年中国研究生数学建模竞赛华为杯】E题 出血性脑卒中临床智能诊疗建模 问题分析、数学模型及代码实现

【2023年中国研究生数学建模竞赛华为杯】E题 出血性脑卒中临床智能诊疗建模 1 题目 1.1 背景介绍 出血性脑卒中指非外伤性脑实质内血管破裂引起的脑出血&#xff0c;占全部脑卒中发病率的10-15%。其病因复杂&#xff0c;通常因脑动脉瘤破裂、脑动脉异常等因素&#xff0c;导致…

黑马JVM总结(十九)

&#xff08;1&#xff09;GC调优1 通过官网查看查看JVM的参数&#xff1a; 可以使用java命令查看当前环境下的虚拟机参数&#xff1a; 学会使用一些工具如前面学的jmap &#xff0c;jconsole等等工具 &#xff08;2&#xff09;GC调优2 垃圾回收调优只是众多调优中的一个方…