1. 程式人生 > >mybatis 分頁外掛的使用

mybatis 分頁外掛的使用

首先,maven的依賴只是下載jar包而已,可以在其他地方下載jar包,無maven的情況下實現分頁需要三步

第一步:下載jar包匯入工程。

第二步:然後直接在mybatis中配置<plugins>

第三步:在需要分頁的service或者controller中,查詢語句前呼叫PageHelper.startPage(頁碼, 條數);

(此處需要注意一定要在需要的查詢前呼叫)

新增如下依賴:

  1. <dependency>
  2. <groupId>com.github.pagehelper</groupId>
  3. <artifactId>pagehelper</artifactId>
  4. <version>4.1.6</version>
  5. </dependency>

當使用maven中央庫中的快照版(帶"-SNAPSHOT"的版本)時,需要在pom.xml中新增如下配置:

  1. <repositories>
  2. <repository>
  3. <id>sonatype-nexus-snapshots</id>
  4. <name>Sonatype Nexus Snapshots</name>
  5. <url>http://oss.sonatype.org/content/repositories/snapshots</url>
  6. <releases>
  7. <enabled>false</enabled>
  8. </releases>
  9. <snapshots>
  10. <enabled>true</enabled>
  11. </snapshots>
  12. </repository>
  13. </repositories>

2. 在Mybatis配置mybatis-config.xml中配置攔截器外掛:

plugins外掛的配置在 settings之後 在environments之前

  1. <!--
  2. plugins在配置檔案中的位置必須符合要求,否則會報錯,順序如下:
  3. properties?, settings?,
  4. typeAliases?, typeHandlers?,
  5. objectFactory?,objectWrapperFactory?,
  6. plugins?,
  7. environments?, databaseIdProvider?, mappers?
  8. -->
  9. <plugins>
  10. <!-- com.github.pagehelper為PageHelper類所在包名 -->
  11. <plugin interceptor="com.github.pagehelper.PageHelper">
  12. <!-- 4.0.0以後版本可以不設定該引數 -->
  13. <property name="dialect" value="mysql"/>
  14. <!-- 該引數預設為false -->
  15. <!-- 設定為true時,會將RowBounds第一個引數offset當成pageNum頁碼使用 -->
  16. <!-- 和startPage中的pageNum效果一樣-->
  17. <property name="offsetAsPageNum" value="true"/>
  18. <!-- 該引數預設為false -->
  19. <!-- 設定為true時,使用RowBounds分頁會進行count查詢 -->
  20. <property name="rowBoundsWithCount" value="true"/>
  21. <!-- 設定為true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果 -->
  22. <!-- (相當於沒有執行分頁查詢,但是返回結果仍然是Page型別)-->
  23. <property name="pageSizeZero" value="true"/>
  24. <!-- 3.3.0版本可用 - 分頁引數合理化,預設false禁用 -->
  25. <!-- 啟用合理化時,如果pageNum<1會查詢第一頁,如果pageNum>pages會查詢最後一頁 -->
  26. <!-- 禁用合理化時,如果pageNum<1或pageNum>pages會返回空資料 -->
  27. <property name="reasonable" value="false"/>
  28. <!-- 3.5.0版本可用 - 為了支援startPage(Object params)方法 -->
  29. <!-- 增加了一個`params`引數來配置引數對映,用於從Map或ServletRequest中取值 -->
  30. <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置對映的用預設值 -->
  31. <!-- 不理解該含義的前提下,不要隨便複製該配置 -->
  32. <property name="params" value="pageNum=pageHelperStart;pageSize=pageHelperRows;"/>
  33. <!-- 支援通過Mapper介面引數來傳遞分頁引數 -->
  34. <property name="supportMethodsArguments" value="false"/>
  35. <!-- always總是返回PageInfo型別,check檢查返回型別是否為PageInfo,none返回Page -->
  36. <property name="returnPageInfo" value="none"/>
  37. </plugin>
  38. </plugins>

pageHelper會使用ThreadLocal獲取到同一執行緒中的變數資訊,各個執行緒之間的Threadlocal不會相互干擾,也就是Thread1中的ThreadLocal1之後獲取到Tread1中的變數的資訊,不會獲取到Thread2中的資訊

所以在多執行緒環境下,各個Threadlocal之間相互隔離,可以實現,不同thread使用不同的資料來源或不同的Thread中執行不同的SQL語句

所以,PageHelper利用這一點通過攔截器獲取到同一執行緒中的預編譯好的SQL語句之後將SQL語句包裝成具有分頁功能的SQL語句,並將其再次賦值給下一步操作,所以實際執行的SQL語句就是有了分頁功能的SQL語句

PageHelper只對緊跟著的第一個SQL語句起作用

如上:所以若一個方法中涉及到多個查詢,需要小心,避免為不需要分頁的添加了分頁,而真正需要分頁的卻沒有被分頁

測試

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration(value = {"classpath:spring/spring-*.xml"})
  3. public class TestPageHelper {
  4. @Resource
  5. private TbItemMapper itemMapper;
  6. @Test
  7. public void testPageHelper() throws Exception {
  8. //2、設定分頁,第104頁,每頁顯示30條
  9. PageHelper.startPage(104, 30);
  10. //3、執行查詢
  11. TbItem item = new TbItem();
  12. List<TbItem> list = itemMapper.selectBySelective(item);
  13. //4、取分頁後結果
  14. PageInfo<TbItem> pageInfo = new PageInfo<>(list);
  15. int pageNum = pageInfo.getPageNum();
  16. System.out.println("當前是第幾頁:" + pageNum);
  17. int pageSize = pageInfo.getPageSize();
  18. System.out.println("當前頁最多顯示幾條:" + pageSize);
  19. int size = pageInfo.getSize();
  20. System.out.println("當前頁有幾條記錄:" + size);
  21. int startRow = pageInfo.getStartRow();
  22. System.out.println("當前頁開始記錄:" + startRow);
  23. int endRow = pageInfo.getEndRow();
  24. System.out.println("當前頁最後一條記錄:" + endRow);
  25. long total = pageInfo.getTotal();
  26. System.out.println("總共查出來多少條記錄:" + total);
  27. int pages = pageInfo.getPages();
  28. System.out.println("總共有多少頁:" + pages);
  29. }
  30. }

結果

  1. 當前是第幾頁:104
  2. 當前頁最多顯示幾條:30
  3. 當前頁有幾條記錄:6
  4. 當前頁開始記錄:3091
  5. 當前頁最後一條記錄:3096
  6. 總共查出來多少條記錄:3096
  7. 總共有多少頁:104