pageHelper 是mybatis中一种良好的分页插件,它可以支持任何复杂的单表、多表分页,使用也是非常的简单。
第一步 导入maven坐标(或jar包)
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
第二步 在配置文件中添加pageHelper插件
<!-- 把交给IOC管理 SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 传入PageHelper的插件实现分页 -->
<property name="plugins">
<array>
<!-- 传入插件的对象 -->
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<!--用来识别数据库-->
<prop key="helperDialect">oracle</prop>
<!--使页数不会越界-->
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
第三步 在执行sql前(service中)完成分页
@Override
public List<Orders> findAll(int page,int size) throws Exception {
//pageNum代表页码值,pageSize代表每页条数
PageHelper.startPage(page,size);
return orderDao.findAll();
}
第四步 设置controller页面,通过接收jsp传过来的 page size参数 来调用service方法
//required = true(要求必须携带参数),defaultValue = "1" (带了参数会接收,如果没带参数则设置一个默认值为1)
public ModelAndView findAll(@RequestParam(name="page",required = true,defaultValue = "1")int page,@RequestParam(name="size",required=true,defaultValue = "4") int size ) throws Exception{
ModelAndView mv = new ModelAndView();
List<Orders> all = ordersService.findAll(page,size);
//使用PageInfo来封装查询的数据
PageInfo pageInfo = new PageInfo(all);
mv.addObject("pageInfo",pageInfo);
mv.setViewName("orders-list");
return mv;
}
第五步 编写jsp页面 具体实现分页效果
补充: 在PageInfo对象中具体的属性 ,了解了这些我们在进行分页时更容易操作
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//前一页
private int prePage;
//下一页
private int nextPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;
这些实现的原理都是通过jsp带参传递到controller中来实现调用方法从而实现的分页查询的各个效果。
<ul class="pagination">
<li>
<a href="${pageContext.request.contextPath}/orders/findAll.do?page=1&$size=${pageInfo.pageSize}" aria-label="Previous">首页</a>
</li>
<li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.prePage}&size=${pageInfo.pageSize}">上一页</a></li>
<c:forEach begin="1" end="${pageInfo.pages}" var="pageNum">
<li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageNum}&size=${pageInfo.pageSize}">${pageNum}</a></li>
</c:forEach>
<li><a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.nextPage}&size=${pageInfo.pageSize}">下一页</a></li>
<li>
<a href="${pageContext.request.contextPath}/orders/findAll.do?page=${pageInfo.pages}&size=${pageInfo.pageSize}" aria-label="Next">尾页</a>
</li>
</ul>