PageHelper的深入了解

简介: 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)...

目录
相关文章
|
SQL 安全 Java
SpringData JPA(2)
SpringData JPA(2)
109 1
|
3月前
springboot2.4.5使用pagehelper分页插件
springboot2.4.5使用pagehelper分页插件
|
4月前
|
前端开发 Java 数据格式
Springbooot整合mybatis-pageHelper
Springbooot整合mybatis-pageHelper
39 1
|
4月前
pagehelper分页插件
pagehelper分页插件
53 0
|
SQL 缓存 JavaScript
PageHelper 使用中的一些坑
PageHelper 使用中的一些坑
PageHelper 使用中的一些坑
|
存储 NoSQL Java
SpringData JPA(1)
SpringData JPA(1)
93 0
|
SQL Java 数据库连接
PageHelper分页插件的使用
PageHelper分页插件的使用
199 0
|
Oracle 关系型数据库 Java
|
SQL 前端开发 Java
7、PageHelper分页介绍
查询要实现分页、会存在多表关联查询,所以建议使用mybatis实现我的课程查询。 单表查询直接用Spring Data JPA,多表关联查询使用Mybatis有利于后期优化处理。
239 0
7、PageHelper分页介绍
|
SQL Java 数据库连接
SpringData JPA(提升篇)
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
110 0
SpringData JPA(提升篇)