mybatis 分頁外掛的使用
阿新 • • 發佈:2018-12-10
首先,maven的依賴只是下載jar包而已,可以在其他地方下載jar包,無maven的情況下實現分頁需要三步
第一步:下載jar包匯入工程。
第二步:然後直接在mybatis中配置<plugins>
第三步:在需要分頁的service或者controller中,查詢語句前呼叫PageHelper.startPage(頁碼, 條數);
(此處需要注意一定要在需要的查詢前呼叫)
新增如下依賴:
- <dependency>
- <groupId>com.github.pagehelper</groupId>
- <artifactId>pagehelper</artifactId>
- <version>4.1.6</version>
- </dependency>
當使用maven中央庫中的快照版(帶"-SNAPSHOT"
的版本)時,需要在pom.xml中新增如下配置:
- <repositories>
- <repository>
- <id>sonatype-nexus-snapshots</id>
- <name>Sonatype Nexus Snapshots</name>
- <url>http://oss.sonatype.org/content/repositories/snapshots</url>
- <releases>
- <enabled>false</enabled>
- </releases>
- <snapshots>
- <enabled>true</enabled>
- </snapshots>
- </repository>
- </repositories>
2. 在Mybatis配置mybatis-config.xml中配置攔截器外掛:
plugins外掛的配置在 settings之後 在environments之前
- <!--
- plugins在配置檔案中的位置必須符合要求,否則會報錯,順序如下:
- properties?, settings?,
- typeAliases?, typeHandlers?,
- objectFactory?,objectWrapperFactory?,
- plugins?,
- environments?, databaseIdProvider?, mappers?
- -->
- <plugins>
- <!-- com.github.pagehelper為PageHelper類所在包名 -->
- <plugin interceptor="com.github.pagehelper.PageHelper">
- <!-- 4.0.0以後版本可以不設定該引數 -->
- <property name="dialect" value="mysql"/>
- <!-- 該引數預設為false -->
- <!-- 設定為true時,會將RowBounds第一個引數offset當成pageNum頁碼使用 -->
- <!-- 和startPage中的pageNum效果一樣-->
- <property name="offsetAsPageNum" value="true"/>
- <!-- 該引數預設為false -->
- <!-- 設定為true時,使用RowBounds分頁會進行count查詢 -->
- <property name="rowBoundsWithCount" value="true"/>
- <!-- 設定為true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果 -->
- <!-- (相當於沒有執行分頁查詢,但是返回結果仍然是Page型別)-->
- <property name="pageSizeZero" value="true"/>
- <!-- 3.3.0版本可用 - 分頁引數合理化,預設false禁用 -->
- <!-- 啟用合理化時,如果pageNum<1會查詢第一頁,如果pageNum>pages會查詢最後一頁 -->
- <!-- 禁用合理化時,如果pageNum<1或pageNum>pages會返回空資料 -->
- <property name="reasonable" value="false"/>
- <!-- 3.5.0版本可用 - 為了支援startPage(Object params)方法 -->
- <!-- 增加了一個`params`引數來配置引數對映,用於從Map或ServletRequest中取值 -->
- <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置對映的用預設值 -->
- <!-- 不理解該含義的前提下,不要隨便複製該配置 -->
- <property name="params" value="pageNum=pageHelperStart;pageSize=pageHelperRows;"/>
- <!-- 支援通過Mapper介面引數來傳遞分頁引數 -->
- <property name="supportMethodsArguments" value="false"/>
- <!-- always總是返回PageInfo型別,check檢查返回型別是否為PageInfo,none返回Page -->
- <property name="returnPageInfo" value="none"/>
- </plugin>
- </plugins>
pageHelper會使用ThreadLocal獲取到同一執行緒中的變數資訊,各個執行緒之間的Threadlocal不會相互干擾,也就是Thread1中的ThreadLocal1之後獲取到Tread1中的變數的資訊,不會獲取到Thread2中的資訊
所以在多執行緒環境下,各個Threadlocal之間相互隔離,可以實現,不同thread使用不同的資料來源或不同的Thread中執行不同的SQL語句
所以,PageHelper利用這一點通過攔截器獲取到同一執行緒中的預編譯好的SQL語句之後將SQL語句包裝成具有分頁功能的SQL語句,並將其再次賦值給下一步操作,所以實際執行的SQL語句就是有了分頁功能的SQL語句
PageHelper只對緊跟著的第一個SQL語句起作用
如上:所以若一個方法中涉及到多個查詢,需要小心,避免為不需要分頁的添加了分頁,而真正需要分頁的卻沒有被分頁
測試
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(value = {"classpath:spring/spring-*.xml"})
- public class TestPageHelper {
- @Resource
- private TbItemMapper itemMapper;
- @Test
- public void testPageHelper() throws Exception {
- //2、設定分頁,第104頁,每頁顯示30條
- PageHelper.startPage(104, 30);
- //3、執行查詢
- TbItem item = new TbItem();
- List<TbItem> list = itemMapper.selectBySelective(item);
- //4、取分頁後結果
- PageInfo<TbItem> pageInfo = new PageInfo<>(list);
- int pageNum = pageInfo.getPageNum();
- System.out.println("當前是第幾頁:" + pageNum);
- int pageSize = pageInfo.getPageSize();
- System.out.println("當前頁最多顯示幾條:" + pageSize);
- int size = pageInfo.getSize();
- System.out.println("當前頁有幾條記錄:" + size);
- int startRow = pageInfo.getStartRow();
- System.out.println("當前頁開始記錄:" + startRow);
- int endRow = pageInfo.getEndRow();
- System.out.println("當前頁最後一條記錄:" + endRow);
- long total = pageInfo.getTotal();
- System.out.println("總共查出來多少條記錄:" + total);
- int pages = pageInfo.getPages();
- System.out.println("總共有多少頁:" + pages);
- }
- }
結果
- 當前是第幾頁:104
- 當前頁最多顯示幾條:30
- 當前頁有幾條記錄:6
- 當前頁開始記錄:3091
- 當前頁最後一條記錄:3096
- 總共查出來多少條記錄:3096
- 總共有多少頁:104