在使用 PageHelper 分页时正确处理 do 到 vo 的转换
PageHelper 这个分页框架,虽然之前已经用过多次,但这次我做了一些改动,新增了一个功能:do 转 vo。接下来,我来分享一下这次遇到的问题以及解决的过程,希望对大家使用 PageHelper 时提供一些帮助。
今天的代码大致是这样的:
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);
}程序的步骤大致是这样的:
设置
PageHelper查询数据
执行
do转vo将分页数据封装到
PageInfo中
在我之前编写的程序中,是没有第三步 do 转 vo 这一步的,因此程序运行没有问题。但当我加入这一新步骤后,出现了问题——前端始终只能显示一页数据,后续的页码都无法显示。我检查了前端接收到的数据,发现接收到的 total 值是我设置的 Constants.PAGE_SIZE,即每页的最大值,而不是实际的总记录数。
最开始,我以为是前端的问题(毕竟这是我第一次在一个页面中同时使用两个分页系统)。然而,经过一番排查后,我才意识到问题出在后端。实际上,PageHelper 的分页信息并没有随着 do 到 vo 的转换而被正确传递。PageHelper 通过拦截数据库查询语句来设置分页信息,拦截的对象是我的数据库查询语句(即 do 对象)。但是,经过转换后我返回给前端的是 vo 数据,而没有传递分页信息。因此,程序需要手动将分页信息加入到转换后的 vo 中。
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
- 微信
- 赶快加我聊天吧

- 赶快加我聊天吧
