mybatis的分页组件github.pagehelper使用问题
注意,这个分页下标是从1开始的。
查源码:com.github.pagehelper.Page
构造方法:
这里面的calculateStartAndEndRow方法是计算开始下标的,看实现:
/** * 计算起止行号 */ private void calculateStartAndEndRow() { this.startRow = this.pageNum > 0 ? (this.pageNum - 1) * this.pageSize : 0; this.endRow = this.startRow + this.pageSize * (this.pageNum > 0 ? 1 : 0); }
就是说传入PageNum=0时startRow=0,
pageNum=1时startRow=(pageNum-1)*pageSize=0
两个值的startRow都是0,所以说下标是从1开始。
Page的优雅用法,所谓优雅,就是用泛型,不强转。
首先要清楚的是,一旦被pagehelper拦截了,Mapper类返回的就是com.github.pagehelper.Page对象了,但我们为满足我们的一点原生态的心,还是把返回对象定义成java.util.List。
为了不强转,先把这里直接定义成Page吧,如:
public Page
在业务层(Service)可能我们又不能直接返回DTO,还要把这个Page里的东西转换下格式,怎么办呢?
//先取正常的DTO,如:
Page
//遍历并转换resultList,成List
//关键点,返回新的Page对象,如下:
Page rstPage = new Page(); rstPage.addAll(rstList); rstPage.setPageNum(resultList.getPageNum()); rstPage.setPageSize(resultList.getPageSize()); rstPage.setTotal(resultList.getTotal()); rstPage.setPages(resultList.getPages()); return rstPage;
这里没有用到强转吧
pagehelper注入问题:
PageHelper.startPage(pageNum, pageSize);
有了上面这行代码,注意后面的sql都会被加limit 10,而如果你的sql代码里已经有limit ,那么就会报错了。所以把你有limit 的sql放到这行代码的上面去。