PageHelper 分頁外掛使用中的那些“坑”

小熊园地發表於2024-10-21

PageHelper 分頁外掛使用中的那些“坑”

引言

在專案開發過程中,分頁查詢是常見的需求之一。PageHelper 是一個 MyBatis 的分頁外掛,它能夠自動完成 MyBatis 的分頁功能。然而,在使用過程中可能會遇到一些問題,特別是當手動在 SQL 中使用了 LIMIT 進行分頁的情況下。本文將探討這些問題,並給出相應的解決辦法。

背景

假設我們的應用需要從資料庫中獲取分頁資料,我們決定使用 PageHelper 外掛來簡化分頁邏輯。但在實際使用中,我們發現即使沒有顯式地呼叫 PageHelper 的分頁方法,SQL 查詢中仍然出現了 LIMIT 子句,導致資料返回不正確。

問題描述

現象

  • 在沒有啟用 PageHelper 分頁功能的情況下,SQL 查詢語句中出現了 LIMIT 分頁子句。
  • 資料量大時,查詢結果不正確,只返回了部分資料。

原因分析

  • PageHelper 預設會在查詢之前自動新增分頁邏輯,如果沒有正確配置或禁用 PageHelper,它可能會干擾正常的 SQL 查詢。
  • 當在業務邏輯中手動新增了 LIMIT 子句時,PageHelper 會再次新增 LIMIT 導致重複分頁。

解決方案

檢查 PageHelper 是否已被正確配置

確認 PageHelper 已經被正確地新增到 MyBatis 的配置中,並且全域性分頁開關已開啟。

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>最新版本</version>
</dependency>

在 MyBatis 的全域性配置檔案中啟用 PageHelper。

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <property name="helperDialect" value="mysql"/>
        <property name="reasonable" value="true"/>
        <property name="supportMethodsArguments" value="true"/>
        <property name="params" value="count=countSql"/>
    </plugin>
</plugins>

正確使用 PageHelper

如果需要使用 PageHelper 進行分頁,確保在查詢之前正確呼叫 PageHelper.startPage() 方法。

int pageNum = 1; // 當前頁碼
int pageSize = 10; // 每頁顯示條數
PageHelper.startPage(pageNum, pageSize);
List<MyEntity> list = myMapper.selectAll();

禁用特定查詢的分頁功能

如果某個特定的查詢不需要分頁,可以在查詢之前呼叫 PageHelper.clearPage() 方法來清除當前的分頁狀態。

PageHelper.clearPage();
List<MyEntity> list = myMapper.selectAll();

避免手動新增 LIMIT

不要在 SQL 查詢中手動新增 LIMIT 子句,讓 PageHelper 自動處理分頁邏輯。

<select id="selectAll" resultType="MyEntity">
    SELECT * FROM my_table
    <!-- 不要在這裡手動新增 LIMIT -->
</select>

特別注意

// 請求引數
int pageNum = 1; // 當前頁碼
int pageSize = 10; // 每頁顯示條
SELECT * FROM my_table limit ?,? 
如果手動處理分頁,只要mapper中引數中包含pageNum pageNum 引數分頁外掛都會進行分頁。

總結

透過上述步驟,我們可以有效地避免 PageHelper 在不期望的時候進行分頁操作,從而保證查詢結果的準確性。在使用 PageHelper 時,一定要注意其配置和使用方法,確保不會影響到正常的 SQL 查詢邏輯。

結語

希望這篇文章能幫助你在使用 PageHelper 分頁外掛時少走彎路。如果你在實際應用中遇到了其他問題,歡迎在評論區留言交流。

相關文章