项目地址:http://git.oschina.net/free/Mybatis_PageHelper
文档地址:http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/HowToUse.markdown
首先,maven的依赖只是下载jar包而已,可以在其他地方下载jar包,无maven的情况下实现分页需要三步
第一步:下载jar包导入工程。
第二步:然后直接在mybatis中配置<plugins>
第三步:在需要分页的service或者controller中,查询语句前调用PageHelper.startPage(页码, 条数);
(此处需要注意一定要在需要的查询前调用)
我用的版本是PageHelper-4.1.1、Mybatis-3.3.0
PageHelper 依赖于 jsqlparser-0.9.4.jar
添加如下依赖:
- <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