pageHelper分頁失效解決方案

2021-10-13 13:58:27 字數 2770 閱讀 1651

pagehelper是一款優秀的mybatis分頁外掛程式,在專案中可以非常便利的使用,使開發效率得到很大的提公升,但不支援一對多結果對映的分頁查詢,所以在平時的使用時,對於一對多分頁會出現分頁錯誤,這篇文章主要對pagehelper分頁錯誤進行重現以及提出解決方案。

使用者表【user】:11條資料

public class userdto
要求對資料進行分頁(每頁5條),獲得使用者資訊,每個使用者資訊帶出對應收貨資訊, 使用者id為2和3的使用者各有兩條收貨位址資訊,其餘沒有。期望結果如下

,,]

},,]},

,]}}

mybatis對映檔案

select

a.*,b.address,b.userid

from user a

left join address b on a.id=b.userid

然後我們使用pagehelper進行分頁,並輸出日誌

select count(0) from user a left join address b on a.id = b.userid

preparing: select a.*,b.address,b.userid from user a left join address b on a.id=b.userid limit ?

parameters: 5(integer)

total: 5

日誌分析

第1行:進行資料總數的查詢,作為資料的總條數total

第2-4行:進行分頁結果的查詢,查詢出5條資料

從日誌中可以看出

1. pagehelper外掛程式拼接後的sql語句就不會輸出正確的結果,更不會輸出符合期望的結果

2. pagehelper外掛程式分兩步查詢,第一步查詢出記錄總數,第二步查詢出分頁結果

service檔案

public listfindall());

return userlist;

}

mybatis對映檔案

select * from user

select * from address where userid=#

思路:使用mybatis的巢狀子查詢

select * from user

select a.* from address a where a.userid=#

與巢狀對映結構的resultmap格式基本一致,一對多查詢採用的依舊是collection,區別在於collection中多了select與column屬性,select用於載入子查詢對映語句的id,它會從column屬性指定的列中檢索資料,作為引數傳遞給目標select語句即子查詢。

缺點:這種方式雖然可以解決pagehelper一對多分頁的問題,但在大型資料表與資料集上效能表現不佳,即產生'1+n'問題。

輸出以下sql日誌:首先通過主查詢語句獲得主表的資料總量作為分頁的total,第二步通過limit獲得前5條分頁資料(就是『1』),第三步將第二步獲得結果作為引數通過子查詢獲得位址表的資訊(就是『n』)

preparing: select count(0) from user

parameters:

total: 1

preparing: select * from user limit ?

parameters: 5(integer)

preparing: select a.* from address a where a.userid=?

parameters: 1(integer)

total: 0

preparing: select a.* from address a where a.userid=?

parameters: 2(integer)

total: 2

preparing: select a.* from address a where a.userid=?

parameters: 3(integer)

total: 2

preparing: select a.* from address a where a.userid=?

parameters: 4(integer)

total: 0

preparing: select a.* from address a where a.userid=?

parameters: 5(integer)

total: 0

思路:棄用pagehelper外掛程式,自定義分頁查詢,先對主表(user)進行分頁,並把分頁結果作為虛擬表與副表(address)進行左連線查詢

select

a.*,

b.address,

b.userid

from

( select * from user limit # ) a

left join address b on a.id = b.userid

pageHelper分頁失效分析

方法一 public listselectunfinishedtransactionbypage2 pageableconditions param 方法二 public listselectunfinishedtransactionbypage pageableconditions param 上...

使用PageHelper分頁所遇分頁失效問題記錄

分頁兩種思路 pagehelper和rowbounds 這是因為所需分頁的查詢沒有在pagehelper.startpage方法後面的原因 以下是官方文件解釋 從碼雲clone request url?pagenum 1 pagesize 10 支援 servletrequest,map,pojo ...

PageHelper分頁實戰

1 首先pom檔案引入 com.github.pagehelper pagehelper 4.1.6 2 mybatisconfig.xml 處理 新增 listgetorderconfiglist param businesstype integer businesstype,param capi...