博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2020.11.02 mybatis-分页
阅读量:4158 次
发布时间:2019-05-26

本文共 5777 字,大约阅读时间需要 19 分钟。

一.简述分页过程:

简述分页过程:将分页最基本的页码(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);

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

其中PageHelper插件是属于mybatis框架的,所以肯定会和mybatis内在的融合,即MySQL一般使用 LIMIT 实现分页查询

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

Po类型 * @param

Vo类型 * @return */ public static
PageInfo
PageInfo2PageInfoVo(PageInfo

pageInfoPo) { // 创建Page对象,实际上是一个ArrayList类型的集合 Page

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
pageUserVoList(Integer pageNum, Integer pageSize){ // 1. 开启分页 PageHelper.startPage(pageNum, pageSize); // 2. 从数据库中查询出 List
UserPoList = UserPoMapper.selectXxx(); // 3. 封装list到PageInfo对象中自动分页 PageInfo
userPoPageInfo = new PageInfo<>(UserPoList); // 4. 转换为UserVo类型的PageInfo对象 PageInfo
UserVoPageInfo = PageUtils.PageInfo2PageInfoVo(userPoPageInfo); // 5. 创建需要分页的UserVoList List
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 toPageResponse(List list) {              List pageList = list;        int total = list.size();        com.github.pagehelper.Page 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( pageList);    }

转载地址:http://whdxi.baihongyu.com/

你可能感兴趣的文章
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
LOCAL_PRELINK_MODULE和prelink-linux-arm.map
查看>>
Simple Guide to use the gdb tool in Android environment
查看>>
Netconsole to capture the log
查看>>
Build GingerBread on 32 bit machine.
查看>>
How to make SD Card world wide writable
查看>>
Detecting Memory Leaks in Kernel
查看>>
Linux initial RAM disk (initrd) overview
查看>>
Timestamping Linux kernel printk output in dmesg for fun and profit
查看>>
There's Much More than Intel/AMD Inside
查看>>
CentOS7 安装MySQL 5.6.43
查看>>
使用Java 导入/导出 Excel ----Jakarta POI
查看>>
本地tomcat 服务器内存不足
查看>>
IntelliJ IDAE 2018.2 汉化
查看>>
Openwrt源码下载与编译
查看>>
我和ip_conntrack不得不说的一些事
查看>>
Linux 查看端口使用情况
查看>>
文件隐藏
查看>>
两个linux内核rootkit--之二:adore-ng
查看>>