先看一下pagehelper的簡單用法:
<dependency>
? ? <groupId>com.github.pagehelper</groupId>
? ? <artifactId>pagehelper-spring-boot-starter</artifactId>
? ? <version>1.2.5</version> 我使用的版本
</dependency> 依賴
首先要注冊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);
在看到PageInfo的字段(總頁數(shù)梭纹、第幾頁、是否第一頁、是否最后一頁等等)和PageInfo的用法時麻昼,我第一時間想到的是pagehelper不過是先把分頁需要的參數(shù)放到page里,再進行全查砸琅,再把所有數(shù)據(jù)丟到PageInfo里進行分頁渣锦,也沒什么厲害的欧芽。不過當我debugger時,發(fā)現(xiàn)查詢到的list數(shù)據(jù)只有一頁的條數(shù)朴摊,我之前的想法是不對的默垄。百度一下,網上說的是使用了mybatis的攔截器甚纲。
查詢發(fā)現(xiàn)有個PageInterceptor的實現(xiàn)類口锭,進去看看intercepter方法(攔截方法)
主要看這段代碼,有一個注解很顯眼://獲取分頁,跟進這個方法 dialect.getPageSql(ms, boundSql, parameter, rowBounds, pageKey);是接口Dialect的方法介杆,看下實現(xiàn)類AbstractHelperDialect?
往sql語句里加了orderby從句鹃操,再看下重置方法:
是個抽象方法,再看看子類的是怎么實現(xiàn)的
因為我使用的是mysql春哨,所以這里以mysql為例荆隘,實現(xiàn)類是MySqlDialect,可以看到分頁是在這里加上的赴背。
有一個疑問是為什么PageHelper.startPage方法要寫在查詢語句的前面
重載方法最全的一個椰拒,看下getLocalPage()方法,
可以看到pagehelper使用線程容器保存了分頁的數(shù)據(jù)癞尚,在使用攔截器的時候查詢線程容器里有沒有分頁數(shù)據(jù)耸三,有就添加分頁從句,沒有就什么也不用做浇揩。