(1)逻辑分页(假分页/内存分页):
一次性
把数据库某张表中所有数据
都查询出来,存放到一个List集合中
,每次翻页的时候,只需要从内存(List)中去获取指定的条数即可
第一页:索引从0~9的元素
第二页:索引从10~19的元素
优点:操作简单,翻页比较快。
缺点:第一次查询比较慢,数据过多,可能造成内存溢出
。
(2) 物理分页(真分页/数据库分页)【推荐
】,比如mysql中使用LIMIT
,Oracle使用子查询
每次翻页都从数据库中查询指定的条数。
第一页:从数据库中查询第一个10条数据
第二页:从数据库中查询第二个10条数据
① 第一条sql:查询符合条件的结果总数
(totalCount):
SELECT COUNT(id) FROM 表名 [WHERE 条件];
② 分页查询(LIMIT) 符合条件的结果集
(resultSet):
SELECT COUNT(id) FROM 表名 [WHERE 条件] LIMIT beginIndex, pageSize;
beginIndex = (currentPage - 1) * pageSize;
(1) 需要用户传入的数据:当前页数 currentPage
(默认值是1) 每页最多展示数据 pageSize
(2) 程序员计算(考虑代码的健壮性—进行分析判断):
分页结果对象
(PageResult/PageList)//分页的结果对象
public class PageResult<T> {
//两条sql语句【分页查询LIMIT、结果集总数COUNT】
private List<T> listData;//分页查询的结果集数据(分页LIMITsql查询)
private Integer totalCount;//结果总条数(COUNT的sql查询)
//用户输入的当前页、每页条数
private Integer currentPage = 1;
private Integer pageSize = 4;
//计算得出
private Integer beginPage = 1;//首页(第一页)
private Integer prevPage;//上页
private Integer nextPage;//下页
private Integer totalPage;//末页(总页)
}
(1) 封装了分页查询看到的
所有数据(比较临散)PageResult对象
(2) DAO层增加分页查询方法(返回值是分页查询对象PageResult,传入用户输入的参数【currentPage、pageSize】) 和 DAOImpl中增加具体实现
(3) 编写测试新增分页查询的代码
(1)从界面(jsp
)开始设计:添加上分页的界面设计(jsp的数据还没使用${}):
(2) 书写(servlet
)来处理分页查询请求的PageServlet(servlet中调用的业务方法的参数应该从用户输入传递过来【接收请求】)
//先写死数据共享到jsp,来完成jsp界面的${}数据
PageResult<Teacher> pageResult = teacherDAO.query(2, 5);
req.setAttribute("pageResult", pageResult);
// 3、控制页面跳转[1、对应的jsp在WEB-INF里,2、需要共享数据过去]
req.getRequestDispatcher("/WEB-INF/views/teacher/teacher_list.jsp").forward(req, resp);
(3) 先完成jsp的数据(从servlet共享传递过来的)—使用${}:
<%-- 分页查询 --%>
首页
上页
下页
末页
当前第${pageResult.currentPage}页/${pageResult.totalPage}页,一共${pageResult.totalCount}条数据
(4)servlet中调用的业务方法参数应该从用户输入传递过来[jsp界面输入传递过来的数据,即接收请求参数]:
//接收请求参数(接收从jsp中输入传递过来的数据)
Integer currentPage = 1;
String sCurrentPage = req.getParameter("currentPage");
if(StringUtils.isNotBlank(sCurrentPage)) {
currentPage = Integer.valueOf(sCurrentPage);
System.out.println(currentPage);
}
//接收参数currentPage(pageSize同理)
PageResult<Teacher> pageResult = teacherDAO.query(currentPage, 5);