1一乐

V1

2022/01/29阅读:60主题:默认主题

mysql高级查询~分页查询



一、分页设计原理与设计:

1、分页设计

(1)逻辑分页(假分页/内存分页):

一次性把数据库某张表中所有数据都查询出来,存放到一个List集合中,每次翻页的时候,只需要从内存(List)中去获取指定的条数即可

​ 第一页:索引从0~9的元素

​ 第二页:索引从10~19的元素

  • 优点:操作简单,翻页比较快。

  • 缺点:第一次查询比较慢,数据过多,可能造成内存溢出

(2) 物理分页(真分页/数据库分页)【推荐】,比如mysql中使用LIMIT,Oracle使用子查询

每次翻页都从数据库中查询指定的条数。

​ 第一页:从数据库中查询第一个10条数据

​ 第二页:从数据库中查询第二个10条数据

  • 优点:若数据过多,不会造成内存溢出的情况
  • 缺点:每次翻页都需要从数据库中查询,翻页比较慢

2、分页的原理:(两条sql查询语句)

① 第一条sql:查询符合条件的结果总数(totalCount):

SELECT COUNT(idFROM 表名 [WHERE 条件];

② 分页查询(LIMIT) 符合条件的结果集(resultSet):

SELECT COUNT(idFROM 表名 [WHERE 条件] LIMIT beginIndex, pageSize;
  • beginIndex 索引是从0开始的,从哪一条数据开始截取 beginIndex = (currentPage - 1) * pageSize;
  • pageSize 每次截取多少条数据

(1) 需要用户传入的数据:当前页数 currentPage(默认值是1) 每页最多展示数据 pageSize

(2) 程序员计算(考虑代码的健壮性---进行分析判断):

  • 首页(即第一页,默认值是1):beginPage = 1;
  • 上一页:prevPage = currentPage - 1 >= 1 ? currentPage - 1 : 1;
  • 下一页:nextPage = currentPage + 1 <= totalPage ? currentPage + 1 : totalPage;
  • 总页数:totalPage = totalCount % pageSize == 0 ? totalCount/pageSize : totalCount/pageSize + 1;

3、(分页查询)临散数据的封装:

(1)临散的数据如下:

临散的数据
临散的数据

(2)解决:把分页结果数据存储到分页结果对象(PageResult/PageList)

PageResult/PageList
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;//末页(总页)
  
}

(3)封装之后的servlet和jsp对比:

封装之后的servlet和jsp对比
封装之后的servlet和jsp对比

4、增加分页查询的思路:

4-1、后台实现【DAO层新增分页查询结果的接口】

(1) 封装了分页查询看到的所有数据(比较临散)PageResult对象

(2) DAO层增加分页查询方法(返回值是分页查询对象PageResult,传入用户输入的参数【currentPage、pageSize】) 和 DAOImpl中增加具体实现

(3) 编写测试新增分页查询的代码

4-2、前台实现

(1)从界面(jsp)开始设计:添加上分页的界面设计(jsp的数据还没使用${}): 在这里插入图片描述

(2) 书写(servlet)来处理分页查询请求的PageServlet(servlet中调用的业务方法的参数应该从用户输入传递过来【接收请求】)

 //先写死数据共享到jsp,来完成jsp界面的${}数据
 PageResult<Teacher> pageResult = teacherDAO.query(25);
 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共享传递过来的)---使用${}:

 <%-- 分页查询 --%>
  <tr>
   <td colspan="8" align="center">
   <a href="/page?currentPage=1">首页</a>
   <a href="/page?curentPage=${pageResult.prevPage}">上页</a>
   <a href="/page?curentPage=${pageResult.nextPage}">下页</a>
   <a href="/page?curentPage=${pageResult.totalPage}">末页</a>
   当前第${pageResult.currentPage}页/${pageResult.totalPage}页,一共${pageResult.totalCount}条数据
   </td>
  </tr> 

(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);

分类:

后端

标签:

后端

作者介绍

1一乐
V1