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中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Golang如何用gorm实现分页的功能

《Golang如何用gorm实现分页的功能》:本文主要介绍Golang如何用gorm实现分页的功能方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景go库下载初始化数据【1】建表【2】插入数据【3】查看数据4、代码示例【1】gorm结构体定义【2】分页结构体

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可