最近写项目的时候,突然发现自己的分页有点问题,现在项目中大部分分页都是使用PageHelper等一些插件来帮我们简化操作,很多人会用,但是没有仔细去思考过,之前我也是,所以遇到问题有点懵,下面分享一些自己遇到的问题,希望帮助大家
1.PageHelper分页原理
PageHelper的分页原理其实很简单,主要是利用PageHelper.startPage(pageNum, pageSize)这个语句,这句代码其实相当于在我们的SQL语句中拼接了limit 关键字,但是有一点要特别注意PageHelper.startPage()必须放在我们要执行的SQL前面,因为如果我们有多个查询语句的话,会抢占掉这个分页,所以最好将startPage()和你要分页的SQL放在一起,如例:
PageHelper.startPage(pageNum, pageSize);
List<Task> taskList = taskMapper.selectByExample(taskExampl
这个第一个需要重视的点
2.可能存在的问题
使用PageHelper进行分页,一般会出现两种问题,第一种是分页无效,这种就是因为有其他的SQL查询语句抢占了分页,这种我上面说过了,将分页语句和要查询的SQL语句放在一起就能解决,下面主要说第二种可能会出现的问题
在开发中,我们一般会将数据封装成我们定义过的pojo对象,直接返回给前端,但在实际开发中,我们一般只返回前端需要的数据,所以这时候,一般会定义一个vo的类,这个vo中有我们pojo类中的部分字段,还有一些我们自定义的、需要在页面渲染的数据,如下例子:
public class MediaTaskVO extends MonitorOneMachineMedia {
/**
* 审核人员id列表
*/
private List<Long> reviewUserId;
}
public class MonitorOneMachineMedia implements Serializable {
@ApiModelProperty(value="id主键id")
private Long id;
@ApiModelProperty(value="tenantId所属租户id")
private Long tenantId;
@ApiModelProperty(value="name名称/标题")
private String name;
@ApiModelProperty(value="type类型: 0-视频 1-图片")
private Integer type;
private static final long serialVersionUID = 1L;
}
这时候我们需要将分页的数据包装成MediaTaskVO返回给前端进行渲染
List<MediaTaskVO> mediaVOList = new ArrayList<>();
mediaList.forEach(u -> {
MediaTaskVO vo = new MediaTaskVO();
BeanUtils.copyProperties(u, vo);
List<MonitorOneMachineUserAudit> userAuditList = userAuditMapper.selectByExample(MonitorOneMachineUserAuditExample
.newAndCreateCriteria()
.andStatusEqualTo(UserAuditStatusEnums.RUNNING.code())
.andMediaIdEqualTo(u.getId())
.example());
List<Long> userIdList =userAuditList.stream().map(MonitorOneMachineUserAudit::getUserId).collect(Collectors.toList());
vo.setReviewUserId(userIdList);
mediaVOList.add(vo);});
PageInfo<MediaTaskVO> pageInfo = new PageInfo<>(mediaVOList);
CommonPageResultDto commonPageResultDto = new CommonPageResultDto(pageInfo.getTotal(), (long) pageInfo.getPages(),pageInfo.getList());
return new CommonResultDto(CommonResultEnum.SUCCESS, commonPageResultDto);
注意,这样写会有问题的,你会发现你的页数永远是1,切记PageInfo传的一定要是你分页查询出来的数据列表,不能是封装的VOlist,正确的写法如下
PageInfo<MonitorOneMachineMedia> pageInfo = new PageInfo<>(mediaList);if (CollectionUtils.isEmpty(pageInfo.getList())) { return new CommonResultDto(CommonResultEnum.SUCCESS, new CommonPageResultDto(0L, 0L, null));}List<MediaTaskVO> mediaVOList = new ArrayList<>();mediaList.forEach(u -> { MediaTaskVO vo = new MediaTaskVO(); BeanUtils.copyProperties(u, vo); List<MonitorOneMachineUserAudit> userAuditList = userAuditMapper.selectByExample(MonitorOneMachineUserAuditExample .newAndCreateCriteria() .andStatusEqualTo(UserAuditStatusEnums.RUNNING.code()) .andMediaIdEqualTo(u.getId()) .example() ); List<Long> userIdList = userAuditList.stream().map(MonitorOneMachineUserAudit::getUserId).collect(Collectors.toList()); vo.setReviewUserId(userIdList); mediaVOList.add(vo);});CommonPageResultDto commonPageResultDto = new CommonPageResultDto(pageInfo.getTotal(), (long) pageInfo.getPages(), mediaVOList);return new CommonResultDto(CommonResultEnum.SUCCESS, commonPageResultDto);
我的分享到此为止,希望能帮助到大家