分页是项目经常用到的,一般都选择使用pagehelper 来进行处理
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.1</version>
</dependency>
1 真分页: 即每次只从数据库取到相应的数据,然后返回,这样可以性能要比假分页高一些
@Override
public IPage<TimeTemplateVo> page(PageTimeTemplateBo bo) {
boolean isSysAdmin = isSystemAdmin(null);
PageHelper.startPage(bo.getPageNum(), bo.getPageSize());
List<TimeTemplateVo> timeTemplateVos = timeTemplateMapper.findPage(bo,isSysAdmin,CurrentUserUtil.currentUserId());
PageInfo<TimeTemplateVo> pageInfo = new PageInfo<TimeTemplateVo>(timeTemplateVos);
if (CollectionUtil.isEmpty(timeTemplateVos)) {
return new Page<>();
}
//转换分页类
Page<TimeTemplateVo> timeTemplateVoPage = new Page<>();
timeTemplateVoPage.setTotal(pageInfo.getTotal());
timeTemplateVoPage.setRecords(pageInfo.getList());
timeTemplateVoPage.setSize(pageInfo.getSize());
return timeTemplateVoPage;
}
随便粘贴一个例子,这里面 执行后,会打印出limit 则为直接从mysql 进行了limit 拼接处理
2 假分页: 即查询数据库中符合条件的所有数据,然后在模型层,自己对list结果进行处理为相应的分页效果,主要用list.sublist 实现
/**
* @Description: 手动实现分页
* @param list 所有数据
* @param pageNum 分页页码
* @param pageSize 分页条数
**/
public <T> PageInfo<T> startPage(List<T> list, Integer pageNum, Integer pageSize) {
//创建Page类
com.github.pagehelper.Page page = new com.github.pagehelper.Page(pageNum, pageSize);
//为Page类中的total属性赋值
page.setTotal(list.size());
//计算当前需要显示的数据下标起始值
int startIndex = (pageNum - 1) * pageSize;
int endIndex = Math.min(startIndex + pageSize, list.size());
//从链表中截取需要显示的子链表,并加入到Page
page.addAll(list.subList(startIndex,endIndex));
//以Page创建PageInfo
PageInfo pageInfo = new PageInfo<>(page);
return pageInfo;
}
// 调用完 再进行封装
Page<DeviceOfflineStatisticsVo> deviceOfflineStatisticsVoPage = new Page<>();
deviceOfflineStatisticsVoPage.setTotal(pageInfo.getTotal());
deviceOfflineStatisticsVoPage.setRecords(pageInfo.getList());
deviceOfflineStatisticsVoPage.setSize(pageInfo.getSize());
return deviceOfflineStatisticsVoPage;
真假分页概念,这是我认为的,相比大家看完文章已经清楚了,真分页性能确实更好,但是有时候假分页更适合
假分页的场景一般使用在,查询的数据集合,需要特殊处理.比如数据的排序需要经过复杂的计算,而且用此字段来排序,那么假分页就会更加适用