博主资料

留言 加为好友 收藏

用户名:  mercyblitz
来自:  湖南 长沙
年龄:  22
爱好: 纪连海 唱KTV

个人统计

用户名: mercyblitz
等级: 初来乍到
威望: 110
积分: 732
在线时间: 43 小时
日志总数: 39
评论数量: 34
访问次数: 331346
建立时间: 2007-03-26
RSS订阅       手机访问

最新评论

文章搜索

友情链接

日志文章

2007年06月07日 21:05:28

Hibernate范型-离线分页实现(上)

我们现在学习的是基于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的特征,以前的版本会报错误)。下面我分析一下代码:






以上代码中,实现了泛型-离线查询的页面的代码。上篇完,下篇我们来使用StrutsJSTL在网页上测试




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 />

Tags: Hibernate  

类别: J2EE开发经验 |  评论(0) |  浏览(4315) |  收藏
-20楼 [楼主][匿名] Says:
-21楼 [楼主][匿名] Says:
-22楼 [楼主][匿名] Says:
-23楼 [楼主][匿名] Says:
-24楼 [楼主][匿名] Says:
-25楼 [楼主][匿名] Says:
-26楼 [楼主][匿名] Says:
-27楼 [楼主][匿名] Says:
-28楼 [楼主][匿名] Says:
-29楼 [楼主][匿名] Says:
发表评论