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的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

Spring+MyBatis+jeasyui 功能树列表

java代码@EnablePaging@RequestMapping(value = "/queryFunctionList.html")@ResponseBodypublic Map<String, Object> queryFunctionList() {String parentId = "";List<FunctionDisplay> tables = query(parent

Mybatis中的like查询

<if test="templateName != null and templateName != ''">AND template_name LIKE CONCAT('%',#{templateName,jdbcType=VARCHAR},'%')</if>

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus

JavaWeb【day09】--(Mybatis)

1. Mybatis基础操作 学习完mybatis入门后,我们继续学习mybatis基础操作。 1.1 需求 需求说明: 根据资料中提供的《tlias智能学习辅助系统》页面原型及需求,完成员工管理的需求开发。 通过分析以上的页面原型和需求,我们确定了功能列表: 查询 根据主键ID查询 条件查询 新增 更新 删除 根据主键ID删除 根据主键ID批量删除

MyBatis 切换不同的类型数据库方案

下属案例例当前结合SpringBoot 配置进行讲解。 背景: 实现一个工程里面在部署阶段支持切换不同类型数据库支持。 方案一 数据源配置 关键代码(是什么数据库,该怎么配就怎么配) spring:datasource:name: test# 使用druid数据源type: com.alibaba.druid.pool.DruidDataSource# @需要修改 数据库连接及驱动u

oracle分页和mysql分页

mysql 分页 --查前5 数据select * from table_name limit 0,5 select * from table_name limit 5 --limit关键字的用法:LIMIT [offset,] rows--offset指定要返回的第一行的偏移量,rows第二个指定返回行的最大数目。初始行的偏移量是0(不是1)。   oracle 分页 --查前1-9

MySQL record 02 part

查看已建数据库的基本信息: show CREATE DATABASE mydb; 注意,是DATABASE 不是 DATABASEs, 命令成功执行后,回显的信息有: CREATE DATABASE mydb /*!40100 DEFAULT CHARACTER SET utf8mb3 / /!80016 DEFAULT ENCRYPTION=‘N’ / CREATE DATABASE myd

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

mybatis框架基础以及自定义插件开发

文章目录 框架概览框架预览MyBatis框架的核心组件MyBatis框架的工作原理MyBatis框架的配置MyBatis框架的最佳实践 自定义插件开发1. 添加依赖2. 创建插件类3. 配置插件4. 启动类中注册插件5. 测试插件 参考文献 框架概览 MyBatis是一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射,为开发者提供了极大的灵活性和便利性。以下是关于M