java分页的实现

最近在工作中用到了分页这个功能,网上的前端分页插件众多,但都不是太满意,因为很多都是把所有的数据查询出来,进行分页展示,这其实并不是真正意义上的分页,说到分页,我们就要想一下为什么要分页,其实就是减少数据库的压力,如果你只是为了前端展示分页的效果,那么你可以忽略我这篇文章了。接下来进入正题:

分页的第一步就是要有创建一个包含返回给前端的实体类,话不多说,直接上代码:

/**
 * 分页用到的实体类,里面包含所有要返回给页面的数据
 * @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>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值