PageHelper使用以及PageInfo中分页对象的转化

news/2024/10/23 9:40:08/

在使用Mybatis查询数据库展示到前端的过程中不可避免的要考虑到分页问题,这时就引入了Mybatis的PageHelper插件,这个插件对分页功能进行了强有力的封装,只需要将查询出来的数据List集合放入到它指定的对象中,就完成了分页,下面简单的对分页过程介绍一下。

分页代码

public PageInfo<Po> pageList(Integer pageNum, Integer pageSize){// 开启分页PageHelper.startPage(pageNum, pageSize);List<Po> poList = poMapper.selectXxx();// 封装list到PageInfo对象中自动分页PageInfo<Po> poPageInfo = new PageInfo<>(poList);return poPageInfo;
}
  • Po是数据库对应的实体类对象;
  • PageInfo是需要返回的对象类型,里面封装了包含Po数据的List集合;
  • pageNum:指定了查询第几页数据;
  • pageSize:指定每一页显示多少条数据;

但一般使用PageHelper,要完成以下步骤:

1. 导入依赖包

这里使用的是maven管理。

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>3.7.5</version>
</dependency>

2. 配置插件

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 配置插件 --><property name="plugins"><array><!-- 分页插件 --><bean class="com.github.pagehelper.PageHelper"><property name="properties"><props><!-- 配置数据库方言 --><prop key="dialect">mysql</prop><!-- 配置自动修正页码 --><!-- pageNo的有效范围:1~总页数 --><prop key="reasonable">true</prop></props></property></bean></array></property>
</bean>

PageInfo<>对象泛型的转化

既然这样就完成了分页,那么今天讨论的问题到底是干嘛的呢?

是这样的,正常情况下PageInfo中的泛型必须是数据库的实体类对象,即PO对象。正常开发中不可避免的要使用到其他的包括DTO,VO等对象,在对VO等对象分页时,如果直接返回VO泛型的PageInfo对象,该对象中则没有数据,所以要进一步对PageInfo对象进行封装,转换其泛型。

即要对非数据库对应的实体类集合分页时,直接传入list是不生效的,必须对PageInfo进行进一步的处理。

泛型转换

这里定义了一个静态的工具方法,用于将PageInfo中的泛型Po对象转换为Vo对象,其他对象类似,只需要传入对应的泛型。

