本文共 5777 字,大约阅读时间需要 19 分钟。
简述分页过程:将分页最基本的页码(pageNum)和页面个数(pageSize)封装到创建的Page对象,然后mybatis分页的插件基于Page中的基本分页属性完成sql的limit分页语句的查询,这样mybatis查询返回的结果就是分页后的数据;但是——通常最后会将分页的基本数据和分页查询后的list数据共同进一步封装到PageInfo对象中。
BaseController
首先,在使用Mybatis查询数据库展示到前端的过程中不可避免的要考虑到分页问题,这时就引入了Mybatis的PageHelper插件,这个插件对分页功能进行了强有力的封装,只需要将查询出来的数据List集合放入到它指定的对象中,就完成了分页 。其中PageHelper插件是属于mybatis框架的,所以肯定会和mybatis内在的融合,即MySQL一般使用 LIMIT 实现分页查询。
分页核心代码public PageInfopageList(Integer pageNum, Integer pageSize){ // 开启分页————————这一步实际是创建一个page对象,这个对象中有分页所需的基本配置项 //Page
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中里面分页相关属性就获取不到了。
这里定义了一个静态的工具方法,用于将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); }}
(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层、展现层中。
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 pageInfopageUserVoList(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
转载地址:http://whdxi.baihongyu.com/