本文部分内容摘选自PageHelper GitHub,可按照文中步骤进行插件快速集成
一、Maven配置
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.0</version>
</dependency> ```
#### 二、 SqlSessionFactoryBean配置
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="readWriteDataSource"/>
<property name="typeAliasesPackage" value="com.tg..entity"/>
<property name="mapperLocations" value="classpath:mybatis//Mapper.xml"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
helperDialect=mysql
reasonable=true
supportMethodsArguments=true
</value>
</property>
</bean>
</array>
</property>
</bean>
#### 三、分页插件参数介绍
分页插件提供了多个可选参数,这些参数使用时,按照上面两种配置方式中的示例配置即可。
分页插件可选参数如下:
- *dialect*:默认情况下会使用 `PageHelper`方式进行分页,如果想要实现自己的分页逻辑,可以实现 `Dialect(com.github.pagehelper.Dialect)` 接口,然后配置该属性为实现类的全限定名称。
下面几个参数都是针对默认 `dialect` 情况下的参数。使用自定义 `dialect` 实现时,下面的参数没有任何作用。
- *helperDialect*:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置`helperDialect`属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
`oracle`,`mysql`,`mariadb`,`sqlite`,`hsqldb`,`postgresql`,`db2`,`sqlserver`,`informix`,`h2`,`sqlserver2012`,`derby`
**特别注意**:使用 `SqlServer2012` 数据库时,需要手动指定为 `sqlserver2012`,否则会使用 `SqlServer2005` 的方式进行分页。
你也可以实现 `AbstractHelperDialect`,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。
- *offsetAsPageNum*:默认值为 `false`,该参数对使用 `RowBounds` 作为分页参数时有效。 当该参数设置为 `true` 时,会将 `RowBounds` 中的 `offset` 参数当成 `pageNum` 使用,可以用页码和页面大小两个参数进行分页。
- *rowBoundsWithCount*:默认值为`false`,该参数对使用 `RowBounds` 作为分页参数时有效。 当该参数设置为`true`时,使用 `RowBounds` 分页会进行 `count`查询。
- *pageSizeZero*:默认值为 `false`,当该参数设置为 `true` 时,如果 `pageSize=0` 或者 `RowBounds.limit = 0` 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 `Page` 类型)。
- *reasonable*:分页合理化参数,默认值为`false`。当该参数设置为 `true` 时,`pageNum<=0` 时会查询第一页, `pageNum>pages`(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
- *params*:为了支持`startPage(Object params)`方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 `pageNum`,`pageSize`,`count`,`pageSizeZero`,`reasonable`,不配置映射的用默认值, 默认值为`pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero`。
- *supportMethodsArguments*:支持通过 `Mapper` 接口参数来传递分页参数,默认值`false`,分页插件会从查询方法的参数值中,自动根据上面 `params` 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 `com.github.pagehelper.test.basic` 包下的 `ArgumentsMapTest` 和 `ArgumentsObjTest`。
- *autoRuntimeDialect*:默认值为 *`false`*。设置为 *`true`* 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择`sqlserver2012`,只能使用`sqlserver`),用法和注意事项参考下面的场景五。
- *closeConn*:默认值为 `true`。当使用运行时动态数据源或没有设置 `helperDialect` 属性自动获取数据库类型时,会自动获取一个数据库连接, 通过该属性来设置是否关闭获取的这个连接,默认`true`关闭,设置为 `false` 后,不会关闭获取的连接,这个参数的设置要根据自己选择的数据源来决定。
**重要提示**:
当 `offsetAsPageNum=false` 的时候,由于 `PageNum` 问题,`RowBounds`查询的时候 `reasonable` 会强制为 *`false`*。使用 `PageHelper.startPage` 方法不受影响。
#### 四、项目集成
经过实际项目中的测试,总结出如下两种使用方式:
> - 用`PageHelper.startPage(pageNum, pageSize);`方式进行分页设置,代码侵入小,只需要在调用`initPage()`方法中加入此代码即可;
> - 使用参数传递的方式,此方法不支持`@Param("xxx")`注解,改造起来相对费时。
**代码参考**
List<User> userList = userService.query(userParams);
PageInfo<PaymentRequest> result = new PageInfo<>(userList );
System.out.println(result.getTotal());
System.out.println(result.getPageNum());
System.out.println(result.getList().size());
**TODO:集成后可将代码中所有`count()`方法全部去掉**
**注意**:`pageNum` 和 `pageSize` 两个属性同时存在才会触发分页操作,在这个前提下,其他的分页参数才会生效。