MyBatis攔截器分頁原理及PageHelper分頁外掛教學
閒來無事,特地整理了一下MyBatis攔截器實現分頁的原理。
地球人應該都知道要利用JDBC對資料庫進行操作,就需要一個statement物件,MyBatis也是如此。MyBatis在執行sql語句前會產生一個包含sql語句的Statement物件,而且對應的sql語句是在Statement之前產生的,所以我們就可以在MyBatis生成Statement之前對這個sql下手,分頁本質上是sql limit去獲取資料,所以只要我們在此對sql進行改造,就可以達到分頁的目的。那麼MyBatis攔截器是怎麼做到分頁的呢?
在Mybatis中Statement語句是通過RoutingStatementHandler物件的prepare方法生成的。所以利用攔截器實現Mybatis分頁的一個思路就是攔截StatementHandler介面的prepare方法,然後在攔截器方法中把Sql語句改成對應的分頁查詢Sql語句,之後再呼叫StatementHandler物件的prepare方法,即呼叫invocation.proceed()。對於分頁而言,在攔截器裡面我們還需要做的一個操作就是統計滿足當前條件的記錄一共有多少,這是通過獲取到了原始的Sql語句後,把它改為對應的統計語句再利用Mybatis封裝好的引數和設定引數的功能把Sql語句中的引數進行替換,之後再執行查詢記錄數的Sql語句進行總記錄數的統計。
如何在專案中使用呢?
下面安利一個分頁外掛。
PageHelper 已經在github上開源,可以自行搜尋一下。
1.如果使用了maven,那麼只要在pom.xml中引入該外掛即可,引入如下:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.4</version>
</dependency>
2.在mybatis的全域性配置檔案中配置該外掛
configuration>
<!-- 配置分頁外掛 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 設定資料庫型別 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六種資料庫-->
<property name="dialect" value="mysql"/>
</plugin >
</plugins>
</configuration>
3.在執行你的查詢之前。新增一行程式碼PageHelper.startPage(1, 10);第一個引數表示第幾頁,第二個引數表示每頁顯示的記錄數。然後本次查詢的結果就是分頁的結果。
例如:
//分頁處理,顯示第一頁的10條資料
PageHelper.startPage(1, 10);
List<Student> list = stuService.queryStu();
這個東西呢也不是說都好,在大點的專案呢。這個就有點雞肋了,因為它不支援條件查詢的sql。 當然,網上有改造後支援條件查詢的PageHelper,這個還是非常強大的。
https://pan.baidu.com/s/1eSxdMlc 支援條件查詢的PageHelper,內含jar包,可以通過maven -install安裝到本地倉庫使用
在下載的jar包下執行:
mvn install:install-file -Dfile=pagehelper-3.4.2-fix.jar -DgroupId=com.mybatis.pagehelper -DartifactId=pagehelper -Dversion=1.0 -Dpackaging=jar
<dependency>
<groupId>com.mybatis.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>1.0</version>
</dependency>