当前位置: 首页 > news >正文

分页功能设计

初始记录行的偏移量是 0(而不是 1)
limit offset,rowcount
limit 偏移到那个位置offset,往下数多少个rowcount
做分页首先要规定每页有多少条
每页有5条,取出第1页数据 limit 0,5
每页有5条,取出第2页数据 limit 5,5
每页有5条,取出第3页数据 limit 10,5

pageSize: 5 pageNo: 1 2 3
limit (pageNo-1)*pageSize,pageSize

在这里插入图片描述
limit 中offset代表偏移到哪个位置,rows代表往下数多少个
pageNo, pageSize 1,5 2,5 3,5
limit (pageNo-1)*pageSize ,pageSize
pageNo limit
1 0,5
2 5,5
3 10,5

分页常见的问题:
1.封装一个分页类需要哪些信息(也是面向对象封装体现的很好的例子)
2.分页需要发送哪两条sql语句

  • 查询当前页的数据 select id,name,age,gender from student limit 0,5;
  • 查询总的数量,目的是为了算总的页数 select count(*) from student;
package com.easy.web.util;import com.easy.web.pojo.Student;import java.util.List;public class PageInfo {private List<Student> list;private Integer totalPage;private Integer pageNo;private Integer pageSize;public PageInfo() {}public PageInfo(List<Student> list, Integer totalPage, Integer pageNo, Integer pageSize) {this.list = list;this.totalPage = totalPage;this.pageNo = pageNo;this.pageSize = pageSize;}public List<Student> getList() {return list;}public void setList(List<Student> list) {this.list = list;}public Integer getTotalPage() {return totalPage;}public void setTotalPage(Integer totalPage) {this.totalPage = totalPage;}public Integer getPageNo() {return pageNo;}public void setPageNo(Integer pageNo) {this.pageNo = pageNo;}public Integer getPageSize() {return pageSize;}public void setPageSize(Integer pageSize) {this.pageSize = pageSize;}@Overridepublic String toString() {return "PageInfo{" +"list=" + list +", totalPage=" + totalPage +", pageNo=" + pageNo +", pageSize=" + pageSize +'}';}
}
if (method == null || method.equals("")) {method = "selectByPage";}
……case "selectByPage":selectByPage(req,resp);break;
……
// /student?method=selectByPage&pageNo=1&pageSize=10private void selectByPage(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("StudentServlet.selectByPage");String pageNo = req.getParameter("pageNo");String pageSize = req.getParameter("pageSize");//pageNo和pageSize是我们在url中手动输入的,但每次都这样的话会很麻烦,所以我们设置默认值if (pageNo == null || pageNo.equals("")){pageNo = "1";}if (pageSize == null || pageSize.equals("")){pageSize = "5";}PageInfo pageInfo = studentService.selectByPage(Integer.parseInt(pageNo), Integer.parseInt(pageSize));System.out.println(pageInfo);req.setAttribute("pageInfo",pageInfo);req.getRequestDispatcher("student_list.jsp").forward(req,resp);}
package com.easy.web.service;import com.easy.web.pojo.Student;
import com.easy.web.util.PageInfo;import java.util.List;public interface IStudentService {//有关Student类的方法(增删改查)//与Dao层相同List<Student> selectAll();void deleteById(Integer id);void add(Student student);Student selectById(Integer id);void update(Student student);PageInfo selectByPage(int pageNo, int pageSize);
}
    @Overridepublic PageInfo selectByPage(int pageNo, int pageSize) {//第一个sql:查询当前页的数据int offset = (pageNo - 1) * pageSize;List<Student> list = studentDao.selectByPage(offset,pageSize);//第二个sql:查询总的数量int totalCount = studentDao.selectTotalCount();int totalPage = (int)Math.ceil((double) totalCount / pageSize);PageInfo pageInfo = new PageInfo(list,totalPage,pageNo,pageSize);return pageInfo;}
package com.easy.web.dao;import com.easy.web.pojo.Student;import java.util.List;//Dao数据访问层
//分离数据访问逻辑与业务逻辑,降低两者之间的耦合度。
//接口里面列出来的是能提供的所有功能的清单
public interface IStudentDao {//有关Student类的方法(增删改查)//查询类方法有返回值,修改类方法没有List<Student> selectAll();void deleteById(Integer id);void add(Student student);Student selectById(Integer id);void update(Student student);List<Student> selectByPage(int offset, int pageSize);int selectTotalCount();
}
@Overridepublic List<Student> selectByPage(int offset, int pageSize) {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;//扩大作用域,下面要将list数据放到req中List<Student> list = new ArrayList<>();try {//利用工具类方法获取连接connection = JDBCUtil.getConnection();String sql = "SELECT id,name,age,gender FROM student LIMIT ?,?";preparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1,offset);preparedStatement.setInt(2,pageSize);System.out.println(preparedStatement);resultSet = preparedStatement.executeQuery();//因为在这里声明的list只能在try的大括号里面使用,下面拿不到,所以需要在try上面声明list,扩大作用域//List<Student> list = new ArrayList<>();while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");int age = resultSet.getInt("age");String gender = resultSet.getString("gender");Student student = new Student(id, name, age, gender);list.add(student);}for (Student student : list) {System.out.println(student);}}//ClassNotFoundException在JDBCUtil静态代码块中已被捕获,所以不需要在这里再捕获了catch (SQLException e) {throw new RuntimeException(e);} finally {JDBCUtil.close(connection, preparedStatement, resultSet);}return list;}@Overridepublic int selectTotalCount() {Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;//在这里不再是封装成list集合,封装为一个student对象即可int totalCount = 0;try {connection = JDBCUtil.getConnection();String sql = "SELECT count(*) FROM student";preparedStatement = connection.prepareStatement(sql);System.out.println(preparedStatement);resultSet = preparedStatement.executeQuery();while (resultSet.next()) {//count(*)生成一行一列的数据//获取第一列的数据totalCount = resultSet.getInt(1);}}         //ClassNotFoundException在JDBCUtil静态代码块中已被捕获,所以不需要在这里再捕获了catch (SQLException e) {throw new RuntimeException(e);} finally {JDBCUtil.close(connection, preparedStatement, resultSet);}return totalCount;}

分页代码在v3.bootcss.com网站中的“组件”下找到的

    <%//JSP脚本,这里可以任意写java代码//request为内置对象,jsp页面已经new好了这个对象,名字也起好了// (request)(前面用的是缩写req,这里必须是完整的单词),所以名字不能乱改//前面已经将list数据放入request(req)中,现在需要将数据从request(req)中拿出来PageInfo pageInfo = (PageInfo) request.getAttribute("pageInfo");%>
……
<%--分页--%><nav aria-label="Page navigation"><ul class="pagination"><%//当当前页为第一页时,“上一页”应该不能点击if (pageInfo.getPageNo() == 1){%><%--class = "disabled"表示不可点击状态--%><li class = "disabled"><%--href="#"代表不进行页面跳转--%><a href="#" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li><%}else {%><li><%--上一页的pageNo为当前页-1--%><a href="/student?method=selectByPage&pageNo=<%=pageInfo.getPageNo() - 1%>&pageSize=5" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li><%}%><%for (int i = 1; i <= pageInfo.getTotalPage(); i++) {//点击页面为当前页if (pageInfo.getPageNo() == i){%><%--再次点击当前页不进行页面跳转--%><li class="active"><a href="#"><%=i%></a></li><%}else {%><li><a href="/student?method=selectByPage&pageNo=<%=i%>&pageSize=5"><%=i%></a></li><%}}%><%//与“上一页”同理if (pageInfo.getPageNo() == pageInfo.getTotalPage()){%><li class="disabled"><a href="#" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li><%}else {%><li><a href="/student?method=selectByPage&pageNo=<%=pageInfo.getPageNo() + 1%>&pageSize=5" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li><%}%></ul></nav>
http://www.xdnf.cn/news/1430983.html

相关文章:

  • MYSQL配置复制拓扑知识点
  • 【54页PPT】数字化转型数据中台解决方案(附下载方式)
  • spring boot 整合AI教程
  • 解析ELK(filebeat+logstash+elasticsearch+kibana)日志系统原理以及k8s集群日志采集过程
  • Unity学习----【数据持久化】二进制数据(五)--由Excel自动生成数据结构类与二进制文件
  • 【常见的几款棋牌室计时软件】佳易王棋牌室计时计费软件大众版,佳易王棋牌室计时计费高级版,两款软件有何不同,适配不同场景需求#软件具体教程详解
  • react+taro的使用整理
  • 将 .vcproj 文件转换为 .pro 文件
  • 企业DevOps的安全与合规关键:三大主流DevOps平台能力对比
  • 认识⼯作区、暂存区、版本库
  • Wireshark笔记-DHCP两步交互流程与数据解析
  • 简单爬一个小说页面 HTML 的title和内容
  • 基于STM32单片机智能家居wifi远程监控系统机智云app设计
  • Zookeeper分布式锁原理
  • 域名备案成功后怎么还显示没有注册
  • 基于vue3和springboot框架集成websocket
  • springboot项目使用websocket功能,使用了nginx反向代理后连接失败问题解决
  • DASK shuffle任务图分析
  • ansible循环
  • 零依赖每月工作计划备忘录:高效管理你的每一天
  • TSMC-1987《Convergence Theory for Fuzzy c-Means: Counterexamples and Repairs》
  • 电动车动力电池自动点焊机|深圳比斯特自动化
  • 证明有理数集不是完备的度量空间
  • SpringBoot 整合 RabbitMQ 的完美实践
  • 【代码随想录day 22】 力扣 40.组合总和II
  • Elasticsearch 深分页限制与解决方案
  • 计算机Python毕业设计推荐:基于Django+Vue用户评论挖掘旅游系统
  • 深度学习——基于卷积神经网络实现食物图像分类之(保存最优模型)
  • 前缀和之距离和
  • 架构设计:AIGC 新规下 UGC 平台内容审核防火墙的构建