一、PageHelper简介
PageHelper是Mybatis的一个分页插件,能够有效快速地帮助开发者完成分页的Java后台代码。熟练Spring+Mybatis+PageHelper的配置后对于普通的分页查询,能够极简地完成。从上面的GitHub地址中能够看到相关的使用说明,这里简要说一下在Spring+SpringMVC+Mybatis的博客开发中的使用。
二、配置
2.1 先看一下官网的配置
在Maven的pom.xml中添加如下代码:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>latest version</version>
</dependency>
在 mybatis-config.xml 文件中的配置
<!--
In the configuration file,
plugins location must meet the requirements as the following order:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- config params as the following -->
<property name="param1" value="value1"/>
</plugin>
</plugins>
在 Spring application.xml文件中的配置
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- other configuration -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!-- config params as the following -->
<value>
param1=value1
</value>
</property>
</bean>
</array>
</property>
</bean>
2.2 博客项目中的配置
2.2.1 pom中Mybatis配置
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
注意,这里用到的Mybatis版本为3.3.0!
2.2.2 pom中Spring配置
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.1.1</version>
</dependency>
2.2.3 pom中PageHelper配置
<!--分页插件PageHelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.0.0</version>
</dependency>
注意,这里用到的PageHelper版本为4.0.0!
解释一下为什么要强调Mybatis和PageHelper的版本,GitHub上PageHelper版本已经出了5.0+了,但由于项目中用到的Maybatis版本为3.3.0,PageHlper版本在4.0.0时不会报错(其他4.0+的版本没有测试),或者使用5.0+版的PageHelper,相应的Mybatis的版本也要提升,否则会报错。
2.2.4 mybatis-config.xml中的配置
<!--分页插件PageHelper的配置-->
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 该参数默认为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="true"/>
<!-- 支持通过Mapper接口参数来传递分页参数 -->
<property name="supportMethodsArguments" value="true"/>
<!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->
<property name="returnPageInfo" value="check"/>
</plugin>
</plugins>
2.2.5 spring-mybatis.xml中的配置
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml"/> <!--加载mybatis-config.xml,其中plugins配置了PageHelper。-->
<property name="mapperLocations" >
<list>
<!--注意点:在classpath后面的*必不可少,缺少型号的话后面的通配符不起作用。-->
<value>classpath*:com/haitao/common/mapper/*Mapper.xml</value>
</list>
</property>
</bean>
三、实际调用
@RequestMapping(value="/archives/reading")
public String readingArchive(Model model, HttpSession httpSession){
int pageNumber=1;
PageHelper.startPage(pageNumber, 5); // (第一个参数)pageNumber:第几页;(第二个参数)5:每页显示条数
List<Article> articles = articleService.findArticlesByCat(1); // 直接调用Service就可
model.addAttribute("articles",articles);
getAllPages(pageNumber,model,httpSession,articles);
for(Article article:articles){
System.out.println(article.getTitle());
}
return "read";
}
四、坑爹小问题
- jsp标签不能正常使用
解决:需要在jsp文件头加上:<%@ page isELIgnored="false" %>
- 启动tomcat时报错不能找到Mapper对应的Bean
解决:检查一下pom.xml中有没有添加资源配置没有的话加上,如我的项目中<resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> <include>**/*.ini</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources>