物理分页
物理分页:真分页
来数据库查询的时候,只查一页的数据就返回了
优点:内存中的数据量不会太大
缺点:对数据库的访问频繁
逻辑分页:假分页
一口气把所有的数据全部查询出来,然后存放在内存中
优点:访问速度快
缺点:数据库量过大,容易内存溢出
这里介绍物理分页
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">
按性别查询:<select name ="sex">
<option value ="">--请选择--</option>
<option value ="男">男</option>
<option value ="女">女</option>
</select>
<input type="submit" value="查询">
<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 }
每页显示${pageBean.pageSize }条
总的记录数${pageBean.totalSize }
<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>
最终前端页面展示: