一、PageHelper簡介
PageHelper是 Mybatis 著名開發者的開源工具包,用於對分頁進行優化,PageHelper 在 Sql 執行過程中攔截 Sql 語句後自動進行分頁,將分頁語句封裝成了 Page 對象,並且完整支持多種方言,例如 Oracle、MySQL、PostgreSQL 等。
使用 PageHelper 可以讓我們不必關心複雜的分頁邏輯,只需要在配置文件中指定分頁參數即可,非常方便。
二、PageHelper入門使用
在使用 PageHelper 之前,需要先在 pom.xml 中引入相關依賴。
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>最新版本</version> </dependency> <!-- 數據庫驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>最新版本</version> </dependency>
在 SpringBoot 項目中,可以在 application.properties 文件中配置分頁插件:
# 開啟分頁插件 pagehelper.helper-dialect=mysql pagehelper.support-methods-arguments=true pagehelper.reasonable=false pagehelper.params=count=countSql
PageHelper 常用方法:
/** * 將 Page 對象傳入查詢接口,查詢結束後 Page 對象自動填充分頁信息 * @param page 分頁對象 * @param param 查詢參數 * @return 查詢結果集 */ List<T> selectByPage(Page<T> page, Map<String, Object> param); /** * 開始分頁。需要緊跟在 select 方法後面,下一句 SQL 語句會被分頁。 * @param pageNum 頁碼 * @param pageSize 分頁大小 */ PageHelper.startPage(pageNum, pageSize); /** * 分頁結束,釋放資源。 */ PageHelper.clearPage();
使用 PageHelper 進行分頁基本流程:
- 調用 PageHelper.startPage() 方法,傳入頁碼和分頁大小。
- 執行查詢,返回查詢結果。
- 調用 PageHelper.stopPage() 方法,釋放資源。
三、PageHelper高級使用
1. 多種分頁方式
PageHelper 支持兩種分頁方式:
- 物理分頁:查詢所有數據後進行分頁,使用簡單。
- 邏輯分頁:利用數據庫本身的 limit 和 offset 等功能分頁,查詢速度更快。
默認情況下 PageHelper 使用邏輯分頁,可以通過以下配置進行設置:
# 物理分頁開關。設置為 true 後,所有的分頁插件都會失效,變成物理分頁。 pagehelper.offset-as-page-num=true # 設置為 true 後,會將 RowBounds 第一個參數 offset 當成 pageNum 使用,可以用 RowBounds 實現物理分頁。 pagehelper.row-bounds-with-count=true # 默認值為 false,當該參數設置為 true 時,使用 RowBounds 分頁時,會進行 count 查詢。 pagehelper.row-bounds-with-count=true
2. 分頁攔截
PageHelper 支持自定義攔截器進行分頁邏輯拓展。繼承 Interceptor 接口,重寫干預方法,通過反射改寫原始 Sql 實現分頁功能。
// 定義自定義分頁插件的類 public class CustomPageHelper extends PageInterceptor { // 重寫進制的標籤名 @Override public String getLimitString(String sql, String s, int i, int i1) { return super.getLimitString(sql, "Tag_SG_limit", (i - 1) * i1, i1); } } // 配置類 @Configuration public class MybatisInterceptorConfig { @Bean public CustomPageHelper pageHelper() { CustomPageHelper pageHelper = new CustomPageHelper(); Properties properties = new Properties(); properties.setProperty("supportMethodsArguments", "true"); properties.setProperty("reasonable", "true"); properties.setProperty("returnPageInfo", "check"); properties.setProperty("params", "count=countSql"); pageHelper.setProperties(properties); return pageHelper; } } // Mapper 接口 @Mapper public interface UserMapper { @Select("SELECT * FROM user LIMIT #{pageNum},#{pageSize} Tag_SG_limit") List<User> selectAll(@Param("pageNum") int pageNum, @Param("pageSize") int pageSize); }
四、PageHelper優點和缺點
優點:
- 使用簡單,無需關注複雜分頁邏輯。
- 支持多種方言,適用範圍廣。
- 自定義攔截器可進行分頁邏輯拓展。
缺點:
- 雖然支持多種分頁方式,但默認使用邏輯分頁,影響速度。
- 分頁信息封裝在 Page 對象中,如果需要合併多個查詢結果,合併分頁信息比較麻煩。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/204672.html