Hibernate 3 를 사용 하여 페이지 기능 구현


  http://blog.csdn.net/zhjb1025/archive/2006/04/19/668631.aspx
정 리 된 코드 는 다음 과 같 습 니 다.
페이지Java인터페이스
packageorg.domain.scrm4u.helper;
importjava.util.List;
publicinterfacePage{
  booleanisFirstPage();
  booleanisLastPage();
  booleanhasNextPage();
  booleanhASPreviousPage();
  intgetLastPageNumber();
  List<?>getThisPageElements();
  intgetTotalNumberOfElements();
  intgetThisPageFirstElementNumber();
  intgetThisPageLastElementNumber();
  intgetNextPageNumber();
  intgetPreviousPageNumber();
  intgetPageSize();
  intgetPageNumber();
}
 
ListPage.java 구현:
packageorg.domain.scrm4u.helper.impl;
importjava.util.List;
importorg.domain.scrm4u.helper.Page;
publicclassListPageimplementsPage{
  privateList<?>elements;
  privateintpageSize;
  privateintpageNumber;
  publicListPage(List<?>elements,intpageNumber,intpageSize){
    this.elements=elements;
    this.pageSize=pageSize;
    this.pageNumber=pageNumber;
    if(Integer.MAX_VALUE==this.pageNumber)this.pageNumber=(getTotalNumberOfElements()/this.pageSize);
  }
  publicbooleanisFirstPage(){
    returngetPageNumber()==0;
  }
  publicbooleanisLastPage(){
    returngetPageNumber()>=getLastPageNumber();
  }
  publicbooleanhasNextPage(){
    return((getPageNumber()+1)*getPageSize())<(getTotalNumberOfElements()+1);
  }
  publicbooleanhasPreviousPage(){
    returngetPageNumber()>0;
  }
  publicintgetLastPageNumber(){
    doubletotalResults=newInteger(getTotalNumberOfElements()).doubleValue();
    returnnewDouble(Math.floor(totalResults/getPageSize())).intValue();
  }
  publicList<?>getThisPageElements(){
    finalintstart=getPageNumber()*getPageSize();
    returnelements.subList(
          Math.min(start,getTotalNumberOfElements()+1), 
          Math.min(start+getPageSize(),getTotalNumberOfElements()+1)
       );
  }
  publicintgetTotalNumberOfElements(){
    returnelements.size()-1;
  }
  publicintgetThisPageFirstElementNumber(){
    returngetPageNumber()*getPageSize()+1;
  }
  publicintgetThisPageLastElementNumber(){
    intfullPage=getThisPageFirstElementNumber()+getPageSize()-1;
    returngetTotalNumberOfElements()<fullPage?getTotalNumberOfElements():fullPage;
  }
  publicintgetNextPageNumber(){
    returngetPageNumber()+1;
  }
  publicintgetPreviousPageNumber(){
    returngetPageNumber()-1;
  }
  publicintgetPageSize(){
    returnpageSize;
  }
  publicintgetPageNumber(){
    returnpageNumber;
  }
}
 
 
 
