Mybatis中使用pageHelper 进行分页
pageHelper 是mybatis中一种良好的分页插件,它可以支持任何复杂的单表、多表分页,使用也是非常的简单。
1.导入maven坐标(或者jar包)
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
2.配置拦截器插件(二选一即可)
注:此操作须在ssm整合后
-
在 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"/> <!--例:分页参数合理化 <property name="reasonable" value="true"/> --> </plugin> </plugins>
-
在 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> <!--例:分页参数合理化 <value>reasonable=true</value> --> </property> </bean> </array> </property> </bean>
3.设置controller页面,在controller中完成分页
通过接收jsp传过来的 page size参数 来调用service方法
/**
* 查询员工数据
* @return
*/
@RequestMapping("/emps")
public String getEmps(@RequestParam(value = "pn",defaultValue = "1") Integer pn, Model model){
//分页查询 使用pagehelper分页插件 在查询之前只需要调用 传入页码 以及每页得多少
PageHelper.startPage(pn,5);
//startPage后面紧跟的查询就是一个分页查询
List<Employee> employees = employeeService.getAll();
//使用pageInfo包装查询后的结果 只需要将pageinfo交给页面就可以了
//这里面封装了详细的分页信息 包括我们查询的数据 传入连续显示的页数
PageInfo page = new PageInfo(employees,5);
model.addAttribute("pageInfo",page);
return "list";
}
或者:
//required = true(要求必须携带参数),defaultValue = "1" (带了参数会接收,如果没带参数则设置一个默认值为1)
@RequestMapping("/emps")
public ModelAndView findAll(@RequestParam(name="page",required = true,defaultValue = "1")int page) throws Exception{
PageHelper.startPage(pn,5);
ModelAndView mv = new ModelAndView();
List<User> all = ordersService.findAll();
//使用PageInfo来封装查询的数据
PageInfo pageInfo = new PageInfo(all,5);
mv.addObject("pageInfo",pageInfo);
//返回的页面
mv.setViewName("list");
return mv;
}
4.编写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中来实现调用方法从而实现的分页查询的各个效果。
1.显示表格数据
<div class="row">
<div class="col-md-12">
<table class="table table-hover">
<tr>
<th>#</th>
<th>empName</th>
<th>gender</th>
<th>email</th>
<th>deptName</th>
<th>操作</th>
</tr>
<!--因为实体类存到model中,而model有存到pageInfo中 即获取用户信息 pageInfo
.list-->
<c:forEach items="${pageInfo.list}" var="emp">
<tr>
<th>${emp.empId}</th>
<th>${emp.empName}</th>
<th>${emp.gender=="M"?"男":"女"}</th>
<th>${emp.email}</th>
<th>${emp.department.deptName}</th>
<th>
<button class="btn btn-primary btn-xs">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
编辑
</button>
<button class="btn btn-primary btn-xs">
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
删除
</button>
</th>
</tr>
</c:forEach>
</table>
</div>
</div>
2.显示分页信息
<div class="row">
<%--分页文字信息--%>
<div class="col-md-6">
当前总记录数:${pageInfo.total}条
当前页数:${pageInfo.pageNum}页
总页数:${pageInfo.pages}页
</div>
<%--分页条信息--%>
<div class="col-md-6">
<nav aria-label="Page navigation">
<ul class="pagination">
<li><a href="${pageContext.request.contextPath }/emps?pn=1">首页</a></li>
<c:if test="${pageInfo.hasPreviousPage}">
<li>
<a href="${pageContext.request.contextPath }/emps?pn=${pageInfo.pageNum-1}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
</c:if>
<c:forEach items="${pageInfo.navigatepageNums}" var="page_num">
<c:if test="${pageInfo.pageNum==page_num}">
<li class="active"><a href="${pageContext.request.contextPath }/emps?pn=${page_num}">${page_num}</a></li>
</c:if>
<c:if test="${pageInfo.pageNum!=page_num}">
<li><a href="${pageContext.request.contextPath }/emps?pn=${page_num}">${page_num}</a></li>
</c:if>
</c:forEach>
<c:if test="${pageInfo.hasNextPage}">
<li>
<a href="${pageContext.request.contextPath }/emps?pn=${pageInfo.pageNum+1}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</c:if>
<li><a href="${}/emps?pn=${pageInfo.pages}">末页</a></li>
</ul>
</nav>
</div>
</div>