技术开发 频道

struts+spring+hibernate通用分页方法



    【IT168 技术文档】
分页有2种办法:
1、从数据库中取得记录,在内存中再划分,如果遇到记录数很大的时候效率很成问题,此法不可取。
2、采用hibernate的物理分页,每次只是取一页。从客户端传进来的是第几页和每页多少条记录,要首先查询符合记录的总记录数,再根据总记录数和当前页,每页记录数可以算出要取的是数据库中的第几条记录。2次查询不可避免了。
单元测试如下:
public final void testFindAllRole() {  
  1.   
  2.             logger.debug("testFindAllRole");  
  3.   
  4.             long l1=System.currentTimeMillis();  
  5.   
  6.             String myaction="roleList.do";  
  7.   
  8.             String curPageNO = "1";  
  9.   
  10.             CriteriaQuery cq=new CriteriaQuery(Role.class,curPageNO,myaction);  
  11.   
  12.             cq.setPageSize(10);  
  13.   
  14.             PageSupport ps=BeanFactory.getInstance().getRightDelegate().findAllRole(cq, state);  
  15.   
  16.             long l2=System.currentTimeMillis();  
  17.   
  18.             AppUtils.printCollection(ps.getResultList());    
  19.   
  20.             System.out.println("一共用时为 :  "+(l2-l1));            
  21.   
  22.         }  

    CriteriaQuery类是对hibernate QBC查询方法的封装,需要的参数是当前操作的实体类,myaction,curPageNO,pageSize,以便构造出相应的上下翻页的工具条。
    在delegate中只是将值向下传:

    java 代码
    1. public PageSupport findAllRole(CriteriaQuery cq, IState state) {  
    2.   
    3.         if (DelegateUtil.isNullParam(cq, "CriteriaQuery", state)) {  
    4.   
    5.             return null;  
    6.   
    7.         }  
    8.   
    9.         Request req = new Request();  
    10.   
    11.         req.setServiceName(ServiceConsts.FindAllRoleProcessor);  
    12.   
    13.         req.setValue("CriteriaQuery", cq);  
    14.   
    15.         try {  
    16.   
    17.             Response resp = getDelegate().execute(req);  
    18.   
    19.             DelegateUtil.setIState(state, resp);  
    20.   
    21.             return (PageSupport) (resp.getValue("PageSupport"));  
    22.   
    23.         } catch (Exception e) {  
    24.   
    25.             DelegateUtil.handleException(e, "findAllRole", state);  
    26.   
    27.         }  
    28.   
    29.         return new PageSupport();  
    30.   
    31.     } 
    在业务逻辑模块command中:
    java 代码
    1. public class FindAllRole extends Command  
    2. {  
    3.     private RoleDao dao;  
    4.     public void setDao(RoleDao dao) {  
    5.         this.dao = dao;  
    6.     }  
    7.     public void execute(Map params, Map response) throws Exception  
    8.   
    9.     {  
    10.         response.put("PageSupport", (PageSupport)dao.find((CriteriaQuery) params.get("CriteriaQuery"),true));  
    11.     }  
    12. ……  
    13.   
    14. }  
    直接就是调用dao的find方法:
        
    java 代码
    1. public PageSupport find(final CriteriaQuery cq,final boolean isOffset) {  
    2.        return (PageSupport)getHibernateTemplate().execute(  
    3.                new HibernateCallback() {  
    4.                    public Object doInHibernate(Session session) throws HibernateException, SQLException {  
    5.                        Criteria criteria = cq.getDetachedCriteria().getExecutableCriteria(session);   
    6.                        //得到总行数  
    7.                        int allCounts = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();   
    8.                        criteria.setProjection(null);//还原    
    9.                        int curPageNO = PagerUtil.getCurPageNO(cq.getCurPage());// 当前页  
    10.                        int offset = PagerUtil.getOffset(allCounts, curPageNO, cq.getPageSize());  
    11.                        String toolBar = PagerUtil.getBar(cq.getMyaction(),allCounts,curPageNO,cq.getPageSize());  
    12.   
    13.                        if(isOffset){  
    14.   
    15.                            criteria.setFirstResult(offset);  
    16.   
    17.                            criteria.setMaxResults(cq.getPageSize());  
    18.   
    19.                        }  
    20.                        return new PageSupport(criteria.list(),toolBar,offset,curPageNO);  
    21.   
    22.                            }  
    23.                      }  
    24.   
    25.                ,true);  
    26.    }  
    在后台的整个操作中非常简练,只需要将带上参数的CriteriaQuery传到dao就可以实现。CriteriaQuery封装了hibernate的DetachedCriteria。
0
相关文章