精华内容
下载资源
问答
  • 什么是分页?怎么实现分页的实现?

    千次阅读 多人点赞 2019-09-13 15:55:28
    分页的实现

    分页的实现

    分页简介
    分页(英语:Paging),是一种操作系统里存储器管理的一种技术,可以使电脑的主存可以使用存储在辅助存储器中的数据。操作系统会将辅助存储器(通常是磁盘)中的数据分区成固定大小的区块,称为“页”。当不需要时,将分页由主存(通常是内存)移到辅助存储器;当需要时,再将数据取回,加载主存中。相对于分段,分页允许存储器存储于不连续的区块以维持文件系统的整齐。分页是磁盘和内存间传输数据块的最小单位,在Java中是一种特别常见的现象,下面我将一点一点的带着大家来分析一下分页。

    理解分页
    分页无非就是在服务器端得到数据,然后以固定的条数来写到浏览器端进行显示的过程,要想写好分页,不非就是首先明确,一个分页功能需要包含什么样的变量,这些变量该怎么获得,是从前端页面传过来呢,还是从后端获取的呢,下面咱们来简单的了解一下:
    1.totalCount :总的数据的条数,显然易见,由于数据库的数据可以变化,显然该数据需要从后台获取。
    2.totalPage:总的页数,由于总的数据是从数据库中查询出来的,每页多少条数据都可以是事先知道的,所以,从后台获取
    3.list 每页的数据,显然是从后台获取的
    4.currentPage当前页,显然是从前台获取的,因为每次大家需要点击不同的页数,传递过来的数据都是不一样的
    5rows.每页多少条数据,可以从前台获取也可以从后台获取,我建议从后台获取,可以将其存到配置文件中,可以通过获取到不同的标准,符合Java的编程理念

    细节优化和讲解
    首先将rows写到web.xml文件中对应的分页对应的servlet中,再通过getServletConfig().getInitParameter()初始化的时候获取:
    在这里插入图片描述
    各变量的简单的书写流程,大家可以简单理解一下,下面会详细解答
    在这里插入图片描述
    流程分析
    1.首先从前台获取到当前页
    2.利用service查询PageBean
    3.将pageBean存到request域对象中
    4.转发到list.jsp,利用jstl和el表达式来实现数据的显示
    在这里插入图片描述
    代码体现
    将分页的详细属性封装成JavaBean,便于存到域对象中,获取其数据值

    package cn.ujiuye.domain;
    
    import java.util.List;
    
    /**
     * 分页的javaBean
     */
    public class PageBean<T> {
        private int totalCount;  //总的记录数
        private int totalPage;   //总的页码
        private List<T> list;    //每页的数据
        private int currentPage; //当前页
        private int rows;        //每页显示的条数
    
        public int getTotalCount() {
            return totalCount;
        }
    
        public void setTotalCount(int totalCount) {
            this.totalCount = totalCount;
        }
    
        public int getTotalPage() {
            return totalPage;
        }
    
        public void setTotalPage(int totalPage) {
            this.totalPage = totalPage;
        }
    
        public List<T> getList() {
            return list;
        }
    
        public void setList(List<T> list) {
            this.list = list;
        }
    
        public int getCurrentPage() {
            return currentPage;
        }
    
        public void setCurrentPage(int currentPage) {
            this.currentPage = currentPage;
        }
    
        public int getRows() {
            return rows;
        }
    
        public void setRows(int rows) {
            this.rows = rows;
        }
    
        @Override
        public String toString() {
            return "PageBean{" +
                    "totalCount=" + totalCount +
                    ", totalPage=" + totalPage +
                    ", list=" + list +
                    ", currentPage=" + currentPage +
                    ", rows=" + rows +
                    '}';
        }
    }
    
    

    首先书写一个findProductByPageServlet,实现前端和后端的数据的交互,我认为首先写后台代码,再将所需要的当前页的currentPage手动通过地址栏手动传入数据,这样可以最快进入数据的书写流程,可以先检查后端代码是不是实现的没有问题
    在这里插入图片描述

    package cn.ujiuye.web.servlet;
    import cn.ujiuye.domain.PageBean;
    import cn.ujiuye.domain.Product;
    import cn.ujiuye.service.ProductService;
    import cn.ujiuye.service.impl.ProductServiceImpl;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class FindProductByPageServlet extends HttpServlet {
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1.获取请求参数
            String currentPage = request.getParameter("currentPage");
            String rows = getServletConfig().getInitParameter("rows");
            //判断从其他的页面传递过来的时候,这个时候需要做对其当前页的判断
            if (currentPage == null || "".equals(currentPage)){
                currentPage = "1";
            }
    
            System.out.println("当前页码是:"+currentPage);
            System.out.println("每页的条数是:"+ rows);
    
            //2.调用service进行查询
            ProductService service = new ProductServiceImpl();
            PageBean<Product> pb = service.findUserByPage(currentPage,rows);
    
            System.out.println(pb.getTotalPage()+"***************");
    
            //3.将pageBean存入到域对象中
            request.setAttribute("pb",pb);
            //4.转发到list.jsp页面中去
            request.getRequestDispatcher("/list.jsp").forward(request,response);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }
    
    
    }
    
    

    在service层实现数据的业务逻辑的处理,我是用了接口的思想来实现的,把数据存入到JavaBean的时候,方便调用,将其分页的各项需求的内容都写入到JavaBean中,从前端获取的当前页,从servlet中获取的每页有多少条数据,通过dao来查询数据库中一共有多少条数据,通过计算获取其一共多少页,返回每一页有多少条数据,这些数据在service层都传入到JavaBean中,用于封装起来了

      /**
         * 分页查询
         * @param _currentPage
         * @param _rows
         * @return
         */
        @Override
        public PageBean<Product> findUserByPage(String _currentPage, String _rows) {
            int currentPage = Integer.parseInt(_currentPage); //当前页数
            int rows = Integer.parseInt(_rows);               //每页多少条数据
    
            if (currentPage <= 1){
                currentPage = 1;
            }
            //1.创建一个空的PageBean对象
            PageBean<Product> pb =  new PageBean<Product>();
            //2.设置参数
            pb.setCurrentPage(currentPage);
            pb.setRows(rows);
    
            //3.使用dao查询获取总数据数
            int totalCount = dao.findTotalCount();
            System.out.println(totalCount);
    
            pb.setTotalCount(totalCount);
            //4.调用dao查询每页List集合中的详情
            int start = (currentPage - 1) * rows;
            List<Product> list = dao.findByPage(start,rows);
            pb.setList(list);
    
            //5.计算出总页码
            int totalPage = totalCount % rows == 0 ? totalCount / rows : totalCount / rows + 1;
            pb.setTotalPage(totalPage);
    
            return pb;
        }
    

    在dao层中实现每页数据的显示和总记录的查询

     /**
         * 返回总记录数
         * @return
         */
        @Override
        public int findTotalCount() {
            //1.定义sql
            String sql = " select count(*) from product ";
            return template.queryForObject(sql,Integer.class);
        }
    
        /**
         * 分页操作,返回每一页的数据
         * @param start
         * @param rows
         * @return
         */
        @Override
        public List<Product> findByPage(int start, int rows) {
            //1.定义sql
            String sql = "select * from product limit ?,? ";
            return template.query(sql,new BeanPropertyRowMapper<Product>(Product.class),start,rows);
        }
    

    这些完成后就开始了前端页面的书写,主要就是说从域对象中获取需要的值,然后利用jstl和el表达式来获取其值,从而达到显示的效果,注意上一页和下一页的写法和对于一些特别的地方的控制,在这里就不多介绍了,我还加入了bootstrap让页面更加漂亮了,下面给大家显示一个前端的源码和相应的显示结果

     <%--分页栏显示出来--%>
         <nav aria-label="Page navigation" style="text-align: center">
             <ul class="pagination pagination-lg">
    
                 <c:if test="${pb.currentPage == 1}">
                     <li class="disabled">
                 </c:if>
                 <c:if test="${pb.currentPage != 1}">
                     <li>
                 </c:if>
    
                     <a href="${pageContext.request.contextPath}/findProductByPageServlet?currentPage=${pb.currentPage - 1}" aria-label="Previous">
                         <span aria-hidden="true">&laquo;</span>
                     </a>
                 </li>
    
    
                 <c:forEach begin="1" end="${pb.totalPage}" var="i">
    
                     <c:if test="${pb.currentPage == i}">
                         <li class="active"><a href="${pageContext.request.contextPath}/findProductByPageServlet?currentPage=${i}">${i}</a></li>
                     </c:if>
                     <c:if test="${pb.currentPage != i}">
                         <li><a href="${pageContext.request.contextPath}/findProductByPageServlet?currentPage=${i}">${i}</a></li>
                     </c:if>
    
                 </c:forEach>
    
                 <c:if test="${pb.currentPage == pb.totalPage}">
                     <li class="disabled">
                         <a aria-label="Next">
                             <span aria-hidden="true">&raquo;</span>
                         </a>
                     </li>
                 </c:if>
    
                 <c:if test="${pb.currentPage != pb.totalPage}">
                     <li>
                         <a href="${pageContext.request.contextPath}/findProductByPageServlet?currentPage=${pb.currentPage + 1}" aria-label="Next">
                             <span aria-hidden="true">&raquo;</span>
                         </a>
                     </li>
                 </c:if>
    
    
                 <span style="font-size: 25px;margin-left: 5px">
                        &nbsp;&nbsp;共${pb.totalCount}条数据,共${pb.totalPage}页
                 </span>
             </ul>
         </nav>
    

    在这里插入图片描述
    总结:希望大家都可以认真来确定自己是否学会了,是否可以真的能够实现自己的功能,自己可以来写自己想要的,自己要具备可以不改变的功能,能够对知识有一个真实的认识,我写的好的,大家多多指教,欢迎评论和点赞,希望要源码的私聊我

    展开全文
  • ORACLE分页查询SQL语句(最有效的分页)

    万次阅读 多人点赞 2018-11-01 16:18:24
    而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,...

    一、效率高的写法

    1.无ORDER BY排序的写法。(效率最高)
    (经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!)

    SELECT *
    
      FROM (SELECT ROWNUM AS rowno, t.*
    
              FROM emp t
    
             WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                 AND TO_DATE ('20060731', 'yyyymmdd')
    
               AND ROWNUM <= 20) table_alias
    
     WHERE table_alias.rowno >= 10;
    

    2.有ORDER BY排序的写法。(效率较高)
    (经过测试,此方法随着查询范围的扩大,速度也会越来越慢哦!)

    SELECT *
    
      FROM (SELECT tt.*, ROWNUM AS rowno
    
              FROM (  SELECT t.*
    
                        FROM emp t
    
                       WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                           AND TO_DATE ('20060731', 'yyyymmdd')
    
                    ORDER BY create_time DESC, emp_no) tt
    
             WHERE ROWNUM <= 20) table_alias
    
     WHERE table_alias.rowno >= 10;
    

    二、效率垃圾但又似乎很常用的分页写法

    3.无ORDER BY排序的写法。(建议使用方法1代替)
    (此方法随着查询数据量的扩张,速度会越来越慢哦!)

    SELECT *
    
      FROM (SELECT ROWNUM AS rowno, t.*
    
              FROM k_task t
    
             WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                   AND TO_DATE ('20060731', 'yyyymmdd')) table_alias
    
     WHERE table_alias.rowno <= 20 AND table_alias.rowno >= 10;
    
    --TABLE_ALIAS.ROWNO  between 10 and 100;
    

    4.有ORDER BY排序的写法.(建议使用方法2代替)
    (此方法随着查询范围的扩大,速度会越来越慢哦!)

    SELECT *
    
      FROM (SELECT tt.*, ROWNUM AS rowno
    
              FROM (  SELECT *
    
                        FROM k_task t
    
                       WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                             AND TO_DATE ('20060531', 'yyyymmdd')
    
                    ORDER BY fact_up_time, flight_no) tt) table_alias
    
     WHERE table_alias.rowno BETWEEN 10 AND 20;
    

    5.另类语法。(有ORDER BY写法)
    (语法风格与传统的SQL语法不同,不方便阅读与理解,为规范与统一标准,不推荐使用。)

    WITH partdata AS
    
         (
    
            SELECT ROWNUM AS rowno, tt.*
    
              FROM (  SELECT *
    
                        FROM k_task t
    
                       WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                             AND TO_DATE ('20060531', 'yyyymmdd')
    
                    ORDER BY fact_up_time, flight_no) tt
    
             WHERE ROWNUM <= 20)
    
    SELECT *
    
      FROM partdata
    
     WHERE rowno >= 10;
    
     
    
    --6另类语法 。(无ORDER BY写法)
    
    WITH partdata AS
    
         (
    
            SELECT ROWNUM AS rowno, t.*
    
              FROM k_task t
    
             WHERE flight_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
    
                                   AND TO_DATE ('20060531', 'yyyymmdd')
    
               AND ROWNUM <= 20)
    
    SELECT *
    
      FROM partdata
    
     WHERE rowno >= 10;
    

    三、分析

    Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。

    分页查询格式:

    SELECT *
    
      FROM (SELECT a.*, ROWNUM rn
    
              FROM (SELECT *
    
                      FROM table_name) a
    
             WHERE ROWNUM <= 40)
    
     WHERE rn >= 21
    

    其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。

    上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。

    选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:

    SELECT *
    
      FROM (SELECT a.*, ROWNUM rn
    
              FROM (SELECT *
    
                      FROM table_name) a)
    
     WHERE rn BETWEEN 21 AND 40
    

    对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

    这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

    而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。

    上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

    这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。

    下面简单讨论一下多表联合的情况。

    对于最常见的等值表连接查询,CBO一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。

    因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:

    SELECT *
    
      FROM (SELECT a.*, ROWNUM rn
    
              FROM (SELECT *
    
                      FROM table_name) a
    
             WHERE ROWNUM <= 40)
    
     WHERE rn >= 21
    
    展开全文
  • Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页。可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页分页插件的基本...

    Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页。可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

    分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。

    在这里插入图片描述

    展开全文
  • JS.分页 JS.分页 JS.分页 JS.分页 JS.分页 JS.分页 JS.分页 JS.分页 JS.分页
  • 分页

    千次阅读 2020-08-17 08:59:08
    mysql分页:select * from 表 limit (pageNo-1)*pageSize,pageSize; oracle分页:select a.* (select 表.*,rowum rn from 表) a where rn>(pageNo-1)pageSize and rn <=pageNopageSize;

    mysql分页:select * from 表 limit (pageNo-1)*pageSize,pageSize;

    oracle分页:select a.* (select 表.*,rowum rn from 表) a where rn>(pageNo-1)pageSize and rn <=pageNopageSize;

    展开全文
  • Mybatis如何进行分页? 使用Mybatis里面的第三方插件, 使用方式:在将要执行的sql语句之前使用分页插件:pageHelper.starPage(pageNum,pageSize); pageNum:表示的是页码,也...Mybatis分页插件的原理是什么? 使用
  • hbase查询分页分页

    2014-04-18 10:31:29
    hbase查询分页分页
  • MyBatis-Plus 分页查询以及自定义sql分页

    万次阅读 多人点赞 2019-06-12 17:53:46
    分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页。 物理分页:相当于执行了limit分页语句,返回部分数据。物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性...
  • jsf 分页 jsf 分页 jsf 分页 jsf 分页
  • springboot项目整合mybatis想要实现分页功能,那么是自己封装好还是使用分页插件好呢? 如果是使用分页插件好的话,那么使用那些分页插件比较好?希望各位有经验的大佬不吝赐教! 非常感谢!
  • 分页查询

    万次阅读 多人点赞 2014-02-22 19:55:32
    分页查询,就是将将过多的结果在有限的界面上分好多页来显示,这个是很多网站常用的功能,也是最基本的功能,今天简单总结一下。  分页以前听人们说都是一项技术,但是我觉的不尽然。我认为分页是将数据库的数据...
  • 前端分页和后端分页

    万次阅读 2017-07-19 20:04:28
    前端分页和后端分页区别
  • Oracle分页

    万次阅读 多人点赞 2019-06-11 08:32:36
    常用关系数据库分页SQL都是不相同的,不过大同小异 下面是Oracle分页简单事例图片以及代码: 1、普通查询: select * from table_Namet order by active_count desc; 2、查询第一条记录: select * from ...
  • 物理分页和内存分页和逻辑分页

    千次阅读 2018-06-10 22:58:02
    物理分页与(逻辑分页就是内存分页) 一 概述1.物理分页物理分页依赖的是某一物理实体,这个物理实体就是数据库,比如MySQL数据库提供了limit关键字,程序员只需要编写带有limit关键字的SQL语句,数据库返回的就是...
  • 分页查询:前端分页和后端分页

    千次阅读 2018-12-17 17:06:28
    因为一次查出所有的数据太耗时,网络传输量也大,所以分页。 后端分页: 查询出指定条数的数据,在SQL中使用limit size, size * (num - 1) 起始条数 ,终止条数 前端分页: 查询出所有条数,然后利用list的...
  • mysql的按条件分页查询,如果没有order by,那么是按照什么顺序分页的呢? 比如select * from address where adcode='440300' limit 20,100 每次查询会乱序吗?
  • MFC分页控件/分页读取/分页写文件

    热门讨论 2011-03-05 14:08:41
    MFC分页控件/分页读取/分页写文件 MFC分页控件/分页读取/分页写文件 功能只有单一的分页,没有添加 WORD 形式的编辑功能.下载谨慎
  • 【mySQL】mysql数据库分页查询讨论专题

    万次阅读 多人点赞 2019-05-05 14:36:37
    MySQL:limit分页公式、总页数公式 1) limit分页公式 (1)limit分页公式:curPage是当前第几页;pageSize是一页多少条记录 limit (curPage-1)*pageSize,pageSize (2)用的地方:sql语句中 select * from student...
  • 我用的datatables 插件,开启了分页,但是分页的下一页是被禁用的 ,上一页和页码单击都正常,
  • Angularjs实现分页分页算法

    万次阅读 热门讨论 2016-05-10 16:16:13
    最简单的实现Angularjs分页分页算法分享
  • ueditor分页

    热门讨论 2015-05-19 15:50:19
    是一个ueditor的内容进行分页的小例子,供需要者使用参考
  • 分页和假分页

    千次阅读 2017-12-10 20:53:33
    分页有真分页和假分页。  假分页  从数据库中取出所有的数据,然后分页在界面上显示。访问一次数据库,但由于选择的数据量比较大,所以第一次花费时间比较长,但之后每一页的显示都是直接、快速的,避免对数据库...
  • web应用分页

    千次阅读 2019-07-04 21:15:20
    文章目录1. 场景描述2. 解决方案2.1 逻辑分页2.2 物理分页2.2.1 mysql 分页2.2.2 postgresql分页。...(1)分页从概念上可分为逻辑分页和物理分页,逻辑分页主要是通过应用程序(前端或者后端)来分页,是从数据库...
  • Mybatis中物理分页与逻辑分页

    千次阅读 2019-08-17 17:34:52
    什么是物理分页和逻辑分页 1.物理分页 物理分页依赖的是某一物理实体,这个物理实体就是数据库,比如MySQL数据库提供了limit关键字,程序员只需要编写带有limit关键字的SQL语句,数据库返回的就是分页结果。 2....
  • Pagination分页控件怎么进行后台分页 点击下一页事件里面 该怎么写 写什么 在哪里调用 求分页实例 是Server Side Pagination 的实例啊 暂时没币悬赏
  • ASP.NET Repeater分页,查询分页

    热门讨论 2011-07-23 11:22:36
    ASP.NET Repeater分页,查询分页 ASP.NET Repeater分页,查询分页 ASP.NET Repeater分页,查询分页 ASP.NET Repeater分页,查询分页 ASP.NET Repeater分页,查询分页
  • 什么是分页技术 分页,是一种将所有数据分段展示给用户的技术.用户每次看到的不是全部数据,而是其中的一部分,如果在其中没有找到自习自己想要的内容,用户可以通过制定页码或是翻页的方式转换可见内容,直到找到自己...
  • jeeSite分页

    千次阅读 2017-07-26 20:20:33
    jeesite分页

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 606,351
精华内容 242,540
关键字:

分页是什么