使用PageHelper遇到的問題

2021-09-27 13:32:42 字數 1825 閱讀 4115

在mybatis結合pagehelper分頁工具使用時,可以節省不少**與時間,但也有可能碰到一些問題。以下會記錄使用時遇到的坑。

(一)在mybatis使用collection對映一對多關係的結果集時,pageinfo返回的total總數錯誤

錯誤案例(只貼關鍵部分**):

service層:

@service

public class teacherservice

}

<?xml version="1.0" encoding="utf-8"?>

select * from teacher t1 join class t2 on t1.tid = t2.tid join student t3 on t2.cid = t3.cid

說明:有對應資料庫表結構的teacher、class、student三個實體類,teacher類與class類的關係為一對多,class類與student類的關係為一對多,所以乙個老師擁有多個班級的多個學生。在xml檔案裡對映乙個結果集,然後用sql查出老師對應的班級以及學生的資訊(這裡定義了三個返回dto實體類)。

直接sql查資料庫返回的結果:

使用postman測試介面返回的分頁結果:

為了直觀,返回資料壓縮在一起,我們可以看到,從預想的結果應該是返回的total總數是2條的,因為只有2位老師,但這裡分頁後返回的卻是5條;因為取的是join從表後的全部資料總數,而不是teacher主表的總數,所以會出現total總數錯誤。

解決辦法:

<?xml version="1.0" encoding="utf-8"?>

select * from teacher

select t1.* from class t1 join teacher t2 on t1.tid = t2.tid where t1.tid = #

select t1.* from student t1 join class t2 on t1.cid = t2.cid where t1.cid = #

說明:這裡collection中不能再使用resultmap屬性,應該使用oftype屬性;

column屬性表示根據哪個字段查詢,假如需要根據多個字段查詢,比如根據cid和tid查詢,可寫成column="",=等號左邊指傳遞查詢的引數名稱,=等號右邊指資料庫的欄位名稱,只有乙個引數的時候可以只寫傳遞查詢的引數名稱;

select屬性代表著當執行完selectlistbypage後,接著根據第一步得到的tid執行selectclasslistbytid,最後再根據第二步得到的cid執行selectstudentlistbycid;

但上面的解決辦法也會產生乙個問題—n+1問題:簡單形容就是當從主表(比如teacher表)執行一次查詢時,得到n條資料,那麼這時從表(比如class表)可能就需要執行n次查詢,這樣會造成資料庫較大的開銷。

可以通過設定日誌列印,更加直觀地看到n+1這個問題:

但其實可以通過設定懶載入機制去解決,這裡不作講解!

所以綜上所述,在涉及分頁的場景時,個人認為採取原生sql分頁的方式最適當,可檢視另外一篇文章!

pagehelper的使用遇到的坑

其實關於pagehelper分頁實在沒有什麼坑值得跳的,因為相關技術成熟而且介紹使用方法的文章網上一堆,更重要的是pagehelper本身使用起來也很簡單方便 pagehelper.startpage pagenum,pagesize 引數乙個指頁碼,就是第幾頁,乙個指頁面有多少條資料。如果圖省事就...

使用pageHelper所遇到的問題及解決方法

問題2問題3 jsp頁面分頁 第一次使用該外掛程式確實帶來了許多問題 配置pagehelper時,沒有注意版本問題,pagehelper4.x.x.jar和pagehelper5.x.x.jar 配置檔案是由區別的 pagehelper4.x.x.jar 配置 factory class org.m...

Pagehelper外掛程式的使用

第一步 將工程匯入到eclipse裡面 第二步 斷開和svn的連線 第三步 將工程安裝到本地倉庫中就變成了乙個jar包,然後引用他的路徑即可使 第四步 需要對page在sqlmapconfig.xml中配置plugins 還有使用的什麼資料庫 方言和資料庫 第五步 需要在pom檔案配置 不記得在 配...