1. 使用Maven方式引入分页插件
在pom.xml中添加如下依赖:
<dependency>
<groupId>com.github.pagehelper
</groupId>
<artifactId>pagehelper
</artifactId>
<version>5.0.0
</version>
</dependency>
2. 配置拦截器插件
在Spring配置文件中配置
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
<property name="mapperLocations">
<list>
<value>classpath:mybatis/mapper/*Mapper.xml
</value>
</list>
</property>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
helperDialect=mysql
reasonable=true
supportMethodsArguments=true
params=count=countSql
autoRuntimeDialect=true
</value>
</property>
</bean>
</array>
</property>
</bean>
注意新版本的变化
拦截器com.github.pagehelper.PageInterceptor原来的dialect变成了helperDialect
分页插件中使用到的参数说明
helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值: oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby 特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。 你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。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 配置的字段中取值,查找到合适的值时就会自动分页。autoRuntimeDialect:默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页 (不支持自动选择sqlserver2012,只能使用sqlserver)pageSizeZero:默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
3. 代码中使用
使用Mapper接口方式调用
PageHelper.startPage(
1,
10);
List<Country>
list = countryMapper.selectIf(
1);
在需要进行分页的MyBatis查询方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被分页。例一:
PageHelper.startPage(
1,
10);
List<Country>
list = countryMapper.selectIf(
1);
assertEquals(
2,
list.get(
0).getId());
assertEquals(
10,
list.size());
assertEquals(
182, ((Page)
list).getTotal());
例二:
PageHelper.startPage(request);
List<Country>
list = countryMapper.selectIf(
1);
List<Country> list2 = countryMapper.selectIf(
null);
assertEquals(
2,
list.get(
0).getId());
assertEquals(
10,
list.size());
assertEquals(
182, ((Page)
list).getTotal());
assertEquals(
1, list2.get(
0).getId());
assertEquals(
182, list2.size());
例三:
//获取第
1页,
10条内容,默认查询总数count
PageHelper
.startPage(
1,
10)
List<Country> 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())
重要提示
PageHelper.startPage方法重要提示
只有紧跟在PageHelper.startPage方法后的第一个*Mybatis的查询Select*方法会被分页。
请不要配置多个分页插件
使用Spring时,配置文件中配置一种方式第一种:在mybatis配置文件中配置mybatis-config.xml第二种:在spring的配置文件中配置Spring<bean> spring.xml
分页插件不支持带有for update语句的分页
对于带有for update的sql,会抛出运行时异常,对于这样的sql建议手动分页
分页插件不支持嵌套结果映射
由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。