struts+spring+hibernate通用分页方法
1、从数据库中取得记录,在内存中再划分,如果遇到记录数很大的时候效率很成问题,此法不可取。
2、采用hibernate的物理分页,每次只是取一页。从客户端传进来的是第几页和每页多少条记录,要首先查询符合记录的总记录数,再根据总记录数和当前页,每页记录数可以算出要取的是数据库中的第几条记录。2次查询不可避免了。
单元测试如下:
public final void testFindAllRole() {
-
- logger.debug("testFindAllRole");
-
- long l1=System.currentTimeMillis();
-
- String myaction="roleList.do";
-
- String curPageNO = "1";
-
- CriteriaQuery cq=new CriteriaQuery(Role.class,curPageNO,myaction);
-
- cq.setPageSize(10);
-
- PageSupport ps=BeanFactory.getInstance().getRightDelegate().findAllRole(cq, state);
-
- long l2=System.currentTimeMillis();
-
- AppUtils.printCollection(ps.getResultList());
-
- System.out.println("一共用时为 : "+(l2-l1));
-
- }
CriteriaQuery类是对hibernate QBC查询方法的封装,需要的参数是当前操作的实体类,myaction,curPageNO,pageSize,以便构造出相应的上下翻页的工具条。
在delegate中只是将值向下传:
java 代码
- public PageSupport findAllRole(CriteriaQuery cq, IState state) {
-
- if (DelegateUtil.isNullParam(cq, "CriteriaQuery", state)) {
-
- return null;
-
- }
-
- Request req = new Request();
-
- req.setServiceName(ServiceConsts.FindAllRoleProcessor);
-
- req.setValue("CriteriaQuery", cq);
-
- try {
-
- Response resp = getDelegate().execute(req);
-
- DelegateUtil.setIState(state, resp);
-
- return (PageSupport) (resp.getValue("PageSupport"));
-
- } catch (Exception e) {
-
- DelegateUtil.handleException(e, "findAllRole", state);
-
- }
-
- return new PageSupport();
-
- }
在业务逻辑模块command中:
java 代码
- public class FindAllRole extends Command
- {
- private RoleDao dao;
- public void setDao(RoleDao dao) {
- this.dao = dao;
- }
- public void execute(Map params, Map response) throws Exception
-
- {
- response.put("PageSupport", (PageSupport)dao.find((CriteriaQuery) params.get("CriteriaQuery"),true));
- }
- ……
-
- }
直接就是调用dao的find方法:
java 代码
- public PageSupport find(final CriteriaQuery cq,final boolean isOffset) {
- return (PageSupport)getHibernateTemplate().execute(
- new HibernateCallback() {
- public Object doInHibernate(Session session) throws HibernateException, SQLException {
- Criteria criteria = cq.getDetachedCriteria().getExecutableCriteria(session);
-
- int allCounts = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
- criteria.setProjection(null);
- int curPageNO = PagerUtil.getCurPageNO(cq.getCurPage());
- int offset = PagerUtil.getOffset(allCounts, curPageNO, cq.getPageSize());
- String toolBar = PagerUtil.getBar(cq.getMyaction(),allCounts,curPageNO,cq.getPageSize());
-
- if(isOffset){
-
- criteria.setFirstResult(offset);
-
- criteria.setMaxResults(cq.getPageSize());
-
- }
- return new PageSupport(criteria.list(),toolBar,offset,curPageNO);
-
- }
- }
-
- ,true);
- }
在后台的整个操作中非常简练,只需要将带上参数的CriteriaQuery传到dao就可以实现。CriteriaQuery封装了hibernate的DetachedCriteria。
1