商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

struts+spring+hibernate通用分页方法

作者:onecan  2007-08-16


    【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。
1 2 3
【内容导航】
第1页: 第1页 第2页: 第2页
第3页: 第3页
©版权所有。未经许可,不得转载。
[责任编辑:李宁]
进入论坛>>相关论坛贴
专题推荐
热点文章排行