在使用人人开源框架的时候,通过逆向工程自动生成了分页功能,然而在使用的时候经常被关于Ipage和page等对象搞混,所以记录这篇文章用来介绍之间的区别

@Overridepublic PageUtils queryPage(Map<String, Object> params) {IPage<OrderFormEntity> page = this.page(new Query<OrderFormEntity>().getPage(params),new QueryWrapper<OrderFormEntity>());return new PageUtils(page);}

可以看见上面就是逆向工程帮忙生成的分页方法

里面出现了三个对象pageUtils、page和Ipage

先来将pageUtils吧,pageUtils是人人代码自己存在的一个功能类,用来包装Ipage

public PageUtils(List<?> list, int totalCount, int pageSize, int currPage) {this.list = list;this.totalCount = totalCount;this.pageSize = pageSize;this.currPage = currPage;this.totalPage = (int)Math.ceil((double)totalCount/pageSize);}/*** 分页*/public PageUtils(IPage<?> page) {this.list = page.getRecords();this.totalCount = (int)page.getTotal();this.pageSize = (int)page.getSize();this.currPage = (int)page.getCurrent();this.totalPage = (int)page.getPages();}

目的很简单就是为包装Ipage类,方便后端的调用,下图是后端如何调用pageUtil(其实不用包装也能直接使用Ipage)

 if (data && data.code === 0) {this.dataList = data.page.list;this.totalPage = data.page.totalCount;} else {this.dataList = [];this.totalPage = 0;}this.dataListLoading = false;});

接下来再来看Ipage的生成,Ipage的生成调用了mybatis-plus自带的方法this.getPage,方法传入两个参数,一个是page类,一个是qw,通过这个方法,用户可以自定义自己想要的分页数据,简单来说就是在page上再筛选而后得到Ipage。

那么Ipage是怎么生成的呢,很简单创建一个Query对象,通过对象内部的getPage方法,传入参数params获得分页数据

那么Page是怎么生成的呢

public IPage<T> getPage(Map<String, Object> params, String defaultOrderField, boolean isAsc) {//分页参数long curPage = 1;long limit = 10;if(params.get(Constant.PAGE) != null){curPage = Long.parseLong((String)params.get(Constant.PAGE));}if(params.get(Constant.LIMIT) != null){limit = Long.parseLong((String)params.get(Constant.LIMIT));}//分页对象Page<T> page = new Page<>(curPage, limit);//分页参数params.put(Constant.PAGE, page);//排序字段//防止SQL注入(因为sidx、order是通过拼接SQL实现排序的,会有SQL注入风险)String orderField = SQLFilter.sqlInject((String)params.get(Constant.ORDER_FIELD));String order = (String)params.get(Constant.ORDER);//前端字段排序if(StringUtils.isNotEmpty(orderField) && StringUtils.isNotEmpty(order)){if(Constant.ASC.equalsIgnoreCase(order)) {return  page.addOrder(OrderItem.asc(orderField));}else {return page.addOrder(OrderItem.desc(orderField));}}//没有排序字段,则不排序if(StringUtils.isBlank(defaultOrderField)){return page;}//默认排序if(isAsc) {page.addOrder(OrderItem.asc(defaultOrderField));}else {page.addOrder(OrderItem.desc(defaultOrderField));}return page;}
}

传入的params并不会做任何的筛选只会做分页的基本初始化,例如两个参数contant.Pageconstant.LIMIT,如果不做任何要求,那么getPage会使用自己默认的当前页和页最大数,然后创建page对象,在page对象添加排序规则,最后把这个初始好的对象返回回去。

最后this.page再调用底层的selectPage

default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper) {return this.getBaseMapper().selectPage(page, queryWrapper);}

其实mybatis-plus提供最基本的分页查询就是使用selectPage方法

总结:代码生成器生成的分页查询操作,是通过层层包装selectPage方法,最终获得queryPage,而Ipage是page的包装,pageUtils是Ipage的包装

