我用的是Spring+Hibernate+Struts框架: 这是我的DAO的核心代码 import org.springframework.orm.hibernate.support.HibernateDaoSupport; // 用Spring支持的Hibernate方法,使Hibernate对数据库的操作继续瘦身 public List getOfficeBySearchCriteria(final String hsql,final int pageNo,final int page_size) throws DataAccessException // hsql 是如:"select office1 from Office as office1 order by office1.officename";pageNo 是第几页;page_size是每页记录数 { String sql; int total_count=0; List offices=new ArrayList(); //offices= getHibernateTemplate().find("from Office office1 where office1.officename like ?", "%"+officeName+"%"); offices= getHibernateTemplate().find(hsql); //为了得到总记录数 total_count=offices.size(); crossPageInfo= crossPageBean.getCrossPageInfo(total_count,pageNo,page_size); sql=hsql+ " limit " + (pageNo-1)*page_size + "," +page_size; offices= getHibernateTemplate().find(sql); //为了得到页记录信息 System.out.println("The list offices size: "+offices.size()); return offices; } //其中crossPageBean.getCrossPageInfo只是得到页面的如:总页数、供多少页的信息等一般的翻页信息; 我在Action中是这样调用的: public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CrossPageInfo crossPageInfo=new CrossPageInfo(); String hsql="select office1 from Office office1 order by office1.officename"; String pageNo=request.getParameter("pageNo"); int pageNoi=1; if(pageNo==null) pageNo="1"; pageNoi=Integer.parseInt(pageNo); int pageSize=5; //List offices=getOfficeService().getAllOffice(); List offices=getOfficeService().getOfficeBySearchCriteria(hsql,pageNoi,pageSize); crossPageInfo=getOfficeService().getCrossPageInfo(); System.out.println("The CorssPgaeInfo :"+crossPageInfo.getPageNo()); System.out.println(crossPageInfo.getPageSize()); request.setAttribute("offices",offices); request.setAttribute("pageInfo",crossPageInfo); return mapping.findForward("success"); //throw new UnsupportedOperationException("Generated method 'execute(...)' not implemented."); } //其中getOfficeService()只是提供接口服务的方法。 我的表现页面是这样的: <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %> <%@ page import="com.uplus.util.CrossPageInfo"%> <html> <head> <title> mySearchCList </title> </head> <body bgcolor="#ffffff"> <form name="form1" action="officesearch.do" method="post"> <table > <tr> <td>OfficeName:<input name="officeName" type="text"></td><td><input type="submit" name="sb" value="Search"></td> </tr> </table> </form> <br><a href="/jsp/office/officeadd.jsp">Add</a> <table bgcolor="#DBE9F1" align="center" class="InputFrameMain" style="MARGIN: 0px" cellSpacing="1" cellPadding="0" BGALIGN="CENTER" BGVALIGn="middle" width="100%" VALIGN="middle" > <tr><td align="center">OfficeName</td><td align="center">OfficePhone</td></tr> <logic:iterate id="office" name="offices" > <tr bgcolor="#ffffff"> <td align="center"><a href="officesee.do?id=<bean:write name='office' property='id'/>" target="_blank"><bean:write name="office" property="officename"/></a></td> <td align="center"><bean:write name="office" property="officephone"/></td> <td align="center"><a href="officeedit.do?id=<bean:write name='office' property='id'/>" >Update </a> <td align="center"><a href="officedel.do?id=<bean:write name='office' property='id'/>" οnclick="return confirm('Would You Detele It? ')" >Delete </a> </tr> </logic:iterate> </table> <%CrossPageInfo cpInfo=(CrossPageInfo)request.getAttribute("pageInfo");%> <table width="100%" align="center" class="InputFrameMain" style="MARGIN: 0px" cellPadding="0" cellSpacing="0"> <tr ><form action="officelist.do" method="post" οnsubmit='return checkform2(this)'> <td width=70%>Total <font color="blue"><%=cpInfo.getTotalRow()%></font>&items found,Total&<font color="blue"><%=cpInfo.getTotalPage()%></font> Pages,Current No <font color="blue"><%=cpInfo.getPageNo()%> </font>Page. Go to <input name="pageNo" type="text" size="5" class="input">Page <input name="sb2" type="submit" class="button" value="Go"> </td></form> <td width=30% align='left'> <%if(cpInfo.getPageNo()>1){%> &<a href="officelist.do?pageNo=1"> <%}%>First</a> <%if(cpInfo.getPageNo()>1){ %> &<a href="officelist.do?pageNo=<%=cpInfo.getPageNo()-1%>"> <%}%>Previous</a> <%if(cpInfo.getPageNo()<cpInfo.getTotalPage()){ %> &<a href="officelist.do?pageNo=<%=cpInfo.getPageNo()+1%>"> <%}%>Next</a> <%if(cpInfo.getTotalPage()>cpInfo.getPageNo()){%> &<a href="officelist.do?pageNo=<%=cpInfo.getTotalPage()%>"> <%}%>Last</a></td> </tr> </table> </body> </html> 大家可以看一下我的处理过程,其中在DAO里为了得到总计录数执行了一次次数据表查询HSQL;得到数据又执行了一次HSQL,我觉得这样好像有些不太好,大家觉得怎样?大家提出宝贵的意见吧! |
| |
需要改进: hsql="select office1 from Office as office1 order by office1.officename" 有两处不好的: 1,实际查出了符合条件的所有po,多么的浪费资源 2,查总记录根本不需要order by这种影响性能的多余的clause 改成"select count(id) from Office where ..." 用query().iterate().next()得到总记录数 另外,分页,hibernate有了相应的包装,不需要你进行这样的sql构造: sql=hsql+ " limit " + (pageNo-1)*page_size + "," +page_size; |
继续:
首先感谢sorphi的建议。
DAO的核心代码改为:
public List getOfficeBySearchCriteria(final String hsql,final int pageNo,final int page_size) throws Exception
{
Session session=getSession();
String sql;
int total_count=0;
int pageNog=1;
total_count=getTotalCount(session,hsql);
//System.out.println("The counts :"+total_count);
List offices=new ArrayList();
crossPageInfo= crossPageBean.getCrossPageInfo(total_count,pageNo,page_size);
pageNog=pageNo;
if(crossPageInfo.getTotalPage()<pageNo)pageNog=crossPageInfo.getTotalPage();
if(pageNo<1)pageNog=1;
// sql=hsql+ " limit " + (pageNog-1)*page_size + "," +page_size;
// offices= getHibernateTemplate().find(sql);
//被屏蔽掉的是原来的处理
//以下是改过的处理方法
Query query=null;
query=session.createQuery(hsql);
int start=(pageNog-1)*page_size;
int rowNum=page_size;
query.setFirstResult(start);
query.setMaxResults(rowNum);
offices = query.list();
return offices;
}
public static int getTotalCount(Session session, String hql) throws Exception
{
Integer amount = new Integer(0);
int sql_from = hql.indexOf(" from");
int sql_orderby=hql.indexOf("order by");//为了改进
String countStr="";
if(sql_orderby>0)
{
countStr="select count(*) "+hql.substring(sql_from,sql_orderby);
}
else
countStr = "select count(*) "+hql.substring(sql_from);
Query query = session.createQuery(countStr);
if(!query.list().isEmpty()){
amount = (Integer) query.list().get(0);
}
else
return 0;
return amount.intValue();
}