2020.11.02 mybatis-分页

2024-02-22 05:38
文章标签 02 分页 mybatis 2020.11

本文主要是介绍2020.11.02 mybatis-分页,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.简述分页过程:

简述分页过程:将分页最基本的页码(pageNum)和页面个数(pageSize)封装到创建的Page对象,然后mybatis分页的插件基于Page中的基本分页属性完成sql的limit分页语句的查询,这样mybatis查询返回的结果就是分页后的数据;但是——通常最后会将分页的基本数据和分页查询后的list数据共同进一步封装到PageInfo对象中。

BaseController
过程:
  • 开启分页(本质是创建一个Page对象): PageHelper.startPage(pageNum, pageSize);
  • 获取带分页的对象集合: List UserPoList = UserPoMapper.selectXxx();
  • 封装对象list集合到pageinfo中以PageInfo返回展示:PageInfo userPoPageInfo = new PageInfo<>(UserPoList);

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

首先,在使用Mybatis查询数据库展示到前端的过程中不可避免的要考虑到分页问题,这时就引入了Mybatis的PageHelper插件,这个插件对分页功能进行了强有力的封装,只需要将查询出来的数据List集合放入到它指定的对象中,就完成了分页
其中PageHelper插件是属于mybatis框架的,所以肯定会和mybatis内在的融合,即MySQL一般使用 LIMIT 实现分页查询

分页核心代码public PageInfo<Po> pageList(Integer pageNum, Integer pageSize){// 开启分页————————这一步实际是创建一个page对象,这个对象中有分页所需的基本配置项//Page<Object> startPage = PageHelper.startPage(2, 3);PageHelper.startPage(pageNum, pageSize);//上面创建的page对象,会对其下最接近的mybatis的sql语句进行limit分页查询的;  创建的Page对象,实际上是一个ArrayList类型的集合 List<Po> poList = poMapper.selectXxx();// 封装list到PageInfo对象中,即对page的进一步详细封装(又加入了分页查询后的数据)//看源码知道page对象也是ArrayList类型,所以上面mybatis查询返回的poList对象,里面包含了分页的基本属性还有返回的数据内容PageInfo<Po> poPageInfo = new PageInfo<>(poList);return poPageInfo;
}pageNum:指定了查询第几页数据;pageSize:指定每一页显示多少条数据;

上述核心细节:Page中已经封装有分页的基本属性(pageNum和pageSize)了,但是PageInfo是对Page的进一步封装。

  1. Po是数据库对应的实体类对象; 为啥说po是数据库的实体对象呢,因为mybatis原理可知,查询后返回的实体对象和数据库中数据结构一致。
  2. PageInfo是需要返回的对象类型,里面封装了包含Po数据的List集合;实际上,第一步开启分页时设置了起始页和页面数量而创建的page对象就完成对紧接的mapper进行limit分页了,但是PageInfo是对Page的进一步封装,还有添加加了一些更丰富的判断方法,将之前Page中封装的分页参数和分页后的数据共同封装在一起了这也是PageInfo和Page的区别之处

三.PageInfo<>对象泛型的转化

mybatis的分页,正常情况下PageInfo中的泛型必须是数据库的实体类对象,即PO对象为啥呢?


因为PageHelper.startPage(pageNum, pageSize);创建的page对象,对最近的mybatis的sql有效,之后mybatis返回的查询list结果时,由于
page类型也是ArrayList类型,所以返回的list类型的po集合,被类型转换为page类型了。它里面有page封装的分页相关属性,只有将这个
po对象传给PageInfo,这样Pageinfo中对page的进一步封装相关属性才会被赋值。如果将mybatis返回的po,进行了转换和解析为
vo对象,这个vo对象虽然也是list集合,但是里面有mybatis的pagehelper插件转换的page相关属性都没有了,这样vo封装到pageinfo中
里面分页相关属性就获取不到了。

在这里插入图片描述

3.1 泛型转换:

这里定义了一个静态的工具方法,用于将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对象中的page对象添加pageNum、pageSize、Total等属性。在得到PageInfo对象后可以使用getList()方法获取存储数据的List集合,进而给PageInfo对象保存需要分页的数据。
(1)PO(Persistence Object 持久化对象)是直接跟持久层数据库打交道的java Bean ;首先PO是持久化类,其属性的改变很有可能直接导致数据
库中的数据变化。
(2)VO(Value Object 值对象,view object表现层对象)除了可以跟PO完全一样的变量,set/get方法之外,还可以有其他的变量,但是不用其跟
数据库打交道,可以把该对象当做无状态的对象。
(3)POJO :plain ordinary java object 无规则简单java对象,属性就是一些简单数据类型的变量
(4)VO之后要注意其活动范围要控制在service层、controller层、展现层中,而不要进入dao层甚至是数据库(一般也不可能影响到数据库),
同样的PO也只能出现在dao层和数据库(数据库直接和PO交互),而不能够出现在service层、controller层、展现层中。

3.2 分页逻辑且泛型转换的实现:


UserPo.javapublic class UserPo{private Integer id;private String userName;private String userPassword;private Integer addressId;
}UserVo.javapublic class UserVo{private Integer id;private String userName;private String addressName;
}
===============================================================================
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中即可。

四.假分页

上面分页原理是mybatis的pagehelper插件,这个插件内在本质和mybatis有结合的,只要封装和创建好分页所需属性的page对象后,会自动对紧邻的mybatis的第一个sql生效,那么如果是单纯的集合数据的分页,不是和mybatis查询回的集合数据的分页呢?那么就用单纯将集合基于pageNum和pageSize来手动分页就可以了,list有一个sublist方法,从集合中灵活提取某些数据来完成分页;

	public PageInfo<Object> toPageResponse(List<Object> list) {List<Object> pageList = list;int total = list.size();com.github.pagehelper.Page<Object> page = PageHelper.getLocalPage();if (page != null && page.getPageNum() > 0) {int pageSize = page.getPageSize();int totalPage = total / pageSize + (total % pageSize == 0 ? 0 : 1);int pageNum = page.getPageNum();if (pageNum > totalPage) {pageNum = totalPage;}if (pageNum < 1) {pageNum = 1;}pageList = list.subList((pageNum - 1) * pageSize, Math.min(list.size(), pageNum * pageSize));PageHelper.clearPage();}               return new PageInfo<Object>( pageList);}

这篇关于2020.11.02 mybatis-分页的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/734267

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

mybatis映射器配置小结

《mybatis映射器配置小结》本文详解MyBatis映射器配置,重点讲解字段映射的三种解决方案(别名、自动驼峰映射、resultMap),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定... 目录select中字段的映射问题使用SQL语句中的别名功能使用mapUnderscoreToCame

mybatis-plus如何根据任意字段saveOrUpdateBatch

《mybatis-plus如何根据任意字段saveOrUpdateBatch》MyBatisPlussaveOrUpdateBatch默认按主键判断操作类型,若需按其他唯一字段(如agentId、pe... 目录使用场景方法源码方法改造首先在service层定义接口service层接口实现总结使用场景my

MyBatis ParameterHandler的具体使用

《MyBatisParameterHandler的具体使用》本文主要介绍了MyBatisParameterHandler的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、概述二、源码1 关键属性2.setParameters3.TypeHandler1.TypeHa

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

MyBatis流式查询两种实现方式

《MyBatis流式查询两种实现方式》本文详解MyBatis流式查询,通过ResultHandler和Cursor实现边读边处理,避免内存溢出,ResultHandler逐条回调,Cursor支持迭代... 目录MyBATis 流式查询详解:ResultHandler 与 Cursor1. 什么是流式查询?