PageHelper通過PageInfo獲取total數(shù)據(jù)錯誤

說明

項目環(huán)境基于SpringBoot2.x + Mybatis3 + PageHelper5.x, 其他環(huán)境下是否有效未經(jīng)檢測.

使用Maven引入依賴, 在此只貼出PageHelper的依賴, 其他請自行配置.

PageHelper的依賴

<dependency>
            <groupId> com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.5</version>
</dependency>

Note

如果你使用xml配置mybatis, 網(wǎng)上可能有介紹加入如下配置

<!-- 配置mybatis的分頁插件PageHelper -->
<plugins>
            <!-- com.github.pagehelper為PageHelper類所在包名 -->
            <plugin interceptor="com.github.pagehelper.PageInterceptor">
            </plugin>
</plugins>
該配置在PageHelper5.x中會報錯, 直接刪除即可.

引言

項目中使用PageHelper進行分頁查詢, 結(jié)果集中攜帶total動態(tài)生成分頁標簽. 常規(guī)做法, 通過mapper獲取結(jié)果集List初始化PageInfo, 再調(diào)用getTotal方法得到總數(shù).

核心語句

//pageNum和pageSize自行獲取
PageHelper.startPage(pageNum, pageSize);
List<User> users= userService.getUsers();
PageInfo info = new PageInfo(list);
int total = info.getTotal();
在真正使用時, 會發(fā)現(xiàn)total的值并不等于數(shù)據(jù)庫中記錄總數(shù), 并且該值永遠等于查詢頁的記錄數(shù), 即getTotal和getSize()效果相同. 讀者若自行查看SQL日志, 可發(fā)現(xiàn)startPage()方法成功執(zhí)行, 返回的List是符合查詢條件的.

解決方法

在PageHelper的官方Github中, 有類似Issues, 但已關閉.

變更語句

Page page = PageHelper.startPage(pageNum, pageSize);
//使用page的getTotal()
int total = page.getTotal();

問題分析

Issues中有老哥認為通過PageInfo得到total的途徑是沒毛病的, 但問題確實發(fā)生了, 而且此方法能解決燃眉之急, 那我就來啃啃源碼探探究竟 :)

從PageInfo看起

/**
     * 包裝Page對象
     *
     * @param list
     */
    public PageInfo(List<T> list) {
        this(list, 8);
    }

    /**
     * 包裝Page對象
     *
     * @param list          page結(jié)果
     * @param navigatePages 頁碼數(shù)量
     */
    public PageInfo(List<T> list, int navigatePages) {
        super(list);
        if (list instanceof Page) {
            Page page = (Page) list;
            this.pageNum = page.getPageNum();
            this.pageSize = page.getPageSize();

            this.pages = page.getPages();
            this.size = page.size();
            //由于結(jié)果是>startRow的之剧,所以實際的需要+1
            if (this.size == 0) {
                this.startRow = 0;
                this.endRow = 0;
            } else {
                this.startRow = page.getStartRow() + 1;
                //計算實際的endRow(最后一頁的時候特殊)
                this.endRow = this.startRow - 1 + this.size;
            }
        } else if (list instanceof Collection) {
            this.pageNum = 1;
            this.pageSize = list.size();

            this.pages = this.pageSize > 0 ? 1 : 0;
            this.size = list.size();
            this.startRow = 0;
            this.endRow = list.size() > 0 ? list.size() - 1 : 0;
        }
        if (list instanceof Collection) {
            this.navigatePages = navigatePages;
            //計算導航頁
            calcNavigatepageNums();
            //計算前后頁,第一頁递沪,最后一頁
            calcPage();
            //判斷頁面邊界
            judgePageBoudary();
        }
    }
這部分不涉及total, 直接點開super()
public PageSerializable(List<T> list) {
        this.list = list;
        if(list instanceof Page){
            this.total = ((Page)list).getTotal();
        } else {
            this.total = list.size();
        }
    }
從源碼看出, 如果用結(jié)果集的List初始化PageInfo, total與size相等, 那么total與預期不符是自然而然的.

Page相關代碼下次補上

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸿捧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子购岗,更是在濱河造成了極大的恐慌屋吨,老刑警劉巖针贬,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赋兵,居然都是意外死亡笔咽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門霹期,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叶组,“玉大人,你說我怎么就攤上這事历造∷κ” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵吭产,是天一觀的道長侣监。 經(jīng)常有香客問我,道長臣淤,這世上最難降的妖魔是什么橄霉? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮邑蒋,結(jié)果婚禮上姓蜂,老公的妹妹穿的比我還像新娘按厘。我一直安慰自己,他們只是感情好覆糟,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布刻剥。 她就那樣靜靜地躺著遮咖,像睡著了一般滩字。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上御吞,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天麦箍,我揣著相機與錄音,去河邊找鬼陶珠。 笑死挟裂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的揍诽。 我是一名探鬼主播诀蓉,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼暑脆!你這毒婦竟也來了渠啤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤添吗,失蹤者是張志新(化名)和其女友劉穎沥曹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碟联,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡妓美,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鲤孵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壶栋。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖普监,靈堂內(nèi)的尸體忽然破棺而出贵试,到底是詐尸還是另有隱情,我是刑警寧澤鹰椒,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布锡移,位于F島的核電站,受9級特大地震影響漆际,放射性物質(zhì)發(fā)生泄漏淆珊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一奸汇、第九天 我趴在偏房一處隱蔽的房頂上張望施符。 院中可真熱鬧往声,春花似錦、人聲如沸戳吝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽听哭。三九已至慢洋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陆盘,已是汗流浹背普筹。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留隘马,地道東北人太防。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像酸员,于是被迫代替她去往敵國和親蜒车。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容