7、Springboot 集成分页插件pagehelper

1、官网https://pagehelper.github.io/

2、集成springboot文档 https://github.com/pagehelper/pagehelper-spring-boot

使用细则:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

example:https://github.com/abel533/MyBatis-Spring-Boot

 

3、分页插件参数介绍

 

 

分页插件提供了多个可选参数,在springboot application.properties 中以 pagehelper.<参数名> = <参数值> 的形式进行配置即可,分页插件可选参数如下

 

参数

说明

dialect

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


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

helperDialect

  1. 分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:


oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby

 

特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。

 

offsetAsPageNum

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

rowBoundsWithCount

  1. 默认值为false,该参数对使用 RowBounds 作为分页参数时有效。 当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。

pageSizeZero

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

reasonable

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

params

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

supportMethodsArguments

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

autoRuntimeDialect

  1. 默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver),用法和注意事项参考下面的场景五

closeConn

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

aggregateFunctions(5.1.5+)

  1. 默认为所有常见数据库的聚合函数,允许手动添加聚合函数(影响行数),所有以聚合函数开头的函数,在进行 count 转换时,会套一层。其他函数和列会被替换为 count(0),其中count列可以自己配置。

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

 

4、查看pagehelper-spring-boot-starter 引用依赖的结构 (pagehelper-spring-boot/pagehelper-spring-boot-starter/pom.xml)

https://github.com/pagehelper/pagehelper-spring-boot/blob/master/pagehelper-spring-boot-starter/pom.xml

5、原理

(1)mybatis集成pagehelper,需要在Mybatis的配置文件中注册需要使用的Plugin ,

PageHelper中对应的Plugin实现类就是com.github.pagehelper.PageHelper自身

7、Springboot 集成分页插件pagehelper_第1张图片

mybatis plugin 实则是org.apache.ibatis.plugin.Interceptor接口,

7、Springboot 集成分页插件pagehelper_第2张图片

因为Interceptor的核心是其中的plugin(Object target)方法,而对于plugin(Object target)方法的实现,我们在需要对对应的对象进行拦截时会通过org.apache.ibatis.plugin.Plugin的静态方法wrap(Object target, Interceptor interceptor)返回一个代理对象,而方法入参就是当前的Interceptor实现类。

7、Springboot 集成分页插件pagehelper_第3张图片

 

 

(2) PageHelper拦截的是org.apache.ibatis.executor.Executor的query方法

7、Springboot 集成分页插件pagehelper_第4张图片

(3)ThreadLocal:

java.lang.ThreadLocal

(4)PageHelper.startPage(..): 这样PageHelper会把分页信息存入一个ThreadLocal变量中,在拦截到Executor的query方法执行时会从对应的ThreadLocal中获取分页信息,获取到了,则进行分页处理,处理完了后又会把ThreadLocal中的分页信息清理掉,以便不影响下一次的查询操作

7、Springboot 集成分页插件pagehelper_第5张图片

 (5)com.github.pagehelper.Page: 在进行分页查询时,我们的返回结果一般是一个java.util.List,PageHelper分页查询后的结果会变成com.github.pagehelper.Page类型,其继承了java.util.ArrayList,我们自己声明mapper 方法中的返回为List时也不会报错,因为做了强转

com.github.pagehelper.Page中包含有返回结果的分页信息,包括总记录数,总的分页数等信息,所以一般我们需要把返回结果强转为com.github.pagehelper.Page类型

7、Springboot 集成分页插件pagehelper_第6张图片

6、框架集成

(1)导入maven依赖

只需要导入pagehelper-spring-boot-starter 依赖,其他的不需要

 7、Springboot 集成分页插件pagehelper_第7张图片

(2)配置pagehelper参数(配置几个常用核心参数,,其他参数可以根据业务情况配置) 

7、Springboot 集成分页插件pagehelper_第8张图片

注意: 在springboot 、mybatis、 pagehelper的集成中,不需要在手动为mybatis添加plugin, 因为pagehelper-spring-boot-starter 已经做了自动化配置

你可能感兴趣的:(Spring,系列)