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.hqwc.cn/news/115511.html

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

相关文章

Webpack使用plugin插件自动在打包目录生成html文件

我们使用html-webpack-plugin插件可以自动在打包代码目录生成html文件 使用步骤&#xff1a; 一、安装依赖 在控制台中输入如下代码&#xff1a; npm i -D html-webpack-plugin 二、在webpack.config.js中配置插件 const HTMLPlugin require("html-webpack-plugin&q…

华为云HECS安装docker

1、运行安装指令 yum install docker都选择y&#xff0c;直到安装成功 2、查看是否安装成功 运行版本查看指令&#xff0c;显示docker版本&#xff0c;证明安装成功 docker --version 或者 docker -v 3、启用并运行docker 3.1启用docker 指令 systemctl enable docker …

网络编程day05(IO多路复用)

今日任务&#xff1a; TCP多路复用的客户端、服务端&#xff1a; 服务端代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <unistd.h> …

深度学习从入门到入土

1. 数据操作 N维数组样例 N维数组是机器学习和神经网络的主要数据结构 0-d 一个类别&#xff1a; 1.0 1-d 一个特征向量(一维矩阵)&#xff1a;[1.0, 2.7, 3.4] 2-d 一个样本-特征矩阵-(二维矩阵) 3-d RGB图片 &#xff08;宽x高x通道&#xff09;- 三维数组 4-d 一个RGB…

Apipost最佳实践

自诞生以来&#xff0c;Apipost凭借其简洁直观的用户界面、强大的功能以及简单、易上手的操作&#xff0c;让Apipost成为了开发人员不可或缺的工具。本文将详细介绍Apipost的主要功能和使用方法&#xff0c;帮助大家更好地了解这款优秀的API开发工具。 下载安装 直接进入Apip…

网络初识

一 IP 地址 概念: IP 地址主要用于表示网络主机、其他网络设备&#xff08;如路由器&#xff09;的网络地址。简单说&#xff0c;IP地址用于定位主机的网络地址 格式 IP 地址是一个32为的二进制数&#xff0c;通常被分割为4个“8位二进制数“&#xff08;也就是4个字节&…

在github上设置不同分支,方便回滚

在github上设置不同分支&#xff0c;方便回滚 步骤可能出现的问题couldnt find remote ref gpuVersion1. 确保您处于正确的分支2. 添加并提交更改&#xff08;如果还未进行&#xff09;3. 推送本地分支到远程仓库4. 验证操作 步骤 之前在github上上传了一个项目代码&#xff0c…

GitHub Copilot Chat

9月21日&#xff0c;GitHub在官网宣布&#xff0c;所有个人开发者可以使用GitHub Copilot Chat。用户通过文本问答方式就能生成、检查、分析各种代码。 据悉&#xff0c;GitHub Copilot Chat是基于OpenAI的GPT-4模型打造而成&#xff0c;整体使用方法与ChatGPT类似。例如&…

多模态 多引擎 超融合 新生态!2023亚信科技AntDB数据库8.0产品发布

9月20日&#xff0c;以“多模态 多引擎 超融合 新生态”为主题的亚信科技AntDB数据库8.0产品发布会成功举办&#xff0c;从技术和生态两个角度全方位展示了AntDB数据库第8次大型能力升级和生态建设成果。浙江移动、用友、麒麟软件、华录高诚、金云智联等行业伙伴及业界专家共同…

JavaScript - canvas - 将图片保存到本地

效果 示例 项目结构&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>将图片保存到本地</title></head><body><canvas id"canvas"></canvas><b…

【校招VIP】前端计算机网络之HTTP和HTTPS

考点介绍&#xff1a; 为了解决HTTP协议的缺陷&#xff0c;需要使用另一种协议&#xff1a;安全套接字层超文本传输协议HTTPS&#xff0c;为了数据传输的安全&#xff0c;HTTPS在HTTP的基础上加入了SSL/TLS协议&#xff0c;SSL/TLS依靠证书来验证服务器的身份&#xff0c;并为浏…

spring:实现初始化动态bean|获取对象型数组配置文件

0. 引言 近期因为要完成实现中间件的工具包组件&#xff0c;其中涉及要读取对象型的数组配置文件&#xff0c;并且还要将其加载为bean&#xff0c;因为使用了spring 4.3.25.RELEASE版本&#xff0c;很多springboot的相关特性无法支持&#xff0c;因此特此记录&#xff0c;以方…