`
jianfulove
  • 浏览: 120019 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
社区版块
存档分类
最新评论

分页查询设计

    博客分类:
  • SQL
阅读更多

 最近忙着开发拎图网图片社区 喜欢的朋友常来逛逛。谢谢.    

        分页查询就是根据需要每次只返回所需要的数据,而不用每次都从数据库中全部把数据提取出来,这样可以降低程序与数据库之间的数据传送量,并且还可以提高程序的性能。 一般来说我们在数据量大的情况下总是会分页显示(谁也不会一下子将几万条数据全部一次性显示给用户),这样决定我们返回的查询结果集的参数有两个:当前显示的页数pageNo和每页要显示的记录条数pageSize。
一般作为查询数据库返回的结果有两个:正要查询当前页的所有记录集(List)和某条件下数据库中的记录总数(totalRecords);
       为了体现面向对象编程,我们会把分页的数据封装在一个单独的类里

import java.util.List;

public class PageModel {
   
    private List list;
   
    private int totalRecords;
   
    private int pageSize;
   
    private int pageNo;
   
    /**
     * 总页数
     * @return
     */
    public int getTotalPages() {
        return (this.totalRecords + this.pageSize - 1)/this.pageSize;
    }
   
    /**
     * 取得首页
     * @return
     */
    public int getTopPageNo() {
        return 1;
    }
   
    /**
     * 上一页
     * @return
     */
    public int getPreviousPageNo() {
        if (this.pageNo <= 1){
            return 1;
        }
        return this.pageNo - 1;
    }
   
    /**
     * 下一页
     * @return
     */
    public int getNextPageNo() {
        if (this.pageNo >= this.getBottomPageNo()) {
            return this.getBottomPageNo();
        }
        return this.pageNo + 1;
    }
   
    /**
     * 尾页
     * @return
     */
    public int getBottomPageNo() {
        return this.getTotalPages();
    }
   
    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }

    public int getTotalRecords() {
        return totalRecords;
    }

    public void setTotalRecords(int totalRecords) {
        this.totalRecords = totalRecords;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getPageNo() {
        return pageNo;
    }

    public void setPageNo(int pageNo) {
        this.pageNo = pageNo;
    }
}


 

Oracle 的sql

第一种写法
select * from ( select a.*,rownum rn
from (select * from user_login_info t) a where rownum <=40 
) where rn >=21;
第二种写法
select * from (
select a.*,rownum rn from (select * from user_login_info t) a

) where rn between 21 and 40;
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

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

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


 SQL Server 2000/2005
SELECT TOP 页大小 * FROM table1 WHERE id NOT IN ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id ) ORDER BY id
方法2:
适用于 SQL Server 2000/2005
SELECT TOP 页大小 * FROM table1 WHERE id > ( SELECT ISNULL(MAX(id),0) FROM ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id ) A ) ORDER BY id
方法3:
适用于 SQL Server 2005
SELECT TOP 页大小 * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1 ) A WHERE RowNumber > 页大小*(页数-1)
说明,页大小:每页的行数;页数:第几页。使用时,请把“页大小”以及“页大小*(页数-1)”替换成数码。

MYSQL
SELECT * FROM TT LIMIT 1,20
SELECT * FROM TT LIMIT 21,30
/*
如果你是几千上万数据,就直接使用mysql自带的函数 limit的普通用法就ok了,如果是100万以上的数据,可能就要讲方法了,下面我们来做个百万级数据的分页查询语句.
mysql> select * from news where id>=(select id from news limit 490000,1) limit 10;    //0.18 sec  //很 明显,这 种方式胜出 .
mysql> select * from news limit 490000,10  //0.22 sec;
*/
以下的文章主要介绍的是MySQL分页的实际操作方案,其实关于实现MySQL分页的最简单的方法就是利用利用mysql数据库的LIMIT函数,LIMIT [offset,size] rows可以从MySQL数据库表中第M条记录开始检索N条记录的语句为:
 
 SELECT * FROM 表名称 LIMIT M,N
例如从表Sys_option(主键为sys_id)中从第10条记录开始检索20条记录,语句如下:
select * from sys_option limit 10,20 
select * from table [查询条件] order by id limit ?,? 

15
13
分享到:
评论
12 楼 jianfulove 2013-05-22  
liuyuhua0066 写道
jianfulove 写道
liuyuhua0066 写道
jianfulove 写道
liuyuhua0066 写道
PageModel这个类根本就不纯粹 为什么要糅合List进去 用count不更合适?


取什么引用名并不重要啊,只要你喜欢的名字你认为好区分就叫什么呗。这没有什么统一的标准,这只是我的一种喜好的设计而已。呵呵。


我的意思是不应该用List集合 用集合对应的记录数不更合适一点?


啊?我还是不明白你的问题呢,好比如我请求找第5页的数据,所以我就去数据库里加载pageSize大小的数据在list里,但是每次都要select count(*) from table;求出数据库表里总数据的数量totalRecords啊;因为数据库里的数据的总数会不停地在变的,也许你在查找,别人就提交了数据。 


总记录数当然要select count(1) 一下

其实我要表达的意思是把list从这个PageBean移出去 因为这是一个纯粹的页实体

将list加进去不合适 更何况你这个List连泛型都没有加 可以存Object



哦哦,我明白你说的了,至于这样就看个人喜好吧,也不能说哪个对哪个错。但我这样设计pageModel里包含一个list是为了好管理,只要我得到pageModel对象,我就可以得到我想要查询那个页数的数据,在些数据查询时数据库中该数据总数,就相当于绑定一样,在某一时刻它们是一一对应的,至于我为什么不用泛型,是为了一个项目中对于不同数据不用另外给它配一个PageModel,也就是为了通用性,不然我要对Channel类做一个分页包装类,又要对Article类另做一个分页包装类,这样多麻烦。再说泛型这东东也就为了方便于编码,在运行期是没有丁点用的。至于你说把list从这个PageBean移出去,那如果是我的话会觉得没什么这必要吧,如果还分开,我干脆就不要设计这个PageBean了,
只要Map map =new HashMap();
map.put("list",list);
map.put("list",totalRecords);
然后再返回这个map给前端也就能用这数据了,所以我是出于这样考虑的,呵呵,仁兄,我说出了我的想法了,请不要见怪。
11 楼 liuyuhua0066 2013-05-22  
jianfulove 写道
liuyuhua0066 写道
jianfulove 写道
liuyuhua0066 写道
PageModel这个类根本就不纯粹 为什么要糅合List进去 用count不更合适?


取什么引用名并不重要啊,只要你喜欢的名字你认为好区分就叫什么呗。这没有什么统一的标准,这只是我的一种喜好的设计而已。呵呵。


我的意思是不应该用List集合 用集合对应的记录数不更合适一点?


啊?我还是不明白你的问题呢,好比如我请求找第5页的数据,所以我就去数据库里加载pageSize大小的数据在list里,但是每次都要select count(*) from table;求出数据库表里总数据的数量totalRecords啊;因为数据库里的数据的总数会不停地在变的,也许你在查找,别人就提交了数据。 


总记录数当然要select count(1) 一下

其实我要表达的意思是把list从这个PageBean移出去 因为这是一个纯粹的页实体

将list加进去不合适 更何况你这个List连泛型都没有加 可以存Object
10 楼 Direction_Fang 2013-05-21  
   
9 楼 jianfulove 2013-05-21  
liuyuhua0066 写道
jianfulove 写道
liuyuhua0066 写道
PageModel这个类根本就不纯粹 为什么要糅合List进去 用count不更合适?


取什么引用名并不重要啊,只要你喜欢的名字你认为好区分就叫什么呗。这没有什么统一的标准,这只是我的一种喜好的设计而已。呵呵。


我的意思是不应该用List集合 用集合对应的记录数不更合适一点?


啊?我还是不明白你的问题呢,好比如我请求找第5页的数据,所以我就去数据库里加载pageSize大小的数据在list里,但是每次都要select count(*) from table;求出数据库表里总数据的数量totalRecords啊;因为数据库里的数据的总数会不停地在变的,也许你在查找,别人就提交了数据。 
8 楼 liuyuhua0066 2013-05-21  
jianfulove 写道
liuyuhua0066 写道
PageModel这个类根本就不纯粹 为什么要糅合List进去 用count不更合适?


取什么引用名并不重要啊,只要你喜欢的名字你认为好区分就叫什么呗。这没有什么统一的标准,这只是我的一种喜好的设计而已。呵呵。


我的意思是不应该用List集合 用集合对应的记录数不更合适一点?
7 楼 jianfulove 2013-05-21  
liuyuhua0066 写道
PageModel这个类根本就不纯粹 为什么要糅合List进去 用count不更合适?


取什么引用名并不重要啊,只要你喜欢的名字你认为好区分就叫什么呗。这没有什么统一的标准,这只是我的一种喜好的设计而已。呵呵。
6 楼 liuyuhua0066 2013-05-21  
PageModel这个类根本就不纯粹 为什么要糅合List进去 用count不更合适?
5 楼 aixinnature 2013-05-21  
我曾经也封装过这种数据模型,不过现在spring data jpa 都已经有了,楼主有条件可以参考一下
4 楼 ejunnan 2013-05-21  
我也是这样设计的,不错 
3 楼 wo13145219 2013-05-20  
好,收藏 
2 楼 一夜胖子 2013-05-20  
收了~~~~     
1 楼 kuayue200 2013-05-20  
[b][/b][i][/i][u][/u]
引用
[img][/img][url][/url][flash=200,200][/flash]

相关推荐

    基于Java语言的SQL分页查询设计源码

    该项目是一个基于Java语言的SQL分页查询设计源码,包含28个文件,其中17个为Java源文件,5个为属性文件,2个为XML文件,1个为Git忽略文件,1个为LICENSE文件,1个为Markdown文件,以及1个JAR包文件。该库提供SQL分页...

    web网站数据库分页查询设计与实现

    本文将深入探讨“Web网站数据库分页查询的设计与实现”,主要围绕JSP技术,网络原理,网站WEB开发以及分页查询的实现方法。 首先,我们要理解什么是分页查询。分页查询是将大量的数据结果集分割成多个小的部分(页...

    SQL server 分页查询

    在进行分页查询设计时,性能是一个关键因素。使用`ROW_NUMBER()`函数或`OFFSET`关键字通常比传统子查询方式更为高效,因为它们避免了不必要的排序操作。然而,对于非常大的数据集,即使是这些方法也可能导致性能瓶颈...

    基于SpringBoot与Mybatis的简单易用分页查询设计源码

    该项目是一款基于SpringBoot和Mybatis构建的简单易用分页查询解决方案源码,包含44个文件,涵盖31个Java源文件、3个Markdown文档、2个Kotlin源文件、1个Git忽略文件、1个许可证文件、1个属性文件、1个Gradle构建文件...

    Android开发之数据库的分页查询代码

    总结,Android数据库的分页查询是提升应用性能的关键技术之一,通过合理的设计和优化,可以为用户提供流畅的数据浏览体验。理解SQLite的基础操作,掌握分页查询的原理和实现,以及学会利用Loader和缓存策略,能帮助...

    winform高效率的分页查询

    本话题聚焦于“winform高效率的分页查询”,我们将探讨如何在VS2013环境下,结合SQL Server 2008数据库,实现高效的数据分页加载到`DataGridView`中。 首先,理解分页查询的原理至关重要。在大数据量的情况下,一次...

    基于springmvc实现分页查询

    本篇文章将详细探讨如何基于Spring MVC实现分页查询,这对于任何处理大量数据的Web应用都是至关重要的。 首先,理解分页的基本概念。分页是将大型数据集划分为较小、更易管理的部分,以提高用户体验并减少服务器...

    java多线程分页查询

    多线程分页查询方案设计 针对数据量较大的场景,本文介绍的多线程分页查询方案主要包含以下几个步骤: - **步骤1:计算总记录数**。首先通过执行一个统计查询语句获取总的记录数,为后续的分页提供依据。 - **...

    完美解决MybatisPlus插件分页查询不起作用总是查询全部数据问题

    在开始解决分页查询问题之前,我们先来了解一下MyBatis Plus的基本概念。MyBatis Plus的核心组件之一是PaginationInterceptor,这是一个分页拦截器,它负责在执行SQL时自动添加分页条件。在不启用这个拦截器的情况下...

    JPA分页查询与条件分页查询

    JPA(Java Persistence API)是Java平台上的一个标准,用于管理关系数据库中的数据。Spring Data JPA 是基于 JPA ...在设计和实现分页查询时,应考虑到性能因素,比如避免全表扫描,优化索引,以及合理设置分页大小等。

    JavaWeb实现分页查询案例

    4. 分页查询的实现,包括SQL分页语法和PageBean的设计。 5. 数据库设计,包括表的创建和数据填充。 通过这个案例,开发者可以了解到JavaWeb应用中分页查询的基本实现,进一步可以扩展到更复杂的分页逻辑,例如负载...

    大数据量多线程执行分页查询

    在IT行业中,大数据量处理是...综上所述,"大数据量多线程执行分页查询"是一个综合性的技术主题,涉及到数据库设计、多线程编程和性能优化等多个方面。理解和掌握这些知识点对于开发高效、可扩展的数据库应用至关重要。

    hbase查询分页分页

    在HBase这个分布式列式数据库中,数据存储和...总的来说,HBase的分页查询涉及到对数据分布和查询策略的理解,以及在代码层面上的巧妙设计。掌握好这些技巧,能帮助我们在处理大规模数据时,更高效地获取和展示信息。

    Jsp+Servlet+MyBatis完成分页查询

    在本文中,我们将深入探讨如何使用JSP、Servlet和MyBatis这三种技术来实现一个分页查询的功能。这是一个常见的需求,在许多Web应用程序中,为了提高用户体验,通常需要将大量数据分批次展示,而不是一次性加载所有...

    springmvc+mybatis+分页查询

    在本项目中,我们主要探讨的是如何利用Spring MVC和MyBatis两大流行框架构建一个具有分页查询功能的Web应用。Spring MVC作为控制层,负责处理HTTP请求和响应,而MyBatis则作为数据访问层,用于处理数据库交互。下面...

    易语言MYSQL数据库分页查询

    在IT领域,数据库操作是至关重要的,特别是在处理大量数据时,分页查询是提高系统性能、优化用户体验的有效手段。易语言作为一款中国本土化的编程语言,提供了与MySQL数据库交互的能力,使得开发者能够轻松实现...

    HBase分页查询的rowkey设计技巧

    用户历史订单列表查询rowkey设计技巧 最左前缀原则

    delphi分页查询 利用sql2000存储过程分页

    在数据库管理中,分页查询是一项重要的功能,它允许用户以较小的数据量逐步浏览大量记录,提高...正确地设计和优化分页查询对于处理大数据集的应用至关重要,它有助于提供流畅的用户体验,同时保持数据库的高效运行。

    使用LeanCloud的分页查询

    在我们的分页查询场景中,Bootstrap 提供的分页类(如 `.pagination`)和分页链接样式(如 `.page-item` 和 `.page-link`)可以轻松地构建出符合现代设计标准的分页界面。此外,Bootstrap 还支持自定义事件和插件,...

    Oracle分页查询(很不错的介绍)

    Oracle数据库在处理大数据量时,分页查询是一个非常重要的功能,它可以帮助用户高效地获取数据集的一部分,而不是一次性加载所有结果。本篇文章将详细介绍Oracle中的分页查询,并提供一种常用的分页查询语句格式和一...

Global site tag (gtag.js) - Google Analytics