mybatis + PageHelper 實現分頁
如果你也在使用Mybatis,建議嘗試PageHelper外掛,這個一定是最方便使用的分頁外掛。
該外掛目前支援Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六種資料庫分頁。
PageHelper分頁外掛專案中的正式程式碼一共有個5個Java檔案,這5個檔案的說明如下:
1: Page<E>[必須]:分頁引數類,該類繼承ArrayList,雖然分頁查詢返回的結果實際型別是Page<E>,但是可以完全不出現所有的程式碼中,可以直接當成List使用。返回值不建議使用Page,建議仍然用List。如果需要用到分頁資訊,使用下面的PageInfo類對List進行包裝即可。
2: PageHelper[必須]:分頁外掛攔截器類,對Mybatis的攔截在這個類中實現。
3: PageInfo[可選]:Page<E>的包裝類,包含了全面的分頁屬性資訊。
4: SqlParser[可選]:提供高效的count查詢sql。主要是智慧替換原sql語句為count(*),去除不帶引數的order by語句。需要jsqlparser-0.9.1.jar支援。
5: SqlUtil[必須]:分頁外掛工具類,分頁外掛邏輯類,分頁外掛的主要實現方法都在這個類中
使用maven
新增如下依賴:
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>3.4.2</version> </dependency> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>0.9.1</version> </dependency>
在Mybatis配置xml中配置攔截器外掛:
<!--
plugins在配置檔案中的位置必須符合要求,否則會報錯,順序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper為PageHelper類所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<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="true"/>
</plugin>
</plugins>
其他五個引數說明:
-
-
增加dialect屬性,使用時必須指定該屬性,可選值為oracle,mysql,mariadb,sqlite,hsqldb,postgresql,沒有預設值,必須指定該屬性。
-
增加offsetAsPageNum屬性,預設值為false,使用預設值時不需要增加該配置,需要設為true時,需要配置該引數。當該引數設定為true時,使用RowBounds分頁時,會將offset引數當成pageNum使用,可以用頁碼和頁面大小兩個引數進行分頁。
-
增加rowBoundsWithCount屬性,預設值為false,使用預設值時不需要增加該配置,需要設為true時,需要配置該引數。當該引數設定為true時,使用RowBounds分頁會進行count查詢。
-
增加pageSizeZero屬性,預設值為false,使用預設值時不需要增加該配置,需要設為true時,需要配置該引數。當該引數設定為true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果(相當於沒有執行分頁查詢,但是返回結果仍然是Page型別)。
-
增加reasonable屬性,預設值為false,使用預設值時不需要增加該配置,需要設為true時,需要配置該引數。具體作用請看上面配置檔案中的註釋內容。
-
MyBatis框架
MyBatis是一個優秀的持久層框架,它對jdbc的操作資料庫的過程進行了封裝,使開發者只需要關注SQL本身,而不需要花費精力去處理例如驅動,建立connection,建立statement,手動設定引數,結果集檢索等jdbc繁雜的過程程式碼
Mybatis通過xml或註解的方式要執行statement配置起來,並通過java物件和statement中的sql進行對映生成最終執行的sql語句,最後由mybatis框架執行sql並將結果對映成java物件並返回。
這就是mybatis執行情況,那麼mybatis的外掛作用在哪一環節呢?它主要作用在Executor執行器與mappedeStatement之間,也就是說mybatis可以在外掛中獲得要執行的sql語句,在sql語句中新增limit語句,然後再去對sql進行封裝,從而可以實現分頁處理。
配置外掛:
現在開始在mybatis的全域性配置檔案SqlMapConfig.xml中配置外掛
引用配置
在sql查詢語句之前新增一行程式碼:
PageHelper.startPage(page, rows);
page為顯示第幾頁,rows為一頁顯示多少條資料。
就可以查詢分頁資訊。
舉個栗子:
PageHelper.startPage(page, rows); 是一個靜態的方法,在PageHelper原始碼:
歡迎關注公眾號