Mybatis-PageHelper的使用

公司使用的PageHelper插件比之前手动写分页方便多了,周末自行查资料总结了一下(毕竟国内牛人的开源项目,读中文文档要爽太多了),希望对想要快速上手的朋友提供一点帮助。

首先上一个小DEMO

1.添加Maven依赖


  com.github.pagehelper
  pagehelper
  4.2.1

2.在 MyBatis 配置 xml 中配置拦截器插件(参数会在后面详细讲解)



   
   
      
      
      
      
   

3.service层,在原有的查询代码基础上增加分页方法

 

PageHelper.startPage(1, 10);//第一参数:当前页,第二个参数:每页行数(ps:此静态方法必须紧跟在查询前,它会自动绑定)
List list = countryMapper.selectIf(1);//原有的查询代码

 

这样就OK了,是不是很简单!

 

接下来详细介绍一下PageHelper的各种用法(点击查看官方文档)

一、配置拦截器有两种方式,选用一种即可,若两种方式同时配置会出错

(具体的参数配置,下面会详细说明)

 

1. 在 MyBatis 配置 xml 中配置拦截器插件



    
    
        
        
	

2. 在 Spring 配置文件中配置拦截器插件

使用 spring 的属性配置方式,可以使用 plugins 属性像下面这样配置:


  
  
    
      
        
          
          
            params=value1
          
        
      
    
  

二、参数配置(比较常用的有1、4、5、6、7)

1.helperDialect:选择服务器方言(如mysql、oracle等)(注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012

2.offsetAsPageNum:默认false,只对RowBounds 作为分页参数时有效,作用是将 RowBounds 中的 offset 参数当成 pageNum 使用

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

4.pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果。

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

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 包下的 ArgumentsMapTest 和 ArgumentsObjTest

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

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

注意:当offsetAsPageNum=false时,RowBounds查询的时候就不存在pageNum了,所以reasonable自动转为false。

三、分页插件支持以下几种调用方式:

 

//第一种,RowBounds方式的调用(这种方式侵入性最小)
List list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));

//不只有命名空间方式可以用RowBounds,使用接口的时候也可以增加RowBounds参数
List selectAll(RowBounds rowBounds);  
//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List list = countryMapper.selectIf(1);
//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List list = countryMapper.selectIf(1);
/第四种,参数方法调用(后面有详细介绍)
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List selectByPageNumSize(
            @Param("user") User user,
            @Param("pageNum") int pageNum, 
            @Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List list = countryMapper.selectByPageNumSize(user, 1, 10);
//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
    //其他fields
    //下面两个参数名和 params 配置的名字一致
    private Integer pageNum;
    private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List list = countryMapper.selectByPageNumSize(user);
//第六种,ISelect 接口方式(具体的可以看文档)

使用PageInfo的用法:

//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
List list = countryMapper.selectAll();
//用PageInfo对结果进行包装
PageInfo page = new PageInfo(list);
//测试PageInfo全部属性
//PageInfo包含了非常全面的分页属性
assertEquals(1, page.getPageNum());//当前页
assertEquals(10, page.getPageSize());//每页行数
assertEquals(1, page.getStartRow());//当前页第一个元素所在数据库中的行号
assertEquals(10, page.getEndRow());//当前页最后一个元素所在数据库中的行号
assertEquals(183, page.getTotal());//数据库中总记录数
assertEquals(19, page.getPages());//总行数
assertEquals(1, page.getFirstPage());//
assertEquals(8, page.getLastPage());//
assertEquals(true, page.isFirstPage());//是否第一页
assertEquals(false, page.isLastPage());//是否最后一页
assertEquals(false, page.isHasPreviousPage());//是否有上一页
assertEquals(true, page.isHasNextPage());//是否有下一页
 

使用参数方式的注意事项:

想要使用参数方式,需要配置 supportMethodsArguments 参数为 true,同时要配置 params 参数。 例如下面的配置:


    
    
        
        
        
	

在 MyBatis 方法中:

List selectByPageNumSize(
        @Param("user") User user,
        @Param("pageNumKey") int pageNum, 
        @Param("pageSizeKey") int pageSize);

当调用这个方法时,由于同时发现了 pageNumKey 和 pageSizeKey 参数,这个方法就会被分页。params 提供的几个参数都可以这样使用。

除了上面这种方式外,如果 User 对象中包含这两个参数值,也可以有下面的方法:

List selectByPageNumSize(User user);

当从 User 中同时发现了 pageNumKey 和 pageSizeKey 参数,这个方法就会被分页。

注意:pageNum 和 pageSize 两个属性同时存在才会触发分页操作,在这个前提下,其他的分页参数才会生效。

 

 

 

 

你可能感兴趣的:(Mybatis-PageHelper的使用)