public class PageUtils{/*** 将PageInfo对象泛型中的Po对象转化为Vo对象* @param pageInfoPo PageInfo<Po>对象</>* @param <P> Po类型* @param <V> Vo类型* @return*/public static <P, V> PageInfo<V> PageInfo2PageInfoVo(PageInfo<P> pageInfoPo) {// 创建Page对象,实际上是一个ArrayList类型的集合Page<V> page = new Page<>(pageInfoPo.getPageNum(), pageInfoPo.getPageSize());page.setTotal(pageInfoPo.getTotal());return new PageInfo<>(page);}
}
  • 泛型P:Po对象类型;
  • 泛型V:Vo或其他需要分页的数据类型;
  • Page对象是保存list数据集合,实际上是ArrayList类型;

转换泛型的实质就是给新的PageInfo<Vo>对象中的page对象添加pageNum、pageSize、Total等属性。

在得到PageInfo对象后可以使用getList()方法获取存储数据的List集合,进而给PageInfo对象保存需要分页的数据。

举例🌰

先定义两个对象;

UserPo.java

public class UserPo{private Integer id;private String userName;private String userPassword;private Integer addressId;
}

UserVo.java

public class UserVo{private Integer id;private String userName;private String addressName;
}

分页逻辑实现:

UserServiceImpl.java

public class UserServiceImpl implements UserService{public pageInfo<UserVo> pageUserVoList(Integer pageNum, Integer pageSize){// 1. 开启分页PageHelper.startPage(pageNum, pageSize);// 2. 从数据库中查询出List<UserPo> UserPoList = UserPoMapper.selectXxx();// 3. 封装list到PageInfo对象中自动分页PageInfo<Po> userPoPageInfo = new PageInfo<>(UserPoList);// 4. 转换为UserVo类型的PageInfo对象PageInfo<UserVo> UserVoPageInfo = PageUtils.PageInfo2PageInfoVo(userPoPageInfo);// 5. 创建需要分页的UserVoListList<UserVo> userVoList = new ArrayList<>();// 6. 遍历UserPo给UserVoList初始化for(UserPo userpo : UserPoList){UserVo uservo = new UserVo();// 6.1 将与Po对象相同属性的值赋值到Vo对象中BeanUtils.copyProperties(userpo, uservo);String addressName = userPoMapper.selectAddressById(userpo.AdrressId).getAddressName();uservo.setAddressName(addressName);userVoList.add(uservo);}for (UserVo uservo : userVoList) {userVoPageInfo.getList().add(articleVo);}return userVoPageInfo;}
}

这里主要处理了UserVo与UserPo中不同的数据,真正处理分页的逻辑代码非常简单。只要能够获得需要分页Vo对象的集合,存入到VoPageInfo的List中即可。


http://www.ppmy.cn/news/656197.html

相关文章

ubuntu下如何设置PageUp/PageDown键调出使用过的历史命令

vi /etc/inputrc 大约在第40行&#xff0c;找到page up page down的用法&#xff0c;去掉前面的#号&#xff0c;重启终端即可 40 # alternate mappings for "page up" and "page down" to search the history 41 "\e[5~": history-search-ba…

PageHelper是怎么分页的

目录 1、前言2、基本流程3、源码分析3.1、存储分页参数3.2、改造SQL3.3、分页查询3.4、使用 Page 创建 PageInfo 对象 1、前言 PageHelper是mybatis 提供的分页插件&#xff0c;通过PageHelper.startPage(pageNo,pageLimit)就可以帮我们实现分页&#xff0c;目前支持Oracle,My…

pagehelper分页插件传pageNum和pageSize不起作用怎么办?

项目场景&#xff1a; 在二次开发中要使用到多数据源这种情况&#xff0c;但是原有的分页只适用于以前的方式&#xff08;之前是ORACLE&#xff09;现在要用到的是mysql的分页这种方式 问题描述 按照往上pagehelper的使用教程&#xff0c;我在自己的项目中导入了pagehelper的…

如何把电脑文件传到虚拟机

方法一&#xff1a;VMWareTools 安装VMWare tools &#xff0c;点击上方虚拟机 -> 安装VMware tools安装成功后&#xff0c;即可通过复制粘贴文件&#xff0c;将文件复制到虚拟机中 安装成功后&#xff0c;会显示如下内容 安装成功后&#xff0c;可以直接拖动文件&#x…

怎么把自己电脑上的文件传到服务器本地上

我刚接触服务器的时候&#xff0c;一直不明白本地的意思&#xff0c;现在我在这里理一下三个概念&#xff1a;自己的电脑&#xff0c;本地&#xff0c;集群。 自己的电脑&#xff1a;就是自己的电脑 本地&#xff1a;指的是服务器的本地&#xff0c;在客户端用linux的命令即可 …

Mac将本地文件上传到服务器上

打开终端&#xff0c;输入命令&#xff1a; scp /Users/codez/Downloads/jdk-8u144-linux-x64.tar.gz root139.224.235.xxx:/root/java/jdk-8u144-linux-x64.tar.gz scp 上传命令 /Users/codez/Downloads/jdk-8u144-linux-x64.tar.gz 表示本地上准备上传文件的路径和文件名 roo…

如何将文档上传到 ChatGPT

OpenAI 一直在为 ChatGPT 添加几个有趣的功能&#xff0c;包括对网页浏览和插件的支持。但是&#xff0c;仍然没有办法本地上传文档并根据其上下文提出问题。当然&#xff0c;有些用户可以在他们的数据上训练 AI 聊天机器人&#xff0c;但并不是每个人都了解如何设置工具和库。…

mac的home、end、pageUp、pageDown键

我们在使用mac笔记本的时候&#xff0c;一些编辑器经常会使用到Home、End、PageUp、PageDown等键位&#xff0c;但是mac笔记本的键盘上并没有这几个键位&#xff0c;这样就很尴尬了&#xff0c;其实通过组合快捷键&#xff0c;可以很容易的实现这几个功能的&#xff1a; HOME键…