|
我们现在学习的是基于Hibernate的离线查询分页,我们在Web设计中可以选用Struts框架、JSTL等等来实现其功能。
首先,我们要理解分页的算法,也要讲究效率,也就是说我们不能把所有的记录取出来,我们只取一个页面中需要显示的纪录,那么怎么去实现是我们关心的问题!不要着急,重在理解而是单纯技术实现。我采用Web框架两种方式来实现,attention!
分页算法,也就是我们提供给客户方便的操作。一般有哪些东西呢?
上页、下页、首页、末页、导航到X页,页码导航。说到这里我们先放下,我们来说说取出页面的记录,也就是只取一段的记录。打开Hibernate API 看到Criteria 接口,public Criteria setMaxResults(int maxResults),意思为:设置记录对象数目的上限,第二方法,public Criteria setFirstResult setFirstResult(int firstResult),意思:设置开始取得记录对象的下标,其中的第一对象下标为0。这样我们可以看出Hibernate提供很好的方法给我们实现分页。
我们产生了思路:我们只有设置firstResult得下标,我们这里把它叫做游标。我们只要控制游标就可以控制取得的记录就是我们想要得到的,下面要做的工作就是我们来控制index,下面我写了一个HPage的类来实现这个工作,也就是取得一些相关的值,其中我们关系的有:当前的页码、当前的游标等等,下面我们结合代码来说明下!~~~
实现代码如下:
public class HPage {<br /><br /> private int countPage; //页面的数量<br /><br /> private int startIndex=0; //纪录游标 <br /><br /> private int recordPerPage; //每页中的记录数量<br /><br /> private int pageIndex=1; //初始的页码<br /><br /> private boolean nextPage=true;<br /><br /> private boolean previousPage=false;<br /><br /> private boolean firstPage=true;<br /><br /> private boolean lastPage=false;<br /><br /> public int getCountPage() //取得页面的数量<br /><br /> {<br /><br /> return countPage;<br /><br /> }<br /><br /> public int getStartIndex() //取得游标的位置<br /><br /> {<br /><br /> return startIndex;<br /><br /> }<br /><br /> public HPage(int countRecord,int recordPerPage) <br /><br /> //coutRecord参数:纪录的总数量;recordPerPage参数:设置每页的记录数量<br /><br /> {<br /><br /> this.recordPerPage=recordPerPage;<br /><br /> if(countRecord % recordPerPage == 0)<br /><br /> countPage=countRecord / recordPerPage;<br /><br /> else<br /><br /> countPage=countRecord / recordPerPage +1;<br /><br /> }<br /><br /> public int getPageIndex() // 取得当前页码<br /><br /> {<br /><br /> return pageIndex;<br /><br /> }<br /><br /> public int nextPage() // 游标下一页滚动<br /><br /> {<br /><br /> pageIndex++;<br /><br /> if(isOnlyOne())<br /><br /> {<br /><br /> nextPage=false;<br /><br /> previousPage=false;<br /><br /> firstPage=false;<br /><br /> lastPage=false;<br /><br /> }<br /><br /> else<br /><br /> {<br /><br /> previousPage=true;<br /><br /> firstPage=true;<br /><br /> }<br /><br /> if(pageIndex > countPage)<br /><br /> return lastPage();<br /><br /> else<br /><br /> {<br /><br /> return (startIndex=forwardPage(pageIndex));<br /><br /> }<br /><br /> }<br /><br /> public int previousPage() // 游标上一页滚动<br /><br /> {<br /><br /> pageIndex--;<br /><br /> if(isOnlyOne())<br /><br /> {<br /><br /> nextPage=false;<br /><br /> previousPage=false;<br /><br /> firstPage=false;<br /><br /> lastPage=false;<br /><br /> }<br /><br /> else<br /><br /> {<br /><br /> nextPage=true;<br /><br /> lastPage=true;<br /><br /> }<br /><br /> if(pageIndex <= 1)<br /><br /> return firstPage();<br /><br /> else<br /><br /> {<br /><br /> return (startIndex=forwardPage(pageIndex));<br /><br /> }<br /><br /> }<br /><br /> public int lastPage() // 游标向末页滚动<br /><br /> {<br /><br /> pageIndex=countPage;<br /><br /> if(isOnlyOne())<br /><br /> {<br /><br /> nextPage=false;<br /><br /> previousPage=false;<br /><br /> firstPage=false;<br /><br /> lastPage=false;<br /><br /> }<br /><br /> else<br /><br /> {<br /><br /> nextPage=false;<br /><br /> previousPage=true;<br /><br /> firstPage=true;<br /><br /> lastPage=false;<br /><br /> }<br /><br /> return (startIndex=(countPage-1) * recordPerPage);<br /><br /> }<br /><br /> public int firstPage() // 游标向首页滚动<br /><br /> {<br /><br /> pageIndex=1;<br /><br /> if(isOnlyOne())<br /><br /> {<br /><br /> nextPage=false;<br /><br /> previousPage=false;<br /><br /> firstPage=false;<br /><br /> lastPage=false;<br /><br /> }<br /><br /> else<br /><br /> {<br /><br /> nextPage=true;<br /><br /> previousPage=false;<br /><br /> firstPage=false;<br /><br /> lastPage=true;<br /><br /> }<br /><br /> return (startIndex=0);<br /><br /> }<br /><br /> public int forwardPage(int pageIndex) //导向制定页面<br /><br /> {<br /><br /> <br /><br /> if(pageIndex >= countPage)<br /><br /> {<br /><br /> pageIndex=countPage;<br /><br /> return (startIndex=lastPage());<br /><br /> }<br /><br /> else if(pageIndex <= 1)<br /><br /> {<br /><br /> pageIndex=1;<br /><br /> return startIndex=firstPage();<br /><br /> }<br /><br /> this.pageIndex=pageIndex;<br /><br /> if(isOnlyOne())<br /><br /> {<br /><br /> nextPage=false;<br /><br /> previousPage=false;<br /><br /> firstPage=false;<br /><br /> lastPage=false;<br /><br /> }<br /><br /> else<br /><br /> {<br /><br /> nextPage=true;<br /><br /> previousPage=true;<br /><br /> firstPage=true;<br /><br /> lastPage=true;<br /><br /> }<br /><br /> return (startIndex=(this.pageIndex -1)* recordPerPage); <br /><br /> }<br /><br /> private boolean isOnlyOne() //是否只有一页<br /><br /> {<br /><br /> return countPage==1 ? true : false;<br /><br /> }<br /><br /> public boolean isNextPage() //是否有下页<br /><br /> {<br /><br /> return nextPage;<br /><br /> }<br /><br /> public boolean isPreviousPage() //是否有上页<br /><br /> {<br /><br /> return previousPage;<br /><br /> }<br /><br /> public boolean isFirstPage() //是否首页<br /><br /> {<br /><br /> return firstPage;<br /><br /> }<br /><br /> public boolean isLastPage() //是否末页<br /><br /> {<br /><br /> return lastPage;<br /><br /> } <br /><br />}<br /><br />
不是很难吧!好的,现在我们做好的工作就是取得了我们要的数值,下面要做的是加到Hibernate查询里面去,下面的工作很简单。但是我们要注意几个问题,第一个问题,我们的设计的目的不是为了解决一个问题,而是抽象出一个方案提供给相似的问题的解决方案。这样的话,我们最大化重利用代码,那么我们采用范性的特点(注意JDK5.0的特征,以前的版本会报错误)。下面我分析一下代码:
以上代码中,实现了泛型-离线查询的页面的代码。上篇完,下篇我们来使用Struts和JSTL在网页上测试
public class DisplayPageRecordList<T> { //泛型实现<br /><br /> private int startIndex;<br /><br /> private static final int DEFAULT_RECORD_PER_PAGE=5; //默认:每页中5条记录<br /><br /> private List<T> list; <br /><br /> private HPage page;<br /><br /> private int recordPerPage=DEFAULT_RECORD_PER_PAGE;<br /><br /> private final Session session=HibernateSessionFactory.getSession();<br /><br /> private DetachedCriteria deCriteria;<br /><br /> private Criteria criteria; <br /><br /> private int countRecord;<br /><br /> public DisplayPageRecordList(String className) throws ClassNotFoundException<br /><br /> //className参数:类的全定名称<br /><br /> { <br /><br /> deCriteria=DetachedCriteria.forClass(Class.forName(className)); //创造离线的查询<br /><br /> criteria=deCriteria.getExecutableCriteria(session);<br /><br /> criteria.setCacheable(true); <br /><br /> doInit();<br /><br /> page=new HPage(countRecord,recordPerPage); <br /><br /> }<br /><br /> public DisplayPageRecordList(int recordPerPage,String className) throws ClassNotFoundException<br /><br /> //recordPerPage参数:每页的纪录的条目数,className参数:同上个构造方法中<br /><br /> {<br /><br /> <br /><br /> deCriteria=DetachedCriteria.forClass(Class.forName(className));<br /><br /> criteria=deCriteria.getExecutableCriteria(session);<br /><br /> criteria.setCacheable(true);<br /><br /> this.recordPerPage=recordPerPage;<br /><br /> doInit();<br /><br /> page=new HPage(countRecord,recordPerPage); <br /><br /> } <br /><br /> public DisplayPageRecordList(int recordPerPage,String className,Criterion criterion) throws ClassNotFoundException<br /><br /> //recordPerPage参数:同上个构造方法中,className参数:同上个构造方法中,criterion参数:设置查询条件<br /><br /> {<br /><br /> <br /><br /> deCriteria=DetachedCriteria.forClass(Class.forName(className));<br /><br /> criteria=deCriteria.getExecutableCriteria(session);<br /><br /> criteria.add(criterion);<br /><br /> criteria.setCacheable(true); <br /><br /> doInit();<br /><br /> page=new HPage(countRecord,recordPerPage); <br /><br /> } <br /><br /> public void setRecordPerPage(int recordPerPage)<br /><br /> {<br /><br /> this.recordPerPage=recordPerPage;<br /><br /> page=new HPage(countRecord,recordPerPage); <br /><br /> }<br /><br /> private void doInit()<br /><br /> {<br /><br /> this.countRecord=criteria.list().size(); //计算数据库中所有的记录数 <br /><br /> }<br /><br /> public void addCriterion(Criterion criterion)<br /><br /> {<br /><br /> criteria=criteria.add(criterion); //更改所有所有查询条件<br /><br /> doInit();<br /><br /> }<br /><br /> public void setCacheable(boolean cache) //是否启用缓存<br /><br /> {<br /><br /> criteria.setCacheable(cache);<br /><br /> }<br /><br /> public List doNextPage() //查询出下页中的纪录集<br /><br /> {<br /><br /> startIndex=page.nextPage();<br /><br /> criteria.setFirstResult(startIndex);<br /><br /> criteria.setMaxResults(this.recordPerPage);<br /><br /> list=criteria.list();<br /><br /> return list;<br /><br /> }<br /><br /> public List doPreviousPage() //查询出上页中的纪录集<br /><br /> {<br /><br /> startIndex=page.previousPage();<br /><br /> criteria.setFirstResult(startIndex);<br /><br /> criteria.setMaxResults(this.recordPerPage);<br /><br /> list=criteria.list();<br /><br /> return list;<br /><br /> }<br /><br /> public List doFirstPage() //查询出首页中的纪录集<br /><br /> {<br /><br /> startIndex=page.firstPage();<br /><br /> criteria.setFirstResult(startIndex);<br /><br /> criteria.setMaxResults(this.recordPerPage);<br /><br /> list=criteria.list();<br /><br /> return list;<br /><br /> }<br /><br /> public List doLastPage() //查询出末页中的纪录集<br /><br /> {<br /><br /> startIndex=page.lastPage();<br /><br /> criteria.setFirstResult(startIndex);<br /><br /> criteria.setMaxResults(this.recordPerPage);<br /><br /> list=criteria.list();<br /><br /> return list;<br /><br /> }<br /><br /> public List doForward(int pageIndex)<br /><br /> {<br /><br /> startIndex=page.forwardPage(pageIndex);<br /><br /> criteria.setFirstResult(startIndex);<br /><br /> criteria.setMaxResults(this.recordPerPage);<br /><br /> list=criteria.list();<br /><br /> return list;<br /><br /> }<br /><br /> public HPage getPage() //取得页面对象<br /><br /> {<br /><br /> return this.page;<br /><br /> } <br /><br />}<br /><br />
|
一共有 0 条评论