在使用 PageHelper 分页时正确处理 do 到 vo 的转换

在开发过程中,使用分页框架是很常见的需求。今天,我又一次在后端项目中使用了 PageHelper 这个分页框架,虽然之前已经用过多次,但这次我做了一些改动,新增了一个功能:dovo。接下来,我来分享一下这次遇到的问题以及解决的过程,希望对大家使用 PageHelper 时提供一些帮助。

今天的代码大致是这样的:

@Override
public PageInfo<CategoryBrandRelationVo> getRelationsById(Integer current, Long brandId) {
   // 1. 设置 PageHelper
   PageHelper.startPage(current, Constants.PAGE_SIZE);
   // 2. 查询
   List<CategoryBrandRelationDo> doList = categoryBrandRelationMapper.selectRelationsByBrandId(brandId);
   // 3. do 转 vo
   List<CategoryBrandRelationVo> voList = new ArrayList<>();
   for (CategoryBrandRelationDo categoryBrandRelationDo : doList) {
       voList.add(categoryBrandRelationConverter.doToVo(categoryBrandRelationDo));
  }
   // 4. 封装分页数据到 PageInfo
   return new PageInfo<>(voList);
}

程序的步骤大致是这样的:

  1. 设置 PageHelper

  2. 查询数据

  3. 执行 dovo

  4. 将分页数据封装到 PageInfo

在我之前编写的程序中,是没有第三步 do 转 vo 这一步的,因此程序运行没有问题。但当我加入这一新步骤后,出现了问题——前端始终只能显示一页数据,后续的页码都无法显示。我检查了前端接收到的数据,发现接收到的 total 值是我设置的 Constants.PAGE_SIZE,即每页的最大值,而不是实际的总记录数。

最开始,我以为是前端的问题(毕竟这是我第一次在一个页面中同时使用两个分页系统)。然而,经过一番排查后,我才意识到问题出在后端。实际上,PageHelper 的分页信息并没有随着 dovo 的转换而被正确传递。PageHelper 通过拦截数据库查询语句来设置分页信息,拦截的对象是我的数据库查询语句(即 do 对象)。但是,经过转换后我返回给前端的是 vo 数据,而没有传递分页信息。因此,程序需要手动将分页信息加入到转换后的 vo 中。

@Override
public PageInfo<CategoryBrandRelationVo> getRelationsById(Integer current, Long brandId) {
   // 1. 设置 PageHelper
   PageHelper.startPage(current, Constants.PAGE_SIZE);

   // 2. 查询数据
   List<CategoryBrandRelationDo> doList = categoryBrandRelationMapper.selectRelationsByBrandId(brandId);

   // 3. 获取 PageInfo 对象,封装分页信息
   PageInfo<CategoryBrandRelationDo> pageInfoDo = new PageInfo<>(doList);

   // 4. 转换为 Vo 列表
   List<CategoryBrandRelationVo> voList = new ArrayList<>();
   for (CategoryBrandRelationDo categoryBrandRelationDo : doList) {
       voList.add(categoryBrandRelationConverter.doToVo(categoryBrandRelationDo));
  }

   // 5. 封装分页数据到 PageInfo
   PageInfo<CategoryBrandRelationVo> pageInfoVo = getCategoryBrandRelationVoPageInfo(voList, pageInfoDo);
   
   // 手动传递分页信息
   // 总记录数
   pageInfoVo.setTotal(pageInfoDo.getTotal());
   // 总页数
   pageInfoVo.setPages(pageInfoDo.getPages());
   // 当前页
   pageInfoVo.setPageNum(pageInfoDo.getPageNum());
   // 每页数据量
   pageInfoVo.setPageSize(pageInfoDo.getPageSize());
   // 起始行
   pageInfoVo.setStartRow(pageInfoDo.getStartRow());
   // 结束行
   pageInfoVo.setEndRow(pageInfoDo.getEndRow());
   // 当前页的数据条数
   pageInfoVo.setSize(pageInfoDo.getSize());  

   // 6. 返回最终的分页数据
   return pageInfoVo;
}

这次改动新增了两个步骤:第三步和第五步。简单来说,第三步是获取 PageHelper 拦截的分页信息,第五步是将这个分页信息传递到转换后的 voList 中。

好了,这就是今天在使用数据库分页框架 PageHelper 时的教训,希望这个经验对以后有所帮助。

  • 微信
  • 赶快加我聊天吧
  • QQ
  • 赶快加我聊天吧
  • weinxin
三桂

发表评论 取消回复 您未登录,登录后才能评论,前往登录