欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

物理分页

程序员文章站 2022-07-02 21:10:37
...

物理分页:真分页

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

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

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

 

逻辑分页:假分页

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

优点:访问速度快

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

这里介绍物理分页

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>

 最终前端页面展示:

物理分页