mysql分页原理,pagehelper分页原理浅析

先看一下pagehelper的简单用法:

com.github.pagehelper

pagehelper-spring-boot-starter

1.2.5 我使用的版本

依赖

首先要注册pagehelper:

@Bean

public PageHelpercreatePaeHelper(){

PageHelper page=new PageHelper();

return page;

}

使用:

PageHelper.startPage(page, limit);

List list =customerSubMapper.findCustAndSubInfo(status, custid, subid, name, d1, d2);

PageInfo pageInfo =new PageInfo<>(list);

1afdad7ec881

PageInfo的字段

在看到PageInfo的字段(总页数、第几页、是否第一页、是否最后一页等等)和PageInfo的用法时,我第一时间想到的是pagehelper不过是先把分页需要的参数放到page里,再进行全查,再把所有数据丢到PageInfo里进行分页,也没什么厉害的。不过当我debugger时,发现查询到的list数据只有一页的条数,我之前的想法是不对的。百度一下,网上说的是使用了mybatis的拦截器。

1afdad7ec881

mybatis的拦截器

查询发现有个PageInterceptor的实现类,进去看看intercepter方法(拦截方法)

1afdad7ec881

主要看这段代码,有一个注解很显眼://获取分页,跟进这个方法 dialect.getPageSql(ms, boundSql, parameter, rowBounds, pageKey);是接口Dialect的方法,看下实现类AbstractHelperDialect

1afdad7ec881

往sql语句里加了orderby从句,再看下重置方法:

1afdad7ec881

是个抽象方法,再看看子类的是怎么实现的

1afdad7ec881

MySqlDialect

因为我使用的是mysql,所以这里以mysql为例,实现类是MySqlDialect,可以看到分页是在这里加上的。

有一个疑问是为什么PageHelper.startPage方法要写在查询语句的前面

1afdad7ec881

重载方法最全的一个,看下getLocalPage()方法,

1afdad7ec881

1afdad7ec881

可以看到pagehelper使用线程容器保存了分页的数据,在使用拦截器的时候查询线程容器里有没有分页数据,有就添加分页从句,没有就什么也不用做。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值