物理分页

物理分页:真分页

来数据库查询的时候,只查一页的数据就返回了

优点:内存中的数据量不会太大       

缺点:对数据库的访问频繁

逻辑分页:假分页

一口气把所有的数据全部查询出来,然后存放在内存中

优点:访问速度快

缺点:数据库量过大,容易内存溢出

这里介绍物理分页

limit 语法     物理分页

select * from ddd limit 5; 只能取出前面5条数据

select * from ddd limit 5  offset 0 ; 设置偏移量为0,代表不取第0条数据,从第1条数据开始取,取出5条,即1-5这五条数据

select * from ddd limit 5  offset 5; 设置偏移量为5代表不取前5条数据,从第6条数据开始取,取出5条,即6-10这五条数据

select * from ddd limit 5 offset10; 设置偏移量为10,代表不取前10条数据,从第11条数据开始取,取出5条,即11-15这五条数据

select * from ddd limit 0,5  ; 从第1条开始, 显示5条记录  1-5      第1页    (1-1)*5 ==0

select * from ddd limit 5,5; 从第6条开始, 显示5条记录    6-10     第2页      (2-1)*5 ==5

select * from ddd limit 10,5 从第11条开始, 显示5条记录  11-15      第3页      (3-1)*5 ==10

前端页面效果图:

<body>
<h3><a  href = "StuListServlet">显示所有的学生列表</a></h3><br/>
<h3><a  href = "StuListPageServlet?currentPage=1">分页显示所有的学生列表</a></h3>
</body>

dao层只能处理单一的逻辑,复杂的逻辑一般放在service层进行(分页属于复杂逻辑)   分析图:

Dao层处理两个单一的逻辑  1,返回一页的数据    2,返回总的记录数    

在逻辑层进行封装到PageBean类中

 PageBean类:  

package com.lishan.pojo;
import java.util.List;

/**
 * 封装分页的数据,里面包含了
 *      当前页的学生的集合数据
 *      总的记录数
 *      总的页数
 *      当前页
 *      每页显示的记录数
 * @author Administrator
 *
 */
public class PageStu<T> {
		private Integer currentPage;// 当前页
		private Integer totalPage;// 总的页数
		private Integer PageSize;// 每页显示的记录数
		private Integer totalSize;//总的记录数
		private  List <T> list;//当前页的学生的集合数据
		public Integer getCurrentPage() {
			return currentPage;
		}
		public void setCurrentPage(Integer currentPage) {
			this.currentPage = currentPage;
		}
		public Integer getTotalPage() {
			return totalPage;
		}
		public void setTotalPage(Integer totalPage) {
			this.totalPage = totalPage;
		}
		public Integer getPageSize() {
			return PageSize;
		}
		public void setPageSize(Integer pageSize) {
			PageSize = pageSize;
		}
		public Integer getTotalSize() {
			return totalSize;
		}
		public void setTotalSize(Integer totalSize) {
			this.totalSize = totalSize;
		}
		public List<T> getList() {
			return list;
		}
		public void setList(List<T> list) {
			this.list = list;
		}				
}

 Dao层接口代码:

	int PAGE_SIZE = 5; //一页显示多少条记录
	/**
	 * 查询指定页的学生信息
	 * @return
	 * @throws SQLException
	 */
	List<Student> findStubyPage( Integer currentPage)throws SQLException ;
	/**
	 * 返回数据库中总的记录数
	 * @return  返回数据库中总的记录数
	 * @throws SQLException
	 */
	Integer  findCount()throws SQLException ;

Dao层实现代码:  注意:new ScalarHandler()返回用Long类型来接一下,然后count.intValue() ;转换为Int类型

	/**
	 * 查询指定页的学生信息
	 */
	public List<Student> findStubyPage(Integer currentPage) throws SQLException {
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		QueryRunner queryRunner = new QueryRunner(dataSource);
		String sql = "select * from ddd limit ? ,? ";
		List<Student> list =  queryRunner.query(sql, new BeanListHandler<Student>(Student.class),(currentPage-1)*PAGE_SIZE,PAGE_SIZE);
		return list;
	}
	/**
	 * 返回数据库中总的记录数
	 */
	public Integer findCount() throws SQLException {
		ComboPooledDataSource dataSource = new ComboPooledDataSource();
		QueryRunner queryRunner = new QueryRunner(dataSource);
		String sql = "select count(*) from ddd ";
		Long count = (Long) queryRunner.query(sql, new ScalarHandler());
		return count.intValue() ;
	}

 Service层接口代码:

	
	/**
	 * 分页查询,封装结果到PageBean
	 * @return
	 * @throws SQLException
	 */
	PageBean findStubyPage( Integer currentPage)throws SQLException ;

Service层实现主要做PageBean的封装 :  5条数据的封装   就是封装下面这5条所需要的的数据     这一步很重要,页面和页数有关的数据都依靠这一步的数据封装进行显示

        private Integer currentPage;// 当前页
        private Integer totalPage;// 总的页数
        private Integer PageSize;// 每页显示的记录数
        private Integer totalSize;//总的记录数
        private  List <T> list;//当前页的学生的集合数据

