PageHelper简单使用说明

😂 这篇文章最后更新于1260天前,您需要注意相关的内容是否还可用。
目录导航
  • 依赖
  • xml中配置
  • SpringBoot中配置
  • 代码中使用
  • Mybatis分页插件 - PageHelper
    PageHelper是一款最方便使用的分页插件之一。支持各种数据库实现物理分页。
    开源地址:https://github.com/pagehelper/Mybatis-PageHelper
    开源中国主页:https://www.oschina.net/p/mybatis_pagehelper

    依赖

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

    xml中配置

    在sqlSessionFactory中加入pageHelper插件的配置

    <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">mysql</prop>
                            <prop key="reasonable">true</prop>
                        </props>
                    </property>
                </bean>
            </array>
        </property>
        <!-- 自动扫描mapping.xml文件 -->
        <property name="mapperLocations" value="classpath*:ssm/mapper/*.xml"></property>
    </bean>

    SpringBoot中配置

    依赖

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

    配置

    pagehelper:
      # dialect: ①
      # 分页插件会自动检测当前的数据库链接,自动选择合适的分页方式(可以不设置)
      helper-dialect: mysql 
      # 上面数据库设置后,下面的设置为true不会改变上面的结果(默认为true)
      auto-dialect: true 
      page-size-zero: false # ②
      reasonable: true # ③
      # 默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。(一般用不着)
      offset-as-page-num: false 
      # 默认值为 false,RowBounds是否进行count查询(一般用不着)
      row-bounds-with-count: false 
      #params: ④
      #support-methods-arguments: 和params配合使用,具体可以看下面的讲解
      # 默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页
      auto-runtime-dialect: false # ⑤
      # 与auto-runtime-dialect配合使用
      close-conn: true 
      # 用于控制默认不带 count 查询的方法中,是否执行 count 查询,这里设置为true后,total会为-1
      default-count: false 
      #dialect-alias: ⑥

    代码中使用

    PageHelper.startPage(page, pageSize);
    //这里使用 PageHelper.offsetPage(page, pageSize);亦可
    PageInfo pageInfo = new PageInfo<>(testMapper.findAll(Test));

    返回的PageInfo中可获取总条数及当且页数据

    pageInfo.getTotal() //总条数
    pageInfo.getList() //页面数据

    或使用Page强转亦可

    Page page=(Page)testMapper.findAll(Test);
    page.getTotal();//总条数
    page.getResult();//页面数据

    从以下源码可以看出来startPage可选参数更加丰富

        /**
         * 开始分页
         *
         * @param pageNum      页码
         * @param pageSize     每页显示数量
         * @param count        是否进行count查询
         * @param reasonable   分页合理化,null时用默认配置
         * @param pageSizeZero true且pageSize=0时返回全部结果,false时分页,null时用默认配置
         */
        public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
            Page<E> page = new Page<E>(pageNum, pageSize, count);
            page.setReasonable(reasonable);
            page.setPageSizeZero(pageSizeZero);
            //当已经执行过orderBy的时候
            Page<E> oldPage = getLocalPage();
            if (oldPage != null && oldPage.isOrderByOnly()) {
                page.setOrderBy(oldPage.getOrderBy());
            }
            setLocalPage(page);
            return page;
        }
        /**
         * 开始分页
         *
         * @param offset 页码
         * @param limit  每页显示数量
         * @param count  是否进行count查询
         */
        public static <E> Page<E> offsetPage(int offset, int limit, boolean count) {
            Page<E> page = new Page<E>(new int[]{offset, limit}, count);
            //当已经执行过orderBy的时候
            Page<E> oldPage = getLocalPage();
            if (oldPage != null && oldPage.isOrderByOnly()) {
                page.setOrderBy(oldPage.getOrderBy());
            }
            setLocalPage(page);
            return page;
        }

    分页插件可选参数如下:

    • dialect:默认情况下会使用 PageHelper 方式进行分页,如果想要实现自己的分页逻辑,可以实现 Dialect(com.github.pagehelper.Dialect) 接口,然后配置该属性为实现类的全限定名称。

    下面几个参数都是针对默认 dialect 情况下的参数。使用自定义 dialect 实现时,下面的参数没有任何作用。

    1. helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
      oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
      特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
      你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。
    2. offsetAsPageNum:默认值为 false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,可以用页码和页面大小两个参数进行分页。
    3. rowBoundsWithCount:默认值为false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。
    4. pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
    5. reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
    6. params:为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
    7. supportMethodsArguments:支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTestArgumentsObjTest
    8. autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver),用法和注意事项参考下面的场景五。
    9. closeConn:默认值为 true。当使用运行时动态数据源或没有设置 helperDialect 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为 false 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。

    重要提示:

    offsetAsPageNum=false 的时候,由于 PageNum 问题,RowBounds查询的时候 reasonable 会强制为 false。使用 PageHelper.startPage 方法不受影响。

    其他说明可参考:https://blog.csdn.net/qq_38375620/article/details/79467545