分页查询总结

1.分⻚技术

本文代码Git地址:https://gitee.com/lucky_h/java

1.分页是啥

分页是指一种将所有数据分段展示欸用户的计算,比如一本小说 共计220页,读者每次看到的页码就是分页。

2.意义

​ 对于企业信息系统来说数据量不会限制在一个小范围内.当表中的数据量超过一定量(十万级)的时候,一次性的展示数据到页面中会造成以下问题,创建过多的对象,将会使内存耗尽,造成系统崩溃 过多的数据 不便于展示,会造成系统运行缓慢。

3.原理
  • 实现分页,只需要每次从数据库中读取部分数据就可以了。可使用limit关键字

  • limit关键字语法一: select * from 表名 limit a,bl

    ​ 此时 a 是 起始位置

    ​ b 是 查询的条数

    • limit关键字语法二: limit b;

      此时 b 代表条数

3.2计算方法
  • 分页的必要参数

    • 页码 :你要查看的第几页
    • count 每一页的条数

    eg 每一页显示三条记录
    SELECT * FROM 表名 LIMIT 0,3;

    假设 页码为p,条数为c 需要的起始位置为:x = (页码-1)x 条数 = (p-1) * c

    • eg 每页显示4条 显示2页 (页码-1)*条数 = 4

      select * from 表 limit 4,4;

    • 总页数 = 总条数 / 每页条数 + (总条数 % 每页条数 > 0 ? 1:0)

1.2代码实现
1.2.1 思路分析
  • 分页实现的步骤:

    1.Dao层 ------> UserDao

    添加方法:查询用户的总记录数()

    ​ 查询分页用户的数据 () 通过 mysql 中 limit ?,? 来实现分页查询功能 第一个?代表从第几个记录开始查询,第二个?代 表查询多少条记录

    1. vivew层(jsp)

      ​ index.jsp 首页、上一页、下一页、尾页,增加相应的链接

    3.controller 层(servlet):

    ​ servlet的dopost方法里面,调用方法之后将结果通过setAttribute 来返回数据

1.2.2 代码实现

1.Dao层

/**
     * 分页
     * @author 小杭呀
     * @param page
     * @param count
     * @return
     */
    public List<Sp> selectSpByPage(int page, int count) {
        List<Sp> spList = new ArrayList<>();
        try {
            conn = DBconn.getConn();
            String sql = "select * from sp limit ?,?";
            pstm = conn.prepareStatement(sql);
            //计算页码
            int pages = (page-1)*count;
            pstm.setInt(1, pages);
            pstm.setInt(2, count);
            rs = pstm.executeQuery();
            while (rs.next()){
                Sp sp = new Sp();
                sp.setId(rs.getInt("id"));
                sp.setName(rs.getString("name"));
                sp.setPrice(rs.getString("price"));
                sp.setNumber(rs.getInt("number"));
                //将数据插进去
                spList.add(sp);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return spList;
    }
   /**
     * 查询总页数
     *
     * @param count
     * @return
     * 公式:总条数/每夜条数 + (如果有余数+1 没有+0)
     *  总页数 =    总条数 / 每页条数 + (总条数 % 每页条数 > 0 ? 1:0)
     */
    public int selectSumPage(int count) {
        int sumpage = 0;
        int sumCount = 0;
        try {
            conn = DBconn.getConn();
            // 查询总条数
            String sql = "select count(*) from sp";
            pstm = conn.prepareStatement(sql);

            rs =  pstm.executeQuery();
            if(rs.next()) {
                sumCount = rs.getInt(1);
            }
            //带入公式
            sumpage = sumCount / count +(sumCount % count > 0?1:0);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return sumpage;
    }
  1. service 业务层

    **
     * @author 魏小杭
     */
    public class SpService {
    
        //引入数据访问层dao
        private SpDao dao;
        public SpService() {
            dao = new SpDao();
        }
    
        /**
         * 分页
         * @param page
         * @param count
         * @return
         */
        public List<Sp> selectSpByPage(int page, int count) {
            return dao.selectSpByPage(page, count) ;
        }
        /**
         * 获取总页数
         * @param count
         * @return
         */
        public int selectSumPage(int count) {
            return dao.selectSumPage(count);
        }
    }
    

    3.servlet控制层

    public class SpServlet extends HttpServlet {
        
        //初始化引用service对象
         private SpService service;
       	 @Override
       	 public void init() throws ServletException {
            service = new SpService();
        }
         @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            //1.获取页码 条数
            String pageIndex = req.getParameter("page");
            String countStr = req.getParameter("count");
    
            //初始默认页码和条数
            int page = 1;
            int count = 5;
    
            //判断是否存有效
            try {
                //page 和count 必须得大于0
                if (Integer.valueOf(pageIndex) > 0){ //如果参数有效
                    page = Integer.valueOf(pageIndex);//使用参数
                }
            }catch (Exception e){
                e.printStackTrace();
            }
    
            //单独捕获异常,如果放到一块的话 第一个转换失败 第二个就不会执行了
            try {
                if (Integer.valueOf(countStr) > 0){//如果参数有效
                    count = Integer.valueOf(countStr);//使用参数
                }
    
            }catch (Exception e){
                e.printStackTrace();
            }
    
            List<Sp> spList = service.selectSpByPage(page,count);
    
            //总页数
            int sumPage = service.selectSumPage(count);
            //将splist 和 总页数 当前页面 带给jsp
            req.setAttribute("spList",spList);
            req.setAttribute("sumPage",sumPage );
            req.setAttribute("page",page );
            //跳转页面 此时携带参数 必须使用请求转发
            req.getRequestDispatcher("index.jsp").forward(req,resp);
    
        }
    }
    
    1. vivew视图层(jsp) 需要引入jstl标签

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>>
      <html>
        <head>
          <title>分页查询</title>
        </head>
        <body>
      
        <table border="1px" align="center">
          <tr>
            <th>货号</th> <th>名称</th>  <th>价格</th> <th>库存</th>
          </tr>
            
      	<%--遍历splist集合--%>	
          <c:forEach items="${spList}" var="sp">
            <tr>
              <td>${sp.id}</td> <td>${sp.name}</td> <td>${sp.price}</td> <td>${sp.number}</td>
            </tr>
      
          </c:forEach>
      
        </table>
      
        <div align="center">
          <a href="show?page=1">首页</a>
          
      <%--    判断还能不能点击下一页--%>
          
          <c:if test="${page>1}"  >
            <a href="show?page=${page-1}">上一页</a>
          </c:if>
      
          <span>${page}/${sumPage}</span>
      
          <c:if test="${page<sumPage}"  >
            <a href="show?page=${page+1}">下一页</a>
          </c:if>
          <a href="show?page=${sumPage}">末尾</a>
      
        </div>
      
      <%--  如果用户直接访问了index是没有数据的,需要自动发送请求--%>
        <c:if test="${empty spList}">
          <jsp:forward page="show"></jsp:forward>
        </c:if>
      
        </body>
      </html>
      
1.3 分页查询总结
  • select * from 表名 limit a,b; a 是 起始位置 b 是 查询的条数
  • 总页数 = 总条数 / 每页条数 + (总条数 % 每页条数 > 0 ? 1:0)
  • *起始位置为:x = (页码-1)条数
  • 在编写servlet 需要给定一个初始默认页码和条数,这样即使 后面判断代码不生效 也能赋值 避免空值出现
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值