前言:
最近在工作中有个后台功能是对导入的excel文件中的数据进行读取后分页展示,读取excel数据保存到List集合中都比较容易,但在分页这里堵住了。因为公司Java服务采用的是SSM框架,而分页是统一采用的配合Mybatis的分页插件Pagehelper。所以问题来了,Pagehelper原理是在同一线程中对通过mybatis拦截器拦截查询数据库的sql语句并添加分页参数,之后实现分页查询,查询结束后在 finally 语句中清除ThreadLocal中的查询参数。因此现在这个业务场景使用pagehelper是无效的,需要寻求新的分页方案。
对List进行分页
主流的两种解决方案:
- 后端一次性返回所有list数据,前端使用JS对数据进行‘假分页’;
- 后端预先对数据进行分页处理再返回前端,前端通过传相应参数进行分页展示数据;
在跟前端同事协商,最后采用第二种方案,以下我将介绍这种对list数据物理分页的方法:
1、首先是一个分页工具类(其实和Pagehelper的PageInfo类很相似)
/**
* 对list数据进行分页工具类
*/
public class PageModel {
private int page = 1; // 当前页
public int totalPages = 0; // 总页数
private int pageRecorders;// 每页5条数据
private int totalRows = 0; // 总数据数
private int pageStartRow = 0;// 每页的起始数
private int pageEndRow = 0; // 每页显示数据的终止数
private boolean hasNextPage = false; // 是否有下一页
private boolean hasPreviousPage = false; // 是否有前一页
private List list;
// private Iterator it;
public PageModel(List list, int pageRecorders) {
init(list, pageRecorders);// 通过对象集,记录总数划分
}
/** */
/**
* 初始化list,并告之该list每页的记录数
* @param list
* @param pageRecorders
*/
public void init(List list, int pageRecorders) {
this.pageRecorders = pageRecorders;
this.list = list;
totalRows = list.size();
// it = list.iterator();
hasPreviousPage = false;
if ((totalRows % pageRecorders) == 0) {
totalPages = totalRows / pageRecorders;