`
wuhua
  • 浏览: 2112306 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

自己对分页的理解

阅读更多
        最近要启动一个比较大的项目了。回忆以前做的那些web项目,快乐,痛苦,成功,失败都是经历过了。
        好久没动那些web了,都块忘记这么设计了,今天在java重新找出一些关于hibernate分页的帖子,受益良多。
        robbin大哥的说的最详细的 www.iteye.com/topic/14657
         www.iteye.com/topic/17857
        哈哈,有时间多复习是不错的。
         
        分页的主要思想是:
1:构造一个Page对象,把相关的属性设置好,比如记录数,每页包含条数,是否有下一页,是否有上一页,当前页,总页数等,然后通过Page工厂生成一个Page对象(构造的前题是:你必须知道记录总数,一般从数据中获取),最后通过对于数据库的分页语句得到结果,比如hibernate分页的写法是:
java 代码
 
  1. String querySentence = "FROM user in class com.adt.po.User";    
  2.        Query query = getSession().createQuery(querySentence);    
  3.       query.setFirstResult(page.getBeginIndex())    
  4.             .setMaxResults(page.getEveryPage());    
  5.         return query.list();    
这样做的充分利用数据各自的特性,提供性能。
2:直接从数据load出所有数据,然后再对结果集进行处理。
    对所有数据的操作都是用一条语句就ok了,方便处理,缺点是,数据量大的时候性能会有影响。而且每次都去load这么多数据,不合理。看看代码,很简单
java 代码
 
  1. /** 
  2.  * @author wuhua 
  3.  *  
  4.  * 分页代码,实现策略是,用List类来保存所有对象,并以page为分页标记 
  5.  */  
  6.   
  7. import java.util.List;  
  8.   
  9. public class PageModel {  
  10.     private int page = 1// 当前页  
  11.   
  12.     public int totalPages = 0// 总页数  
  13.   
  14.     private int pageRecorders;// 每页5条数据  
  15.   
  16.     private int totalRows = 0// 总数据数  
  17.   
  18.     private int pageStartRow = 0;// 每页的起始数  
  19.   
  20.     private int pageEndRow = 0// 每页显示数据的终止数  
  21.   
  22.     private boolean hasNextPage = false// 是否有下一页  
  23.   
  24.     private boolean hasPreviousPage = false// 是否有前一页  
  25.   
  26.     private List list;  
  27.   
  28.     // private Iterator it;  
  29.   
  30.     public PageModel(List list, int pageRecorders) {  
  31.         init(list, pageRecorders);// 通过对象集,记录总数划分  
  32.     }  
  33.   
  34.     /** 
  35.      *  
  36.      */  
  37.     public PageModel() {  
  38.     }  
  39.   
  40.     /** 
  41.      * @param list 
  42.      * @param pageRecorders 
  43.      */  
  44.     public void init(List list, int pageRecorders) {  
  45.         this.pageRecorders = pageRecorders;  
  46.         this.list = list;  
  47.         totalRows = list.size();  
  48.         // it = list.iterator();  
  49.         hasPreviousPage = false;  
  50.         if ((totalRows % pageRecorders) == 0) {  
  51.             totalPages = totalRows / pageRecorders;  
  52.         } else {  
  53.             totalPages = totalRows / pageRecorders + 1;  
  54.         }  
  55.   
  56.         if (page >= totalPages) {  
  57.             hasNextPage = false;  
  58.         } else {  
  59.             hasNextPage = true;  
  60.         }  
  61.   
  62.         if (totalRows < pageRecorders) {  
  63.             this.pageStartRow = 0;  
  64.             this.pageEndRow = totalRows;  
  65.         } else {  
  66.             this.pageStartRow = 0;  
  67.             this.pageEndRow = pageRecorders;  
  68.         }  
  69.     }  
  70.   
  71.     /** 
  72.      * @return 返回 page。 
  73.      */  
  74.     public int getPage() {  
  75.         return page;  
  76.     }  
  77.   
  78.     /** 
  79.      * @param page 
  80.      *            要设置的 page。 
  81.      */  
  82.     public void setPage(int page) {  
  83.         this.page = page;  
  84.     }  
  85.   
  86.     /** 
  87.      * @return Returns the pageRecorders. 
  88.      */  
  89.     public int getPageRecorders() {  
  90.         return pageRecorders;  
  91.     }  
  92.   
  93.     /** 
  94.      * @param pageRecorders 
  95.      *            The pageRecorders to set. 
  96.      */  
  97.     public void setPageRecorders(int pageRecorders) {  
  98.         this.pageRecorders = pageRecorders;  
  99.     }  
  100.   
  101.     /** 
  102.      * @return Returns the pageEndRow. 
  103.      */  
  104.     public int getPageEndRow() {  
  105.         return pageEndRow;  
  106.     }  
  107.   
  108.     /** 
  109.      * @return Returns the pageStartRow. 
  110.      */  
  111.     public int getPageStartRow() {  
  112.         return pageStartRow;  
  113.     }  
  114.   
  115.     /** 
  116.      * @return Returns the totalPages. 
  117.      */  
  118.     public String getTotalPages() {  
  119.         return this.toString(totalPages);  
  120.     }  
  121.   
  122.     /** 
  123.      * @return Returns the totalRows. 
  124.      */  
  125.     public String getTotalRows() {  
  126.         return this.toString(totalRows);  
  127.     }  
  128.   
  129.     /** 
  130.      * @return Returns the hasNextPage. 
  131.      */  
  132.     public boolean isHasNextPage() {  
  133.         return hasNextPage;  
  134.     }  
  135.   
  136.     /** 
  137.      * @param hasNextPage 
  138.      *            The hasNextPage to set. 
  139.      */  
  140.     public void setHasNextPage(boolean hasNextPage) {  
  141.         this.hasNextPage = hasNextPage;  
  142.     }  
  143.   
  144.     /** 
  145.      * @return Returns the hasPreviousPage. 
  146.      */  
  147.     public boolean isHasPreviousPage() {  
  148.         return hasPreviousPage;  
  149.     }  
  150.   
  151.     // 判断要不要分页  
  152.     public boolean isNext() {  
  153.         return list.size() > 8;  
  154.     }  
  155.   
  156.     /** 
  157.      * @param hasPreviousPage 
  158.      *            The hasPreviousPage to set. 
  159.      */  
  160.     public void setHasPreviousPage(boolean hasPreviousPage) {  
  161.         this.hasPreviousPage = hasPreviousPage;  
  162.     }  
  163.   
  164.     public String toString(int temp) {  
  165.         String str = Integer.toString(temp);  
  166.         return str;  
  167.     }  
  168.   
  169.     public void description() {  
  170.   
  171.         String description = "共有数据数:" + this.getTotalRows() +  
  172.   
  173.         "共有页数: " + this.getTotalPages() +  
  174.   
  175.         "当前页数为:" + this.getPage() +  
  176.   
  177.         " 是否有前一页: " + this.isHasPreviousPage() +  
  178.   
  179.         " 是否有下一页:" + this.isHasNextPage() +  
  180.   
  181.         " 开始行数:" + this.getPageStartRow() +  
  182.   
  183.         " 终止行数:" + this.getPageEndRow();  
  184.   
  185.         System.out.println(description);  
  186.     }  
  187.   
  188.     public List getNextPage() {  
  189.         page = page + 1;  
  190.   
  191.         disposePage();  
  192.   
  193.         System.out.println("用户凋用的是第" + page + "页");  
  194.         this.description();  
  195.         return getObjects(page);  
  196.     }  
  197.   
  198.     /** 
  199.      * 处理分页 
  200.      */  
  201.     private void disposePage() {  
  202.   
  203.         if (page == 0) {  
  204.             page = 1;  
  205.         }  
  206.   
  207.         if ((page - 1) > 0) {  
  208.             hasPreviousPage = true;  
  209.         } else {  
  210.             hasPreviousPage = false;  
  211.         }  
  212.   
  213.         if (page >= totalPages) {  
  214.             hasNextPage = false;  
  215.         } else {  
  216.             hasNextPage = true;  
  217.         }  
  218.     }  
  219.   
  220.     public List getPreviousPage() {  
  221.   
  222.         page = page - 1;  
  223.   
  224.         if ((page - 1) > 0) {  
  225.             hasPreviousPage = true;  
  226.         } else {  
  227.             hasPreviousPage = false;  
  228.         }  
  229.         if (page >= totalPages) {  
  230.             hasNextPage = false;  
  231.         } else {  
  232.             hasNextPage = true;  
  233.         }  
  234.         this.description();  
  235.         return getObjects(page);  
  236.     }  
  237.   
  238.     /** 
  239.      * 获取第几页的内容 
  240.      *  
  241.      * @param page 
  242.      * @return 
  243.      */  
  244.     public List getObjects(int page) {  
  245.         if (page == 0)  
  246.             this.setPage(1);  
  247.         else  
  248.             this.setPage(page);  
  249.         this.disposePage();  
  250.         if (page * pageRecorders < totalRows) {// 判断是否为最后一页  
  251.             pageEndRow = page * pageRecorders;  
  252.             pageStartRow = pageEndRow - pageRecorders;  
  253.         } else {  
  254.             pageEndRow = totalRows;  
  255.             pageStartRow = pageRecorders * (totalPages - 1);  
  256.         }  
  257.   
  258.         List objects = null;  
  259.         if (!list.isEmpty()) {  
  260.             objects = list.subList(pageStartRow, pageEndRow);  
  261.         }  
  262.         this.description();  
  263.         return objects;  
  264.     }  
  265.   
  266.     public List getFistPage() {  
  267.         if (this.isNext()) {  
  268.             return list.subList(0, pageRecorders);  
  269.         } else {  
  270.             return list;  
  271.         }  
  272.     }  
  273.   
  274.     /** 
  275.      * @return 返回 list。 
  276.      */  
  277.     public List getList() {  
  278.         return list;  
  279.     }  
  280.   
  281.     /** 
  282.      * @param list 
  283.      *            要设置的 list。 
  284.      */  
  285.     public void setList(List list) {  
  286.         this.list = list;  
  287.     }  
  288.   
  289.     /** 
  290.      * @param totalRows 
  291.      *            要设置的 totalRows。 
  292.      */  
  293.     public void setTotalRows(int totalRows) {  
  294.         this.totalRows = totalRows;  
  295.     }  
  296. }  

3:采用缓存的机制,用户在第一次查询的时候把查询结果存入缓存中,这样用户下载下一页的时候,就不用再去从数据库中查询,也可以通过第一中方法,先查询,然后在存入缓存,可以这样理解,智能的记录用户的操作,如果用户有重复操作就可以把上次的操作结果展示给用户



     
分享到:
评论
1 楼 karna 2007-01-18  
<p>第一种吧,真的,第一种是最好的</p>

相关推荐

    超强php分页打包 通用分页 万能分页 ajax分页 google分页

    通过学习和研究这些示例,你可以更好地理解和应用这些分页技术到自己的项目中。 总的来说,这个压缩包为你提供了一个全面的PHP分页解决方案集合,涵盖了从基础到高级,从静态到动态的各种场景,是提升项目质量的...

    对集合进行分页

    ### 对集合进行分页 在软件开发中,尤其是在处理大量数据时,对数据进行分页是一种常见的需求。分页不仅可以提高用户体验(通过减少加载时间),还...希望本文提供的示例代码能够帮助开发者更好地理解和实现分页功能。

    分页效果自己编写的

    在网页开发中,分页效果是一种常见的用户界面设计,它帮助用户在大量数据或内容中进行导航,提高用户体验。本文将详细介绍如何自行编写一个...通过理解和实践,你可以根据项目需求定制出更加高效、美观的分页解决方案。

    自己写的jQuery分页根据json分页

    在IT行业中,jQuery分页是一种常见的网页数据展示技术,它能有效地管理大量数据,提高用户体验。...通过对这些文件的分析和学习,可以深入理解jQuery分页的实现过程,对于前端开发者来说,这是一种实用且常见的技能。

    自己整理的java分页大全

    通过结合` Slice`接口,Spring Data JPA 提供了对分页查询的强大支持,只需要在Repository接口中定义分页查询方法即可。 接下来是Struts2框架的分页处理。Struts2提供了`PagerTag`标签库,可以方便地在JSP页面上...

    自己写的分页组件

    标题中的“自己写的分页组件”表明我们即将讨论的是一个自定义实现的用于数据分页的软件组件。在Web开发中,分页是常见的功能,它允许用户按页浏览大量数据,提高用户体验并减轻服务器负载。这个组件可能是用Java...

    c# 自己写的分页代码

    在C#编程中,分页是一种常见的数据展示技术,尤其在处理大量数据时,它可以提高应用程序的性能并提供良好的用户体验。...通过对这个项目的分析和学习,开发者可以更好地理解和掌握C#环境下分页的实现方法。

    一个对html表格分页的类

    通过查看和分析这个文件,我们可以学习如何在自己的项目中应用这个分页解决方案。 至于`images` 文件夹,通常会包含一些图标或图片资源,例如分页按钮的前后箭头、页码背景等,这些元素用于提升用户界面的美观度和...

    .net分页 asp.net分页

    这种方法效率更高,适用于大数据量的场景,但需要对SQL查询有深入理解,以确保正确实现分页。 在.NET中实现分页,通常会用到以下组件和技术: - **GridView**:ASP.NET中的一个强大控件,内建了分页功能。只需设置...

    分页代码 重分页代码

    在IT行业中,分页是一种常见的数据处理技术,特别是在网页应用或者大数据量的展示场景下。...学习和理解这个示例可以帮助我们更好地理解和运用SSH框架下的分页技术,提高代码的复用性和项目的开发效率。

    实现对List的分页

    本示例主要讲解如何利用List接口的获取子List方法来实现对List的分页功能。这个过程涉及到Java集合框架的理解、数据范围的计算以及如何构建分页模型。 首先,我们需要理解Java中的List接口。List是Java集合框架的一...

    hbase查询分页分页

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

    jsf分页 jsf分页 jsf分页

    首先,我们需要理解JSF的核心组件和分页相关的API。JSF是一个MVC(模型-视图-控制器)框架,其中UIComponent和ManagedBean是关键组成部分。分页通常涉及到两个主要部分:前端显示和后端处理。 1. **前端显示**: ...

    Ajax分页 Asp.net 分页

    压缩包中的项目代码和Demo提供了实际操作的例子,你可以下载并运行,以加深对Ajax分页在Asp.net中实现的理解。通过查看源代码,你可以学习到如何处理Ajax请求,如何构建分页逻辑,以及如何在前端展示分页结果。 ...

    js分页示例,前台分页,客户端分页,分页机制,js分页

    首先,我们要理解什么是分页。在Web应用中,分页是将大量数据分成多个小部分(每部分通常称为一页)进行展示,用户可以通过页码或导航按钮在这些页面间切换。这有助于提高用户体验,使他们能够快速找到和浏览所需的...

    QTableWidget,QTableView分页的分页栏

    而`QTableView`是基于`QAbstractItemView`的,它与`QModel`配合使用,性能更高,但需要自己实现更多的功能,如数据编辑等。 实现分页栏的关键在于设计一个数据模型(`QAbstractTableModel` 或 `QSqlQueryModel`),...

    自己写的万能分页

    确保每个团队成员都能理解并正确使用你的分页方法,这可以减少沟通成本,提高开发效率。如果可能的话,还可以考虑使用注释或Javadoc来进一步解释方法的用途和参数。 总的来说,自定义分页方法是提高SSH2框架中代码...

    超漂亮分页控件 自定义分页控件 灵活的分页控件

    阅读并理解这些存储过程的逻辑对于正确集成分页控件至关重要。 "AspNetDataPage及常用类使用说明"文档则可能提供了关于如何在ASP.NET环境中使用这个分页控件的详细指南。ASP.NET是一个强大的Web开发框架,其中...

    jQuery 分页 滑动分页

    在网页开发中,分页是一种常见的用户界面设计,用于处理大量数据或内容的展示,以提高用户体验和页面...通过学习和理解这些技术,开发者可以轻松地在自己的项目中实现高效的滑动分页功能,提升网页的交互性和实用性。

    asp论坛分页数字分页代码

    通过学习和理解这个代码,开发者可以快速地在自己的项目中应用分页功能,提高网页的性能和用户体验。如果你对ASP编程或分页技术不熟悉,建议仔细阅读提供的说明文档,并尝试运行和调试代码以加深理解。

Global site tag (gtag.js) - Google Analytics