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 分頁外掛時少走彎路。如果你在實際應用中遇到了其他問題,歡迎在評論區留言交流。