使用Hibernate3实现分页功能

来源:互联网 发布:sqlserver 定义表变量 编辑:程序博客网 时间:2024/06/05 21:18

http://blog.csdn.net/zhjb1025/archive/2006/04/19/668631.aspx

  整理的代码如下:

  Page.Java接口

Java代码 
  1. packageorg.domain.scrm4u.helper;  
  2. importjava.util.List;  
  3. publicinterfacePage{  
  4.   booleanisFirstPage();  
  5.   booleanisLastPage();  
  6.   booleanhasNextPage();  
  7.   booleanhASPreviousPage();  
  8.   intgetLastPageNumber();  
  9.   List<?>getThisPageElements();  
  10.   intgetTotalNumberOfElements();  
  11.   intgetThisPageFirstElementNumber();  
  12.   intgetThisPageLastElementNumber();  
  13.   intgetNextPageNumber();  
  14.   intgetPreviousPageNumber();  
  15.   intgetPageSize();  
  16.   intgetPageNumber();  
  17. }  
 

  ListPage.java实现:

Java代码 
  1. packageorg.domain.scrm4u.helper.impl;  
  2. importjava.util.List;  
  3. importorg.domain.scrm4u.helper.Page;  
  4. publicclassListPageimplementsPage{  
  5.   privateList<?>elements;  
  6.   privateintpageSize;  
  7.   privateintpageNumber;  
  8.   publicListPage(List<?>elements,intpageNumber,intpageSize){  
  9.     this.elements=elements;  
  10.     this.pageSize=pageSize;  
  11.     this.pageNumber=pageNumber;  
  12.     if(Integer.MAX_VALUE==this.pageNumber)this.pageNumber=(getTotalNumberOfElements()/this.pageSize);  
  13.   }  
  14.   publicbooleanisFirstPage(){  
  15.     returngetPageNumber()==0;  
  16.   }  
  17.   publicbooleanisLastPage(){  
  18.     returngetPageNumber()>=getLastPageNumber();  
  19.   }  
  20.   publicbooleanhasNextPage(){  
  21.     return((getPageNumber()+1)*getPageSize())<(getTotalNumberOfElements()+1);  
  22.   }  
  23.   publicbooleanhasPreviousPage(){  
  24.     returngetPageNumber()>0;  
  25.   }  
  26.   publicintgetLastPageNumber(){  
  27.     doubletotalResults=newInteger(getTotalNumberOfElements()).doubleValue();  
  28.     returnnewDouble(Math.floor(totalResults/getPageSize())).intValue();  
  29.   }  
  30.   publicList<?>getThisPageElements(){  
  31.     finalintstart=getPageNumber()*getPageSize();  
  32.     returnelements.subList(  
  33.           Math.min(start,getTotalNumberOfElements()+1),   
  34.           Math.min(start+getPageSize(),getTotalNumberOfElements()+1)  
  35.        );  
  36.   }  
  37.   publicintgetTotalNumberOfElements(){  
  38.     returnelements.size()-1;  
  39.   }  
  40.   publicintgetThisPageFirstElementNumber(){  
  41.     returngetPageNumber()*getPageSize()+1;  
  42.   }  
  43.   publicintgetThisPageLastElementNumber(){  
  44.     intfullPage=getThisPageFirstElementNumber()+getPageSize()-1;  
  45.     returngetTotalNumberOfElements()<fullPage?getTotalNumberOfElements():fullPage;  
  46.   }  
  47.   publicintgetNextPageNumber(){  
  48.     returngetPageNumber()+1;  
  49.   }  
  50.   publicintgetPreviousPageNumber(){  
  51.     returngetPageNumber()-1;  
  52.   }  
  53.   publicintgetPageSize(){  
  54.     returnpageSize;  
  55.   }  
  56.   publicintgetPageNumber(){  
  57.     returnpageNumber;  
  58.   }  
  59. }  
 

 

 

 HibernatePage.Java实现:

Java代码 
  1. packageorg.domain.scrm4u.helper.impl;  
  2. importjava.util.List;  
  3. importorg.domain.scrm4u.helper.Page;  
  4. importorg.hibernate.HibernateException;  
  5. importorg.hibernate.Query;  
  6. importorg.hibernate.ScrollMode;  
  7. importorg.hibernate.ScrollableResults;  
  8. publicclassHibernatePageimplementsPage{  
  9.   protectedList<?>elements;  
  10.   protectedintpageSize;  
  11.   protectedintpageNumber;  
  12.   protectedinttotalElements=0;  
  13.   privateScrollableResultsscrollableResults;  
  14.   privateHibernatePage(intpageNumber,intpageSize){  
  15.     this.pageNumber=pageNumber;  
  16.     this.pageSize=pageSize;  
  17.   }  
  18.   publicbooleanisFirstPage(){  
  19.     returngetPageNumber()==0;  
  20.   }  
  21.   publicbooleanisLastPage(){  
  22.     returngetPageNumber()>=getLastPageNumber();  
  23.   }  
  24.   publicbooleanhasNextPage(){  
  25.     returnelements.size()>getPageSize();  
  26.   }  
  27.   publicbooleanhASPreviousPage(){  
  28.     returngetPageNumber()>0;  
  29.   }  
  30.   publicintgetLastPageNumber(){  
  31.     doubletotalResults=newInteger(getTotalNumberOfElements()).doubleValue();  
  32.     returnnewDouble(Math.floor(totalResults/getPageSize())).intValue();  
  33.   }  
  34.   publicList<?>getThisPageElements(){  
  35.     returnhasNextPage()?elements.subList(0,getPageSize()):elements;  
  36.   }  
  37.   publicintgetTotalNumberOfElements(){  
  38.     returntotalElements;  
  39.   }  
  40.   publicintgetThisPageFirstElementNumber(){  
  41.     returngetPageNumber()*getPageSize()+1;  
  42.   }  
  43.   publicintgetThisPageLastElementNumber(){  
  44.     intfullPage=getThisPageFirstElementNumber()+getPageSize()-1;  
  45.     returngetTotalNumberOfElements()<fullPage?getTotalNumberOfElements():fullPage;  
  46.   }  
  47.   publicintgetNextPageNumber(){  
  48.     returngetPageNumber()+1;  
  49.   }  
  50.   publicintgetPreviousPageNumber(){  
  51.     returngetPageNumber()-1;  
  52.   }  
  53.   publicintgetPageSize(){  
  54.     returnpageSize;  
  55.   }  
  56.   publicintgetPageNumber(){  
  57.     returnpageNumber;  
  58.   }  
  59.   publicstaticHibernatePagegetScrollPage(Queryquery,intpageNumber,intpageSize,ScrollModescrollMode){  
  60.     HibernatePagesp=newHibernatePage(pageNumber,pageSize);  
  61.     try{  
  62.       sp.scrollableResults=query.scroll(scrollMode);  
  63.       if(scrollMode==ScrollMode.SCROLL_SENSITIVE){  
  64.         sp.scrollableResults.last();  
  65.         sp.totalElements=sp.scrollableResults.getRowNumber();  
  66.       }else{  
  67.         sp.totalElements=sp.calculateTotalElementsByList(query);  
  68.       }  
  69.       sp.determineElements(query);  
  70.     }catch(HibernateExceptione){  
  71.       e.printStackTrace();  
  72.     }  
  73.     returnsp;  
  74.   }  
  75.   privatevoiddetermineElements(Queryquery)throwsHibernateException{  
  76.     if(Integer.MAX_VALUE==this.pageNumber)this.pageNumber=(getTotalNumberOfElements()/this.pageSize);  
  77.     elements=query.setFirstResult(this.pageNumber*this.pageSize).setMaxResults(this.pageSize+1).list();  
  78.   }  
  79.   privateintcalculateTotalElementsByList(Queryquery)throwsHibernateException{  
  80.     returnquery.list().size();  
  81.   }  
  82. }  
 

简单分析一下:

  ListPage实现需要把查询的结果集全部取出来。

  我们着重还是分析一下HibernatePage的实现。

  测试代码如下:

Java代码 
  1. importJava.io.IOException;  
  2. importjava.sql.SQLException;  
  3. importjava.util.List;  
  4. importorg.hibernate.Query;  
  5. importorg.hibernate.ScrollMode;  
  6. importorg.hibernate.Session;  
  7. importorg.hibernate.SessionFactory;  
  8. importorg.hibernate.cfg.AnnotationConfiguration;  
  9. importorg.hibernate.cfg.Configuration;  
  10. importorg.domain.scrm4u.helper.Page;  
  11. importorg.domain.scrm4u.helper.impl.HibernatePage;  
  12. importorg.domain.scrm4u.entity.TPsn;  
  13. publicclassBusinessService{  
  14.   publicstaticvoidmain(String[]args)throwsIOException,SQLException{  
  15.     Configurationconfig= newAnnotationConfiguration().configure();  
  16.     SessionFactorysessionFactory=config.buildSessionFactory();     
  17.     Sessionsession=sessionFactory.openSession();  
  18.     StringHql="fromTPsn";  
  19.     Queryquery=session.createQuery(Hql);  
  20.     Pagepage=HibernatePage.getScrollPage(query,0,10,ScrollMode.SCROLL_SENSITIVE);  
  21.     List<?>list=page.getThisPageElements();  
  22.     for(inti=0;i<list.size();i++){  
  23.       TPsnpsn=(TPsn)list.get(i);  
  24.       System.out.println(psn.getPsnNo()+"t"+psn.getPsnPnm()+"t"+psn.getPsnBrthDt());  
  25.     }   
  26.     session.close();  
  27.     sessionFactory.close();  
  28.   }  
  29. }  
 

 

  测试中发现:

  使用ScrollMode.SCROLL_SENSITIVE比ScrollMode.FORWARD_ONLY在性能上要快很多。具体选择要看使用的JDBC驱动是否支撑了,支持scroll的话就可以使用ScrollableResults类来处理结果集了。

  当然,我们还可以配合缓存技术让翻页更有效率。

  关于缓存请参看http://blog.csdn.net/kunshan_shenbin/archive/2008/09/03/2874992.ASPx。

原创粉丝点击