关于mybatis-plus中Ipage 、page 和pageUtils中的区别相关推荐

  1. 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...

    java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...

  2. docx文件上传java_java上传文件通过mybatis存储到数据库的blob格式中.docx

    java上传文件通过mybatis存储到数据库的blob格式中.docx 还剩 4页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 上传文件通过 myb ...

  3. MyBatis框架学习:<select>节点中的resultType和resultMap属性

    1.为什么要进行resultType或resultMap注解配置 当需要实现的数据访问是查询类型的,在<select>节点中必须配置resultType或resultMap中的某1个属性( ...

  4. mysql page_一文理解MySQL中的page页

    在介绍InnoDB中的页的时候,很有必要先让大家了解一下InnoDB中的存储结构 从InnoDB存储引擎的逻辑结构看,所有数据都被逻辑地存放在一个空间内,称为表空间(tablespace),而表空间由 ...

  5. mybatis 执行插入操作,insert 返回1,数据库中无数据。数据库中数据的创建时间和插入执行时间不一致。

    大家好,我是烤鸭: 今天记录一下线上的问题,由于不是我们组的代码,所以没参与全程,只是最后有幸听各位大佬探讨解决方案.mybatis 执行插入操作,insert返回1,日志记录和接口返回都正常,但是数 ...

  6. 操作系统中的page cache机制

    在现代计算机系统中,CPU,RAM,DISK的速度不相同,按速度高低排列 为:CPU>RAM>DISK.CPU与RAM之间.RAM与DISK之间的速度差异常常是指数级.同时,它们之间的处理 ...

  7. 【MyBatis学习05】SqlMapConfig.xml文件中的配置总结

    经过上两篇博文的总结,对mybatis中的dao开发方法和流程基本掌握了,这一节主要来总结一下mybatis中的全局配置文件SqlMapConfig.xml在开发中的一些常用配置,首先看一下该全局配置 ...

  8. 使用asp.net mvc开发应用程序,页面中的page.IsPostback还有用处吗?

    本来我对asp.net mvc也研究了一段时间了,我也使用了asp.net mvc开发了两套应用程序,虽然都不是什么大的系统. 今天也想特别提出一个疑问,不知道是我不知道呢,还是本身很难实现在asp. ...

  9. jQuery Mobile中页面page的data-*选项

    全栈工程师开发手册 (作者:栾鹏) jQuery Mobile 所有data-*选项 jQuery Mobile中页面page的data-*选项 带有 data-role="page&quo ...

最新文章

  1. 敏捷宣言遵循的十二条原则
  2. sqlite DLL load failed
  3. matlab2011实验3,matlab实验3探索.doc
  4. python程序实例教程基础-Python程序设计实例教程
  5. Paint.Net学习笔记——二、窗体(上)
  6. 成功者网上创业的精华经验
  7. java调用下载窗口_java 从网络Url中下载文件 java调用url接口
  8. 接口测试时,输入所有参数的参数值后,接口返回“参数错误:所有参数都不能为空”
  9. python读取文件路径乱码 linux_Python之pandas读写文件乱码的解决方法
  10. 补充总结:现代控制理论
  11. python asyncio tcp server_关于 asyncio 创建多个 tcp 连接,线程数不准确的问题
  12. 调整计算机硬盘大小,详细教您怎么调整硬盘分区
  13. 嵌入式Linux开发|点亮那颗LED灯
  14. 人人网主页登录_“人人”归来!有人想找前女友,有人想删“黑历史”
  15. 什么是zone?如何做zone?如何做好zone?
  16. 谈逻辑与数学界线之淡化
  17. 【硬见小百科】PCB多层板各层含义与设计原则
  18. maven报错问题汇总
  19. 张驰课堂:六西格玛黑带认证的含金量由谁决定?
  20. Felix入门与实践(一)

热门文章

  1. 大陆人怎么去香港开设银行账户,开户流程是什么?
  2. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(十六):神经网络笔记3(上)
  3. php熊掌号api,thinkphp5.1如何实现熊掌号资源API提交功能?
  4. 四个复制就能用的炫酷网页特效
  5. 单片机酒精浓度检测仪
  6. 慧教室系统--远程控制系统
  7. Intellij IDEA win下快捷键
  8. 华为hicar是鸿蒙系统,鸿蒙之后,华为官宣HiCar智慧车载系统
  9. Vue如何在手机上调试
  10. 基于物联网及云计算技术的智慧充电桩平台设计方案