帶你學習最簡單的分頁插件PageHelper
- 2019 年 11 月 10 日
- 筆記

正文
引言:
PageHelper是中國非常優秀的一款開源的mybatis分頁插件,它支援基本主流與常用的資料庫, 例如mysql、 oracle、mariaDB、 DB2、 SQLite、Hsqldb等。今天墨白就給大家聊聊PageHelper這款分頁插件,下面是PageHelper開源地址,感興趣的小夥伴可以去看一下
- PageHelper在 github 的項目地址:
https://github.com/pagehelper/Mybatis-PageHelper
- 先介紹一下這款插件PageHelper
- 官網地址:
https://pagehelper.github.io/
- 訪問官網後的頁面,官網裡面有詳細的Demo,今天我們來照著官網自己動手敲個Demo;

- 如何使用PageHelper?
1.在自己的項目添加依賴,maven項目在父工程添加最新版本,最新版本是5.1.8
1<dependency> 2 <groupId>com.github.pagehelper</groupId> 3 <artifactId>pagehelper</artifactId> 4 <version>5.1.8</version> 5</dependency>
2.在數據訪問層Spring 配置文件中配置攔截器插件,程式碼如下
1<bean class="org.mybatis.spring.SqlSessionFactoryBean"> 2 <property name="dataSource" ref="dataSource"/> 3 <!--配置PageHelper攔截器插件--> 4 <property name="plugins"> 5 <array> 6 <bean class="com.github.pagehelper.PageInterceptor"> 7 <property name="properties"> 8 <value> 9 helperDialect=mysql 10 reasonable=true 11 </value> 12 </property> 13 </bean> 14 </array> 15 </property> 16 </bean>
3.PageHelper分頁插件參數介紹
- 這裡我只介紹兩個常用的,詳細的可以去看官網API文檔
helperDialect:
分頁插件會自動檢測當前的資料庫鏈接,自動選擇合適的分頁方式。 你可以配置helperDialect屬性來指定分頁插件使用哪種方言。配置時,可以使用下面的縮寫值
1oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
特別注意:使用 SqlServer2012 資料庫時,需要手動指定為 sqlserver2012,否則會使用 SqlServer2005 的方式進行分頁。你也可以實現 AbstractHelperDialect,然後配置該屬性為實現類的全限定名稱即可使用自定義的實現方法。
reasonable:
分頁合理化參數,默認值為false。當該參數設置為 true 時,pageNum<=0 時會查詢第一頁, pageNum>pages(超過總數時),會查詢最後一頁。默認false 時,直接根據參數進行查詢。
4.在程式碼中使用的兩種方式:
- 第一種
1// 此語句後的第一個select查詢自動會被分頁 2PageHelper.startPage(1, 10); 3// 這裡的查詢會自動分頁 4List<Country> list = countryMapper.selectIf(1);
- 第二種
1//獲取第1頁,10條內容,默認查詢總數count 2PageHelper.startPage(1, 10); 3List<Country> list = countryMapper.selectAll(); 4//用PageInfo對結果進行包裝 5PageInfo page = new PageInfo(list); 6//測試PageInfo全部屬性 7//PageInfo源碼中可以看到包含了非常全面的分頁屬性 8assertEquals(1, page.getPageNum()); 9assertEquals(10, page.getPageSize()); 10assertEquals(1, page.getStartRow()); 11assertEquals(10, page.getEndRow()); 12assertEquals(183, page.getTotal()); 13assertEquals(19, page.getPages()); 14assertEquals(1, page.getFirstPage()); 15assertEquals(8, page.getLastPage()); 16assertEquals(true, page.isFirstPage()); 17assertEquals(false, page.isLastPage()); 18assertEquals(false, page.isHasPreviousPage()); 19assertEquals(true, page.isHasNextPage());
- 使用PageHelper
配置好了上面的坐標和Spring配置文件以後,我們直接開始使用PageHelper,,每個人的表數據可能都不一樣,大家根據需求自己來玩,程式碼如下
- Mapper介面
1/** 2 * CompanyMapper介面 3*/ 4public interface CompanyMapper { 5 //查詢全部 6 List<Company> findAll(); 7}- Mapper映射
1 <!--查詢全部--> 2 <select id="findAll" resultMap="BaseResultMap"> 3 select * from ss_company where companyId=#{companyId} 4</select>- Service介面
1public interface CompanyService { 2 // 分頁查詢 3 PageInfo<User> findByPage(int pageNum, int PageSize); 4 //查詢所有 5 List<Company> findAll(); 6}- impl實現
1 // 注入Mapper 2 @Autowired 3 private CompanyMapper companyMapper; 4 5@Override 6public PageInfo<Company> findByPage(int pageNum, int pageSize) { 7 // 開始分頁, PageHelper組件會自動對其後的第一條查詢查詢分頁 8 PageHelper.startPage(pageNum,pageSize); 9 // 調用dao查詢 10 List<Company> list = companyMapper.findAll(); 11 // 創建PageInfo對象封裝分頁結果,傳入查詢集合。會自動計算分頁參數 12 PageInfo<Company> pageInfo = new PageInfo<>(list); 13 return pageInfo; 14}- 單元測試
1@RunWith(SpringJUnit4ClassRunner.class) 2@ContextConfiguration("classpath*:spring/applicationContext-*.xml") 3public class UserServiceImplTest { 4 // 注入service 5 @Autowired 6 private CompanyService companyMapper; 7 8 @Test 9 public void findByPage(){ 10 PageInfo<User> pageInfo = companyMapper.findByPage(1, 2); 11 System.out.println(pageInfo); 12 } 13}- 測試結果:

控制器:每個人的Controller都不一樣,我這裡給個模板你們,不明白的可以在後台留言,或者是在群里提問,
僅作參考:
1 @Autowired 2 private CompanyService companyService; 3 4 @RequestMapping("/***") 5 public ModelAndView findByPage( 6 @RequestParam(defaultValue = "1") int pageNum, 7 @RequestParam(defaultValue = "5") int pageSize) { 8 9 ModelAndView mv = new ModelAndView(); 10 mv.addObject("pageInfo",pageInfo); 11 mv.setViewName("詳情列表"); 12 return mv; 13 } 14}