HibernatePage.Java실현:
packageorg.domain.scrm4u.helper.impl;
importjava.util.List;
importorg.domain.scrm4u.helper.Page;
importorg.hibernate.HibernateException;
importorg.hibernate.Query;
importorg.hibernate.ScrollMode;
importorg.hibernate.ScrollableResults;
publicclassHibernatePageimplementsPage{
  protectedList<?>elements;
  protectedintpageSize;
  protectedintpageNumber;
  protectedinttotalElements=0;
  privateScrollableResultsscrollableResults;
  privateHibernatePage(intpageNumber,intpageSize){
    this.pageNumber=pageNumber;
    this.pageSize=pageSize;
  }
  publicbooleanisFirstPage(){
    returngetPageNumber()==0;
  }
  publicbooleanisLastPage(){
    returngetPageNumber()>=getLastPageNumber();
  }
  publicbooleanhasNextPage(){
    returnelements.size()>getPageSize();
  }
  publicbooleanhASPreviousPage(){
    returngetPageNumber()>0;
  }
  publicintgetLastPageNumber(){
    doubletotalResults=newInteger(getTotalNumberOfElements()).doubleValue();
    returnnewDouble(Math.floor(totalResults/getPageSize())).intValue();
  }
  publicList<?>getThisPageElements(){
    returnhasNextPage()?elements.subList(0,getPageSize()):elements;
  }
  publicintgetTotalNumberOfElements(){
    returntotalElements;
  }
  publicintgetThisPageFirstElementNumber(){
    returngetPageNumber()*getPageSize()+1;
  }
  publicintgetThisPageLastElementNumber(){
    intfullPage=getThisPageFirstElementNumber()+getPageSize()-1;
    returngetTotalNumberOfElements()<fullPage?getTotalNumberOfElements():fullPage;
  }
  publicintgetNextPageNumber(){
    returngetPageNumber()+1;
  }
  publicintgetPreviousPageNumber(){
    returngetPageNumber()-1;
  }
  publicintgetPageSize(){
    returnpageSize;
  }
  publicintgetPageNumber(){
    returnpageNumber;
  }
  publicstaticHibernatePagegetScrollPage(Queryquery,intpageNumber,intpageSize,ScrollModescrollMode){
    HibernatePagesp=newHibernatePage(pageNumber,pageSize);
    try{
      sp.scrollableResults=query.scroll(scrollMode);
      if(scrollMode==ScrollMode.SCROLL_SENSITIVE){
        sp.scrollableResults.last();
        sp.totalElements=sp.scrollableResults.getRowNumber();
      }else{
        sp.totalElements=sp.calculateTotalElementsByList(query);
      }
      sp.determineElements(query);
    }catch(HibernateExceptione){
      e.printStackTrace();
    }
    returnsp;
  }
  privatevoiddetermineElements(Queryquery)throwsHibernateException{
    if(Integer.MAX_VALUE==this.pageNumber)this.pageNumber=(getTotalNumberOfElements()/this.pageSize);
    elements=query.setFirstResult(this.pageNumber*this.pageSize).setMaxResults(this.pageSize+1).list();
  }
  privateintcalculateTotalElementsByList(Queryquery)throwsHibernateException{
    returnquery.list().size();
  }
}
 
간단하게 분석 해 보 세 요.
ListPage 구현 은 검색 결과 집합 을 모두 꺼 내야 합 니 다.
우 리 는 페이지 의 실현 을 분석 하 는 데 중심 을 두 었 다.
테스트 코드 는 다음 과 같 습 니 다:
importJava.io.IOException;
importjava.sql.SQLException;
importjava.util.List;
importorg.hibernate.Query;
importorg.hibernate.ScrollMode;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.AnnotationConfiguration;
importorg.hibernate.cfg.Configuration;
importorg.domain.scrm4u.helper.Page;
importorg.domain.scrm4u.helper.impl.HibernatePage;
importorg.domain.scrm4u.entity.TPsn;
publicclassBusinessService{
  publicstaticvoidmain(String[]args)throwsIOException,SQLException{
    Configurationconfig= newAnnotationConfiguration().configure();
    SessionFactorysessionFactory=config.buildSessionFactory();   
    Sessionsession=sessionFactory.openSession();
    StringHql="fromTPsn";
    Queryquery=session.createQuery(Hql);
    Pagepage=HibernatePage.getScrollPage(query,0,10,ScrollMode.SCROLL_SENSITIVE);
    List<?>list=page.getThisPageElements();
    for(inti=0;i<list.size();i++){
      TPsnpsn=(TPsn)list.get(i);
      System.out.println(psn.getPsnNo()+"t"+psn.getPsnPnm()+"t"+psn.getPsnBrthDt());
    } 
    session.close();
    sessionFactory.close();
  }
}
 
 
테스트 중 발견:
ScrollMode.Scroll 사용 하기SENSITIVE 비 Scrollmode.FORWARDONLY 는 성능 면 에서 훨씬 빠르다.구체 적 인 선택 은 사용 할HibernateJDBC이 지탱 되 었 는 지,scroll 을 지원 하면 ScrollableResults 류 를 사용 하여 결과 집합 을 처리 할 수 있 습 니 다.
물론 캐 시 기술 에 맞 춰 페이지 를 넘 기 는 것 도 효율 적 이다.
캐 시 에 대해 서 는 참고 하 시기 바 랍 니 다.http://blog.csdn 구동 하 다 /kunshan_shenbin/archive/2008/09/03/2874992. .net x。

좋은 웹페이지 즐겨찾기