`
wuhua
  • 浏览: 2095866 次
  • 性别: 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>

相关推荐

    新手学习可前端分页,前端分页,简单的前端分页,html分页,html前端分页

    新手学习可前端分页,里面注释详细,详细到你会觉得啰嗦,很好理解,代码简单,理解透彻之后自己也可以手写分页,对新手,对想学习前端分页的童鞋,有很大帮助,大神勿喷,这个过于简单,谢谢。

    操作系统实验报告-理解线程和请求分页存储管理设计.pdf

    操作系统实验报告-理解线程和请求分页存储管理设计.pdf操作系统实验报告-理解线程和请求分页存储管理设计.pdf操作系统实验报告-理解线程和请求分页存储管理设计.pdf操作系统实验报告-理解线程和请求分页存储管理设计...

    操作系统实验报告-理解线程和请求分页存储管理设计.docx

    操作系统实验报告-理解线程和请求分页存储管理设计.docx操作系统实验报告-理解线程和请求分页存储管理设计.docx操作系统实验报告-理解线程和请求分页存储管理设计.docx操作系统实验报告-理解线程和请求分页存储管理...

    数据分页程序完全解决方案(含普通分页/分段分页/原始分页/since_id分页)

    4) 传统的分页, 分段式分页(每页内分为多段)归根结底是对数据集做一次切割, 映射到mysql的sql语法上, 就是根据输入求得limit子句, 适用场景为数据集变化频率低 5) since_id类分页, 其本质是假定已有数据无变化, 将...

    JavaWeb+JSP+Servlet+JDBC分页查询和查询后分页

    项目主体结构是dao+db+filter+pojo+servlet, 使用技术Servlet转发,代码中有注释帮助学者理解,数据库为MySQL资源...实现的数据库内容分页,查询分页,对初学者难点是根据get请求的中的url地址进行查询后的分页效果。

    操作系统实验报告-理解线程和请求分页存储管理设计 (2).docx

    操作系统实验报告-理解线程和请求分页存储管理设计 (2).docx操作系统实验报告-理解线程和请求分页存储管理设计 (2).docx操作系统实验报告-理解线程和请求分页存储管理设计 (2).docx操作系统实验报告-理解线程和请求...

    基于bootstrap+jQuery的前端分页

    这是一款bootstrap+jQuery的前端分页展示,通过获取后台的数据,来展示不同的分页效果,易理解,可改造

    ASP.NET MVC分页和排序功能实现

    分页和排序,应该是软件开发中,需要必知必会的技能了,对于分页,网上很多教程,当然,别人终究是别人的,只有自己理解,会了,并且吸收之后,再用自己的语言,传授出来,这才是硬道理。好了,废话说多了。现在我们...

    oracle分页,比较简单很好懂

    oracle分页,比较简单很好懂,能够清楚知道oracle分页机制

    PHP 分页原理 (有注释)

    PHP 分页原理 不错得一个分页模块 容易理解

    有关分页索引查询

    如何一个页面需要分页而且还需要索引信息,比如选择条件时间到另一时间,这个可以帮助你理解

    通讯录 分页 局部刷新 mysql

    基于web的通讯录,使用jsp编程 使用到分页技术,局部刷新刷新技术,数据库为 mysql。简单易于理解。

    javaweb_oralce_分页查询

    javaweb 页面分页查询代码加一部笔记 只是做了个简单的...用到了el表达式 jstl oracle jdbc 加一些自己的理解笔记。 粗粗的做了个数据库连接的管理操作。 希望对一些童鞋有用。有很多不足之处,大家补充,互相学习;

    操作系统-基本分页存储管理(内有代码)

    本实验通过程序模拟操作系统的基本分页存储管理方式,进一步理解这一内存分配方式的原理和特点,加深对理论知识的掌握。

    java分页技术实例

    java分页技术,是java编程中常用的一项技术,java分页实例以例子的形式,讲述了一个班级中学生的记录是...代码中含有丰富的注释,可以让读者非常迅速的理解代码的含义,可以仿照这个例子,做任何分页的实现。O(∩_∩)O~

    ORACLE分页存储过程

    在分页存储过程中,主要理解了变量的动态赋值和输入输出参数的使用就非常简单了 下面为调用方法: var c_Preccount number; var c_Ppagecount number; var c_cur refcursor; exec proc_SpPag(1,'SELECT * FROM T_...

    分页管理(操作系统分页存储管理.模拟多进程内存动态分配)

    通过本实验可以加深对常见操作系统的内存管理模块的实现方法的理解。 2. 要求 (1)设计用户程序数组、PCB、页表、内存分配表等数据结构; (2)编程模拟OS内存的动态分配过程。 (1)初始条件 用txt文件存储如下...

    mysql分页 jsp实现 servlet+javabean+jsp三级架构

    自己根据所作的一个项目对mysql分页的总结,菜鸟还有理解不到位的地方还请老鸟指教,因为自己纯手工制作所以分值高点犒劳一下自己。网上也有很多类似的东西,我想应该和我的不同

    php实现数据分页封装

    php实现数据分页封装,适合新手更好理解分页流程。看完之后你会觉得分页实现真tm简单

    分页的详解源代码

    该项目使用了两种方式实现分页功能。第一种使用了Jsp中的JSTL标签与后台的连接,数据库返回数据,Jsp负责绘制表格,充分展现了前端与后台的分工职能,有利于理解MVC的架构模式。第二种使用了Jsp中的JavaScript的函数...

Global site tag (gtag.js) - Google Analytics