分页插件
官网 1、普通java工程引入两个jar包:
pagehelper-x.y.z.jar 和 jsqlparser-x.y.z.jar
maven工程引入依赖:
如果两个jar包版本不匹配会出现下面的错误:
net.sf.jsqlparser.statement.select.PlainSelect.getGroupBy()Lnet/sf/jsqlparse
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>latest version</version>
</dependency>
2、配置拦截器插件plugin
在全局配置文件中配置分页插件拦截器。
- 不要在系统中配置多个分页插件(使用Spring时,mybatis-config.xml和Spring配置方式,请选择其中一种,不要同时配置多个分页插件)!
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- config params as the following -->
<property name="param1" value="value1"/>
</plugin>
</plugins>
参数:
- helperDialect
- offsetAsPageNum
- rowBoundsWithCount:如果您仍然可以调用诸如iBATIS之类的名称空间,则可以使用rowBoundsWithCount。如果要在分页查询时进行计数,则需要将此参数设置为true,PageRowBounds也需要true
- pageSizeZero:如果您觉得必须在某处分页,而您仍想使用控件参数查询所有结果。您可以配置pageSizeZero为 true,配置后,何时pageSize = 0或RowBounds.limit = 0将查询所有结果
- reasonable:如果您希望用户输入不在合法范围内的页码(从第一页到最后一页)以正确响应正确的结果页,则可以配置reasonable为 true,如果pageNum <= 0要查询第一页,pageNum> pages(total pages)则将查询最后一页
- params
- supportMethodsArguments
- autoRuntimeDialect:如果您在Spring中配置动态数据源并连接不同类型的数据库,则可以配置autoRuntimeDialect为 true,当使用其他数据源时,它将使用匹配的分页查询。在这种情况下,您还需要注意该closeConn参数,因为访问数据源的类型将获得数据库连接,因此需要控制此参数以获得连接,是否关闭连接。
默认值为true,并且后续的数据库操作后无法关闭某些数据库连接。而且一些数据库连接将不会很快关闭,因为数据库中的连接数导致无响应。因此,特别是在使用此功能时,需要注意使用数据源是否需要关闭数据库连接。
当您不使用动态数据源而是仅自动获取时helperDialect,数据库连接将仅获取一次,因此无需担心此连接是否会导致数据库错误,也不必根据数据源的特性来选择是否关闭连接
- closeConn
- aggregateFunctions
PageHelper插件优点:
1、只需要加入jar包(依赖),配置拦截器就可以使用
使用一行代码就能实现分页:
PageHelper.startPage(2, 2);
紧跟在PageHelper.startPage方法后的第一个Mybatis的查询(Select)方法会被分页。
2、支持各种数据库
重要提示
分页插件不支持带有for update语句的分页
对于带有for update的sql,会抛出运行时异常,对于这样的sql建议手动分页。
分页插件不支持嵌套结果映射
由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。
Page和PageInfo
Page的一些属性:
public class Page<E> extends ArrayList<E> implements Closeable {
private static final long serialVersionUID = 1L;
/**
* 页码,从1开始
*/
private int pageNum;
/**
* 页面大小
*/
private int pageSize;
/**
* 起始行
*/
private int startRow;
/**
* 末行
*/
private int endRow;
/**
* 总数
*/
private long total;
/**
* 总页数
*/
private int pages;
/**
* 包含count查询
*/
private boolean count = true;
/**
* 分页合理化
*/
private Boolean reasonable;
/**
* 当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果
*/
private Boolean pageSizeZero;
/**
* 进行count查询的列名
*/
private String countColumn;
/**
* 排序
*/
private String orderBy;
/**
* 只增加排序
*/
private boolean orderByOnly;
PageInfo的一些属性:
PageInfo包含了更加全面的分页属性。
//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectAll();
//用PageInfo对结果进行包装
PageInfo page = new PageInfo(list);
public class PageInfo<T> extends PageSerializable<T> {
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow和endRow不常用,这里说个具体的用法
//可以在页面中"显示startRow到endRow 共size条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总页数
private int pages;
//前一页
private int prePage;
//下一页
private int nextPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;