最近在工作中用到了分页这个功能,网上的前端分页插件众多,但都不是太满意,因为很多都是把所有的数据查询出来,进行分页展示,这其实并不是真正意义上的分页,说到分页,我们就要想一下为什么要分页,其实就是减少数据库的压力,如果你只是为了前端展示分页的效果,那么你可以忽略我这篇文章了。接下来进入正题:
分页的第一步就是要有创建一个包含返回给前端的实体类,话不多说,直接上代码:
/**
* 分页用到的实体类,里面包含所有要返回给页面的数据
* @author HP
*
*/
public class PageInfo {
//每页显示几个
private int pageSize;
//当前第几页
private int pageNumber;
//总页数
private int total;
//当前页显示数据
private List<Plane> list;
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageNumber() {
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public List<Plane> getList() {
return list;
}
public void setList(List<Plane> list) {
this.list = list;
}
}
orm层代码对应如下:
public interface PlaneMapper {
/**
* 当前页显示数据
* @param pageSize 一页显示几条数据
* @param pageStart 数据库要接收参数的意思为:从第几条数据开始取,所以此处的pageStart是要经过计算的
* @return
*/
@Select("SELECT p.`id`,p.`planeNum`,p.`time`,p.`price`,t.`id` 'takeport.id',t.`portname` 'takeport.portname',t.`cityname` 'takeport.cityname',l.`id` 'landport.id',l.`portname` 'landport.portname',l.`cityname` 'landport.cityname' FROM plane p LEFT JOIN airport t ON p.`takeport` = t.`id` LEFT JOIN airport l ON p.`landport` = l.`id` ORDER BY p.`id` ASC LIMIT #{1}, #{0}")
List<Plane> selByPageInfo(int pageSize,int pageStart);
/**
* 总个数
* @return
*/
@Select("SELECT COUNT(*) FROM plane")
int selCount();
}
service代码如下:
public class PlaneServiceImpl implements PlaneService {
@Override
public PageInfo showPage(int pageSize, int pageNumber) {
PageInfo pi = new PageInfo();
SqlSession session = MyBatisUtil.getSqlSession();
PlaneMapper planeMapper = session.getMapper(PlaneMapper.class);
//获取当前页要显示的数据
List<Plane> list = planeMapper.selByPageInfo(pageSize, pageSize*(pageNumber-1));
//查询总条数
int count = planeMapper.selCount();
pi.setList(list);
pi.setPageSize(pageSize);
pi.setPageNumber(pageNumber);
pi.setTotal(count%pageSize == 0?count/pageSize:count/pageSize+1);
return pi;
}
}
controller层这里不再给出,应用springmvc非常简单,由于这里只是用于测试,我的页面用的是jsp,将代码贴下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1">
<tr>
<td>飞机编号</td>
<td>起飞机场名称</td>
<td>起飞城市名称</td>
<td>降落机场名称</td>
<td>降落城市名称</td>
<td>航行时间(xx:xx)</td>
<td>票价(元)</td>
</tr>
<c:forEach items="${pi.list }" var="plane">
<tr>
<td>${plane.planeNum }</td>
<td>${plane.takeport.portname }</td>
<td>${plane.takeport.cityname }</td>
<td>${plane.landport.portname }</td>
<td>${plane.landport.cityname }</td>
<c:if test="${plane.time>=60 }">
<td>
<fmt:formatNumber value="${plane.time/60 }" pattern="0"></fmt:formatNumber>小时${plane.time%60 }分钟
<%-- 时间格式化<fmt:formatDate value="${ }" pattern="yyyy-MM-dd"/> --%>
</td>
</c:if>
<c:if test="${plane.time<60 }">
<td>${plane.time }分钟</td>
</c:if>
<td>${plane.price }</td>
</tr>
</c:forEach>
</table>
<a href="show?pageSize=${pi.pageSize }&pageNumber=${pi.pageNumber-1}" <c:if test="${pi.pageNumber<=1 }"> onclick="javascript:return false;" </c:if>>上一页</a>
<a href="show?pageSize=${pi.pageSize }&pageNumber=${pi.pageNumber+1}" <c:if test="${pi.pageNumber>=pi.total }"> onclick="javascript:return false;" </c:if>>下一页</a>
</body>
</html>