Mybatis分頁插件PageHelper使用詳解

分頁是項目中經常會使用到的功能,我們可以自己手動在sql語句中進行分頁,但是這樣比較麻煩,Mybatis的PageHelper插件可以很好的幫助我們實現分頁功能。

添加maven依賴

在對應工程的pom.xml文件中添加

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>4.0.0</version>
</dependency>

配置攔截器

在mybatis-config.xml文件中添加分頁插件

<plugins>
    <!-- com.github.pagehelper為PageHelper類所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageHelper">
        <!-- 4.0.0以后版本可以不設置該參數 -->
        <property name="dialect" value="mysql"/>
        <!-- 該參數默認為false -->
        <!-- 設置為true時,會將RowBounds第一個參數offset當成pageNum頁碼使用 -->
        <!-- 和startPage中的pageNum效果一樣-->
        <property name="offsetAsPageNum" value="true"/>
        <!-- 該參數默認為false -->
        <!-- 設置為true時,使用RowBounds分頁會進行count查詢 -->
        <property name="rowBoundsWithCount" value="true"/>
        <!-- 設置為true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果 -->
        <!-- (相當于沒有執行分頁查詢,但是返回結果仍然是Page類型)
        <property name="pageSizeZero" value="true"/>-->
        <!-- 3.3.0版本可用 - 分頁參數合理化,默認false禁用 -->
        <!-- 啟用合理化時,如果pageNum<1會查詢第一頁,如果pageNum>pages會查詢最后一頁 -->
        <!-- 禁用合理化時,如果pageNum<1或pageNum>pages會返回空數據 -->
        <property name="reasonable" value="true"/>
        <!-- 3.5.0版本可用 - 為了支持startPage(Object params)方法 -->
        <!-- 增加了一個`params`參數來配置參數映射,用于從Map或ServletRequest中取值 -->
        <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認值 -->
        <!-- 不理解該含義的前提下,不要隨便復制該配置 
        <property name="params" value="pageNum=start;pageSize=limit;"/>    -->
    </plugin>
  </plugins>

參數配置選擇

列舉一些可能會用到某些參數的場景

  • 分頁插件對RowBounds支持和Mybatis默認的方式是一致的,默認情況下不會進行count查詢,如果想在分頁查詢時進行count查詢,以及使用更強大的PageInfo類,需要設置該參數為true
  • 如果覺得RowBounds中的兩個參數offset和limit不如pageNum和PageSize容易理解,可以設置offsetAsPageNum參數為true,offset會當成pageNum使用,limit和pageSize含義相同
  • 如果即使使用了分頁,但是仍然想通過控制參數查詢出全部的結果,可以設置pageSizeZero為true,就可以通過設置pageSize=0或者RowBounds.limt=0查詢出全部的結果
  • 如果在使用分頁查看列表式的數據時,希望用戶輸入的頁碼即使不在合法范圍內(第一頁到最后一頁之外),也能夠看到正確的結果,可以設置reasonable為true,這時如果pageNum<1會查詢第一頁,pageNum>總頁碼會查詢最后一頁

具體使用

RowBounds方式調用

使用這種調用方式時,用RowBounds參數進行分頁,侵入性最小,只是使用了這個參數,沒有增加其他內容。當分頁插件檢測到使用了RowBounds參數時,就會對該查詢進行物理分頁

public DaoQueryResultVO<MemberBasicEntity> queryList(MemberBasicEntity entity, int startPage, int pageSize) throws CcpException
{
    SqlSession sqlSession = CcpDB.getInstance().getSession();
    Map<String, Object> map = new HashMap<String, Object>();

    try
    {
        String statement = TMemberDAO.NAME_SPACE + ".queryList";//映射sql的標識字符串
        if (entity != null)
        {
            map.put("tMember", entity.getMember());
            map.put("tClub", entity.getMainClub());
        }

        List<MemberBasicEntity> list = sqlSession.selectList(statement, map, new RowBounds(startPage, pageSize));
        return new DaoQueryResultVO<MemberBasicEntity>(list);
    }
    catch (Exception e)
    {
        CcpLogger.getInstance().error(e, "TMemberDAO.queryList, " + map);
        throw new CcpException(CcpErrorCode.ERROR_MEMBER_DAO_DB_ERROR, e);
    }
    finally
    {
        CcpDB.getInstance().closeSession();
    }
}

因為分頁查詢結果返回的是一個Page對象,Page對象繼承自ArrayList,同時自身也擴展了屬性。但如果我們直接返回Page對象的話,在一些場景下會遇到問題,比如JSON處理Page類型的結果時,會被當成List來JSON格式化,就會丟棄Page對象的所有擴展屬性。所以這里我們將分頁的結果Page類型轉換成我們自己定義的一個類型DaoQueryResultVO,它繼承自PageInfo,包含了一個List屬性來保存分頁查詢出來的結果。PageInfo是插件提供給我們的,可以作為返回值,這里我們再用DaoQueryResultVO繼續封裝了一下,將PageInfo中的結果集由Page類型轉換為ArrayList類型

public class DaoQueryResultVO<T> extends PageInfo<T> implements Serializable
{
    private static final long serialVersionUID = -6401449740378930924L;

    private List<T> lstResultList;

    public DaoQueryResultVO(List<T> list)
    {
        super(list);
        if (getSize() >= 0)
        {
            lstResultList = new ArrayList<T>();
            lstResultList.addAll(getList().subList(0, getSize()));
        }
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString()
    {
        return "DaoQueryResultVO [lstResultList=" + lstResultList + ", toString()=" + super.toString() + "]";
    }

    /**
     * @return the lstResultList
     */
    public List<T> getLstResultList()
    {
        return lstResultList;
    }
}
PageHelper.startPage靜態方法調用

在需要進行分頁的方法前調用PageHelper.startPage靜態方法即可,緊跟在這個方法后的第一個查詢方法會被進行分頁

參考:Mybatis分頁插件—pagehelper

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容

  • 在Mybatis配置xml中配置攔截器插件: 這里的com.github.pagehelper.PageHelpe...
    bboymonk閱讀 3,478評論 6 2
  • 本文部分內容摘選自PageHelper GitHub,可按照文中步驟進行插件快速集成 一、Maven配置 <val...
    蔓越莓餅干閱讀 3,297評論 0 2
  • Mybatis 分頁插件實現 有數據的地方就有分頁,分頁的sql基本大加都會寫,MySQL可以用limit,Ora...
    思無涯1993閱讀 1,212評論 0 3
  • 第二天很快就到了,宮中的宴會很早就開始了,凌雪國國王在一條紅毯的盡頭端坐著,每一個公主都打扮的非常美麗,當然,這是...
    千洛雪夢閱讀 455評論 0 0
  • 首先問自己的第一個問題:你為什么適合做運營呢?還有做運營的目的是什么? 從在微信上的聊天以及在短信溝通里能夠感覺到...
    成年小飯閱讀 218評論 0 0