1. 引入分页插件
在 pom.xml 中添加如下依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
2. 配置拦截器插件
特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor。 com.github.pagehelper.PageHelper 现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。
俩种配置方式任选其一
1). 在 MyBatis 配置 xml 中配置拦截器插件
<!--
plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
<property name="param1" value="value1"/>
</plugin>
</plugins>
2). 在 Spring 配置文件中配置拦截器插件
使用 spring 的属性配置方式,可以使用 plugins 属性像下面这样配置:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注意其他配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个 -->
<value>
params=value1
</value>
</property>
</bean>
</array>
</property>
</bean>
3. 分页插件参数介绍
1)helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。配置时,可以使用下面的缩写值:
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
特别注意:使用 SqlServer2012 数据库时,需要手动指定为 sqlserver2012,否则会使用 SqlServer2005 的方式进行分页。
你也可以实现 AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使用自定义的实现方法。
2)reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
4. 如何在代码中使用
controller:
@Controller
@RequestMapping(value = "${frontPath}")
public class Test_Controller {
@Autowired
lyhService lyhService;
@RequestMapping("/host")
public ModelAndView goHost(){
return new ModelAndView("zhinengkefu/hostPage");
}
@RequestMapping("/listAllArticle")
public ModelAndView listAllArticle(@RequestParam(value = "pageNo",defaultValue = "1")Integer pageNo){
ModelAndView modelAndView = new ModelAndView("zhinengkefu/artList");
//在你需要进行分页的 MyBatis 查询方法前调用 PageHelper.startPage 静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。
PageHelper.startPage(pageNo , 2);
List<Map<String, Object>> maps = lyhService.listAllArticle();
PageInfo<Map<String, Object>> mapPageInfo = new PageInfo<>(maps);
modelAndView.addObject("articleList",mapPageInfo);
return modelAndView;
}
}
使用PageInfo的用法:
//获取第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());
我这里为了直观 把所有的属性基本上都使用了 这些事内置类中的属性 直接调用即可 是不是很方便
<table>
<tr>
<td>公告</td>
</tr>
<c:forEach items="${articleList.list}" var="art">
<tr>
<td><a href="${pageContext.request.contextPath}${fns:getFrontPath()}/view-${art.category_id}-${art.id}${fns:getUrlSuffix()}">${art.title}</a></td>
</tr>
</c:forEach>
</table>
<p>当前 ${articleList.pageNum }页,总${articleList.pages}页,总 ${articleList.total}条记录</p>
<a href="${pageContext.request.contextPath}${fns:getFrontPath()}/listAllArticle?pageNo=1">首页</a>
<c:if test="${articleList.hasPreviousPage }">
<a href="${pageContext.request.contextPath}${fns:getFrontPath()}/listAllArticle?pageNo=${articleList.pageNum-1}">上一页</a>
</c:if>
<c:if test="${articleList.hasNextPage }">
<a href="${pageContext.request.contextPath}${fns:getFrontPath()}/listAllArticle?pageNo=${articleList.pageNum+1}">下一页</a>
</c:if>
<a href="${pageContext.request.contextPath}${fns:getFrontPath()}/listAllArticle?pageNo=${articleList.pages}">末页</a>