04.MyBatis的PageHelper分页插件

MyBatis框架提供的PageHelper分页插件的使用

PageHelper是国内非常优秀的一款开源的mybatis分页插件,支持主流与常用的数据库,MySQL、 Oracle、 mariaDB、 DB2、 SQLte、 Hsqldb等
github地址 https://github.com/pagehelper/Mybatis-PageHelper

一. 使用方式介绍

  1. jar包导入方式【了解】

    1. https://oss.sonatype.org/content/repositories/releases/com/github/pagehelper/pagehelper/
    2. http://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/
    3. jsqlparser.jar --- sql 解析工具http://repo1.maven.org/maven2/com/github/jsqlparser/jsqlparser/0.9.5/
  2. maven坐标【推荐】

二、maven使用方式

1). 在pom.xml中添加依赖

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

2). 配置拦截器

MyBatis插件的实现方式是使用的拦截器的原理;新版的拦截器是 com.github.pagehelper.PageInterceptor;而 com.github.pagehelper.PageHelper 现在是一个特殊的 dialect,是分页插件的默认实现类,提供了以前相同的用法。

  1. 在Spring配置文件中配置拦截器插件
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!-- 传入PageHelper的插件,用于分页 -->
    <property name="plugins">
        <array>
            <!-- 传入插件的对象 -->
            <bean class="com.github.pagehelper.PageInterceptor">
                <property name="properties">
                    <props>
                        <prop key="helperDialect">oracle</prop>
                        <prop key="reasonable">true</prop>
                    </props>
                </property>

                <-- 或者使用其他方式,替换上面对应的标签体-->
            </bean>
        </array>
    </property>
</bean>
  1. 补充写法
<property name="properties">
    <!--使用下面的方式配置参数,一行配置一个 -->
    <value>
        helperDialect=oracle
    </value>
</property>

3). 使用PageHelper.startPage 静态方法调用

在进行分页的MyBatis查询方法前调用PageHelper.startPage静态方法即可,紧跟 在这个方法后的 第一个MyBatis查询相关方法 会被进行分页。

底层的运行原理大致解析:与LocalThread本地线程类变量有关,当调用此静态方法之后,拼接的连接器激活,再次操作与MyBatis相关的方法后会进行分页语句SQL拼接,然后去数据库查询!并且拼接完后,激活状态失活!

  1. service层中设置分页查询
// 获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);

// 紧跟着的第一个select方法会被分页
List<Country> list = countryMapper.selectIf(1);
  1. Controller中可以创建PageInfo封装全面的的分页信息
// 封装的相关分页信息
PageInfo pageInfo = new PageInfo(list);

三、补充知识介绍

1). 分页插件参数介绍【关注前两个即可】

  1. helperDialect】: 指定数据库,一般不用配置,底层会自动识别
    • 指定时的参数值:oracle , mysql , mariadb , sqlite , hsqldb , postgresql , db2 , sqlserver , informix , h2 , sqlserver2012 , derby
    • 使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012 ,否则会使用 SqlServer2005 的方式进行分页。

也可以实现 AbstractHelperDialect ,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。

  1. reasonable】: 分页合理化参数,默认值为 false 。当该参数设置为 true 时, pageNum<=0 时会查询第一页, pageNum>pages (超过总数时),会查询最后一页。默认 false 时,直接根据参数进行查询。

  2. offsetAsPageNum: 默认值为 false ,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。

  3. rowBoundsWithCount**: 该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,使用 RowBounds 分页会进行 count 查询。

  4. pageSizeZero: 默认值为 false ,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit =0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。

  5. params: 为了支持 startPage(Object params) 方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable ,不配置映射的用默认值, 默认值为 pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero

  6. supportMethodsArguments: 支持通过 Mapper 接口参数来传递分页参数,默认值 false ,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTestArgumentsObjTest

  7. autoRuntimeDialect: 默认值为 false 。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择 sqlserver2012 ,只能使用 sqlserver )

  8. closeConn: 默认值为 true 。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认 true 关闭,设置为false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。

2). MyBatis配置xml文件中配置拦截器插件

<!-----------------------------------------------
plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
    properties?,
    settings?,
    typeAliases?,
    typeHandlers?,
    objectFactory?,
    objectWrapperFactory?,
    plugins?,
    environments?,
    databaseIdProvider?,
    mappers?
--------------------------------------------------->
<plugins>
    <!-- com.github.pagehelper为PageHelper类所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
        <property name="param1" value="value1"/>
    </plugin>
</plugins>

3). RowBounds方式的调用

PageHelper的基本使用有6种

1. 使用命名空间方式调用RowBounds

List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(1, 10));

可以使用RowBounds参数进行分页,这种方式侵入性最小,我们可以看到,通过RowBounds方式调用只是使用了这个参数,并没有增加其他任何内容。分页插件检测到使用了RowBounds参数时,就会对该查询进行物理分页。关于这种方式的调用,有两个特殊的参数是针对 RowBounds 的,可以参看上面的分页插件参数介绍

2. 直接在Dao接口中加入RowBounds参数签名

//这种情况下也会进行物理分页查询
List<Country> selectAll(RowBounds rowBounds);

由于默认情况下的 RowBounds 无法获取查询总数,分页插件提供了一个继承自 RowBounds 的PageRowBounds ,这个对象中增加了 total 属性,执行分页查询后,可以从该属性得到查询总数。

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

推荐阅读更多精彩内容