public PageBean findStubyPage(Integer currentPage) throws SQLException {
		//封装分页的该页数据
		PageBean<Student> pageBean = new PageBean<Student>();
		int pageSize = StuDao.PAGE_SIZE ;
		pageBean.setCurrentPage(currentPage); //设置当前页
		pageBean.setPageSize(pageSize); //设置每页显示多少记录
		
		StuDao dao = new StuDaoImpl() ;
		List<Student> list =dao.findStubyPage(currentPage);
		pageBean.setList(list); //设置这一页的学生数据
		
		//总的记录数, 总的页数。
		int count = dao.findCount();
		pageBean.setTotalSize(count); //设置总的记录数
		//200 , 10 ==20   201 , 10 = 21   201 % 10 == 0 ?201 / 10 :201 % 10 + 1
		pageBean.setTotalPage(count % pageSize==0 ? count / pageSize : (count / pageSize) + 1); //总页数
		return pageBean;
	}

Servlet接收这个PageBean 并将其存入到request中:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			//1. 获取需要显示的页码数
			Integer currentPage =Integer.parseInt( request.getParameter("currentPage"));
			
			//2. 根据指定的页数,去获取该页的数据回来
			//List<Student> --- list.jsp
			
			StuService service = new StuServiceImpl();
			PageBean pageBean= service.findStubyPage(currentPage);
			request.setAttribute("pageBean", pageBean);
			//3. 跳转界面。
			request.getRequestDispatcher("list_page.jsp").forward(request, response);
		} catch (SQLException e) {
			e.printStackTrace();
		}	
	}

 前端页面代码:   主要的分页代码在分割线里面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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>学生列表</title>
<script type="text/javascript">
		function doDelete(sid){
		var flag = 	confirm("是否确认删除?");
		if(flag){
			//点击了确定  访问DeleteServlet,在当前的标签页上,打开这个超链接
			window.location.href="DeleteServlet?sid="+sid;
			}
		}
</script>
</head>
<h1 align="center">学生信息列表显示</h1>
<body>
<form action="SearchStuServlet" method="post">
	<table border="1px" width="700" align="center" >
		<tr > 
			<td colspan="8">
			按姓名查询:<input type="text" name = "sname">
			&nbsp;	&nbsp;	&nbsp;	
			按性别查询:<select name ="sex">
						<option  value ="">--请选择--</option>
						<option value ="男">男</option>
						<option value ="女">女</option>
					</select>
				&nbsp;	&nbsp;	&nbsp;	
				<input type="submit" value="查询">
				&nbsp;	&nbsp;	&nbsp;	
				<a href="add.jsp">添加</a>
			</td>
		</tr>
		<tr align="center">
			<td>编号</td>
			<td>姓名</td>
			<td>性别</td>
			<td>电话</td>
			<td>生日</td>
			<td>爱好</td>
			<td>简介</td>
			<td>操作</td>
		</tr>
		<c:forEach items="${pageBean.list }" var="stu">
		<tr align="center">
			<td>${stu.sid }</td>
			<td>${stu.sname }</td>
			<td>${stu.sex }</td>
			<td>${stu.phone }</td>
			<td>${stu.birthday }</td>
			<td>${stu.hobby }</td>
			<td>${stu.info }</td>
			<td><a href="EditStuServlet?sid=${stu.sid }">更新</a> |<a href="#"  οnclick="doDelete(${stu.sid})">删除</a></td>
		</tr>
		</c:forEach>
		<tr >
--------------------------------------------------------------------------------------------------------------------
			<td colspan="8">
			第 ${pageBean.currentPage } / ${pageBean.totalPage }
			  		&nbsp;&nbsp;
			  		每页显示${pageBean.pageSize }条  &nbsp;&nbsp;&nbsp;
			  		总的记录数${pageBean.totalSize } &nbsp;&nbsp;&nbsp;
			  		<c:if test="${pageBean.currentPage !=1 }">
			  			<a href="StuListPageServlet?currentPage=1">首页</a>
						| <a href="StuListPageServlet?currentPage=${pageBean.currentPage-1 }">上一页</a>
			  		</c:if>
			  		
			  		<c:forEach begin="1" end="${pageBean.totalPage }" var="i">
			  			<c:if test="${pageBean.currentPage == i }">
			  				${i }
			  			</c:if>
			  			<c:if test="${pageBean.currentPage != i }">
			  				<a href="StuListPageServlet?currentPage=${i }">${i }</a>
			  			</c:if>
			  		
			  		</c:forEach>
			  		
			  		
			  		<c:if test="${pageBean.currentPage !=pageBean.totalPage }">
			  			<a href="StuListPageServlet?currentPage=${pageBean.currentPage+1 }">下一页</a> | 
			  			<a href="StuListPageServlet?currentPage=${pageBean.totalPage }">尾页</a>
			  		</c:if>
			
			</td>
		</tr>
---------------------------------------------------------------------------------------------------------------------
	</table>
	</form>
</body>
</html>

 最终前端页面展示:

发布了11 篇原创文章 · 获赞 4 · 访问量 175

猜你喜欢

转载自blog.csdn.net/liulianzi_147/article/details/104918092