mybatis分页插件pagehelper
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis分页插件pagehelper相关的知识,希望对你有一定的参考价值。
Mybatis 的分页插件 PageHelper
添加如下依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.6</version>
</dependency>
当使用maven中央库中的快照版(带"-SNAPSHOT"
的版本)时,需要在pom.xml中添加如下配置:
<repositories>
<repository>
<id>sonatype-nexus-snapshots</id>
<name>Sonatype Nexus Snapshots</name>
<url>http://oss.sonatype.org/content/repositories/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
2. 在Mybatis配置mybatis-config.xml中配置拦截器插件:
plugins插件的配置在 settings之后 在environments之前
<!--
plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 4.0.0以后版本可以不设置该参数 -->
<property name="dialect" value="mysql"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
<!-- 和startPage中的pageNum效果一样-->
<property name="offsetAsPageNum" value="true"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="true"/>
<!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
<!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
<property name="pageSizeZero" value="true"/>
<!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
<!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
<!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
<property name="reasonable" value="false"/>
<!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
<!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->
<!-- 不理解该含义的前提下,不要随便复制该配置 -->
<property name="params" value="pageNum=pageHelperStart;pageSize=pageHelperRows;"/>
<!-- 支持通过Mapper接口参数来传递分页参数 -->
<property name="supportMethodsArguments" value="false"/>
<!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->
<property name="returnPageInfo" value="none"/>
</plugin>
</plugins>
pageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息
所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句
所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句
PageHelper只对紧跟着的第一个SQL语句起作用
如上:所以若一个方法中涉及到多个查询,需要小心,避免为不需要分页的添加了分页,而真正需要分页的却没有被分页
测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = {"classpath:spring/spring-*.xml"})
public class TestPageHelper {
@Resource
private TbItemMapper itemMapper;
@Test
public void testPageHelper() throws Exception {
//2、设置分页,第104页,每页显示30条
PageHelper.startPage(104, 30);
//3、执行查询
TbItem item = new TbItem();
List<TbItem> list = itemMapper.selectBySelective(item);
//4、取分页后结果
PageInfo<TbItem> pageInfo = new PageInfo<>(list);
int pageNum = pageInfo.getPageNum();
System.out.println("当前是第几页:" + pageNum);
int pageSize = pageInfo.getPageSize();
System.out.println("当前页最多显示几条:" + pageSize);
int size = pageInfo.getSize();
System.out.println("当前页有几条记录:" + size);
int startRow = pageInfo.getStartRow();
System.out.println("当前页开始记录:" + startRow);
int endRow = pageInfo.getEndRow();
System.out.println("当前页最后一条记录:" + endRow);
long total = pageInfo.getTotal();
System.out.println("总共查出来多少条记录:" + total);
int pages = pageInfo.getPages();
System.out.println("总共有多少页:" + pages);
}
}
结果
当前是第几页:104
当前页最多显示几条:30
当前页有几条记录:6
当前页开始记录:3091
当前页最后一条记录:3096
总共查出来多少条记录:3096
总共有多少页:104
以上是关于mybatis分页插件pagehelper的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis分页插件:PageHelper和PageInfo
Mybatis插件原理和PageHelper结合实战分页插件