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阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 在Mybatis配置xml中配置拦截器插件: 这里的com.github.pagehelper.PageHelpe...
    bboymonk阅读 3,461评论 6 2
  • 本文部分内容摘选自PageHelper GitHub,可按照文中步骤进行插件快速集成 一、Maven配置 <val...
    蔓越莓饼干阅读 3,287评论 0 2
  • Mybatis 分页插件实现 有数据的地方就有分页,分页的sql基本大加都会写,MySQL可以用limit,Ora...
    思无涯1993阅读 1,189评论 0 3
  • 第二天很快就到了,宫中的宴会很早就开始了,凌雪国国王在一条红毯的尽头端坐着,每一个公主都打扮的非常美丽,当然,这是...
    千洛雪梦阅读 439评论 0 0
  • 首先问自己的第一个问题:你为什么适合做运营呢?还有做运营的目的是什么? 从在微信上的聊天以及在短信沟通里能够感觉到...
    成年小饭阅读 201评论 0 0