pagehelper是一个非常简单实用的分页插件,但是还是有一个小坑在里面的,话不多说,直接上干货。
1. 分页的使用
PageInfo<T> pageInfo = PageHelper.startPage(pageNum,pageSize).doSelectPageInfo(() -> mapper.query());
参数说明: pageNum 第几页
pageSize 一页显示数量
这样就实现了SQL的分页,pagehelper会在SQL中自动加上分页的信息(limit)。
如果不习惯使用lamabda表达式,下面的代码也一样可以实现分页。
PageHelper.startPage(pageNum,pageSize);
PageInfo<T> pageInfo = new PageInfo<>(mapper.query());
注意,PageHelper.startPage()
方法调用以后,后面必须有一个Mapper的查询方法,必须被消费掉。否则会由于ThreadLocal的原因,当线程被其他方法调用时被分页。
2. 小心避坑
这个坑就是“ 某些情况下,我明明没有使用PageHelper.startPage()
方法,但是我的SQL为什么分页了?”
引起这个情况的可能有两种原因:
① 上一个PageHelper.startPage()
未被消费
简单来讲,你上面的代码调用了PageHelper.startPage()
方法,但是后面没有一个Mapper的查询方法来消费掉。所以你的这个查询就用到了上一个的分页。
② 你的传参对象的分页字段是pageNum和pageSize
划重点,这个才是真正的坑。只要你的传参对象的分页字段是pageNum和pageSize,你不需要调用PageHelper.startPage()
方法,pagehelper就会帮你实现分页,因为pageNum和pageSize是PageHelper.startPage()
方法的参数。
public static <E> Page<E> startPage(int pageNum, int pageSize) {
return startPage(pageNum, pageSize, true);
}
所以,为了避免这种情况的出现,请不要给你的分页字段起这两个名字。pageNumber和pageCount就很不错。