PageHelper的深入了解
Posted 赵广陆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PageHelper的深入了解相关的知识,希望对你有一定的参考价值。
关于pageHeler这个插件很早就用过,但是没有过多的研究,今天再次封装写这个遇到了一个坑,获取查询总条数用pageInfo.getTotal()按道理是没问题的,但是今天用pageInfo.getTotal()获取的总是分页当前的数据条数,然后研究了一下发现使用这个插件中间
只能有一次进行查询的操作!
如果进行了两次查询操作就会让pageInfo.getTotal()获得的是当前查询的当前页的数据总条数,所以谨记!!比如说我在controller分的页的话,在service把数据库查询出来的数据循环一次,在传入给controller就会出现这个问题。
解决办法:先定义一个pageData把分页的信息set进去,rows最后再set,把最终循环之后的数据set金pageData就可以了。
基本使用:
PageHelper.startPage(1, 10);
Example example = new Example(Employee.class);
example.createCriteria().andEqualTo("employeeSex", "男");
List<Employee> list = employeeTKMapper.selectByExample(example);
PageInfo<Employee> pageinfo=new PageInfo<>(list);
先PageHelper.startPage(1, 10)
开始分页,再selectlist
查询数据库的时候会自动加上limit 1,10
,最后封装成PageInfo
的时候会自动带上页码、页大小、总数等。
问题引入情景:
@Autowired
private EmployeeService employeeService;
public ApiResult<PageInfo> getAllEmloyee() {
PageHelper.startPage(1, 3);
// 调用EmployeeService中的方法
List<Employee> list = employeeService.getAll();
PageInfo<Employee> pageInfo = new PageInfo<>(list);
return ApiResult.success(pageInfo);
}
12345678910
public List<Employee> getAll() {
Example example = new Example(Employee.class);
example.createCriteria().andEqualTo("employeeSex", "男");
List<Employee> list = employeeTKMapper.selectByExample(example);
return list;
}
简答说就是:在一个方法中使用PageHelper.startPage(1, 3)
,再调用另一个方法查询数据库
这样的结果:查询数据库也是会带上分页信息(已验证,你们可以自己去验证看一下)
这样我就在想,为什么PageHelper.startPage(1, 3)
会有这么大能力呢?
看一下源码
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
/**
* 设置 Page 参数
*
* @param page
*/
protected static void setLocalPage(Page page) {
LOCAL_PAGE.set(page);
}
这是setLocalPage()
方法,LOCAL_PAGE
是当前线程,通常存储数据为了在同一个线程中都可以访问到
这里的意思就是 将分页信息保存在当前线程中
看到这里就豁然开朗了,解释了上面为什么在另一个方法中执行selectlist
的时候也会自动加上分页信息
因为当前请求就对应一个线程,虽然是方法之间存在调用,但是他们还是处于同一个线程中,共享ThreadLocal
中的数据
至于为什么PageHelper.startPage(1, 3)
就可以达到分页效果,这里不做详细的源代码解读(我也没看过…)
但是我觉得大致流程就是:
分页插件的使用,首先是在Mybatis里面配置了分页拦截器(PageInterceptor),即在执行相关Sql之前会拦截做一点事情;
所以应该就是在执行selectlist
的时候,会自动为sql加上limit 1,3
还有一点就是使用了PageHelper.startPage
,selectlist
查询之后赋值给的List<Employee> list
这个list可以Debug看一下是Page<Employee>
类型
再看一下,Page类是ArrayList子类
所以在new PageInfo<>(list)
的时候可以把页码、页大小、总页数等信息给pageinfo
可以看一下,new PageInfo<>(list)
源码
这又让我想到了,如果把PageHelper.startPage(1, 3)
去掉,将查询出来的list,再new PageInfo<>(list)
没有PageHelper.startPage(1, 3)
,查询的list是ArrayList类型:所以肯定就是走下面的
else if (list instanceof Collection)...
以上是关于PageHelper的深入了解的主要内容,如果未能解决你的问题,请参考以下文章
mybatis—动态代理getMapper传入参数输出结果动态sql以及扩展的PageHelper分页
mybatis—动态代理getMapper传入参数输出结果动态sql以及扩展的PageHelper分页
mybatis—动态代理getMapper传入参数输出结果动态sql以及扩展的PageHelper分页