01.关于使用Hibernate技术实现分页显示的思考总结

关于使用Hibernate技术实现分页显示的思考总结

作者:吕鹏

把数据库的数据取出来,放在网页上简单,但实现分页一直是让我头疼的问题,我从去年和团队做项目的时候就不会,今年又遇到这个问题了,我还是不会,我很郁闷,我问队长希望队长告诉我怎么做,但队长说去年这个问题我就没有解决,今年不会在告诉我了,让我自己想,是啊,这个问题我自己想不明白,我永远都不会,以后参加工作了,这种简单的题目我必须要掌握一种基本的方法啊,所以,今天一天我都在研究怎么实现分页的功能,说实话,网上的教程倒是很不少呢,有关于jsp的,有三大框架的,正好我现在在学习框架,便收藏了一个关于使用Hibernate分页的网页,看了半天没看懂,很郁闷,但是我不能放弃,在抄了一边代码以后我开始思考一个问题。


首先,我必须明白实现的原理是什么,没有这个思路,就算抄再多的代码也没有用,所以,我停止抄代码,而是想想实现分页到底需要解决哪些问题,最后我想白了一些。


首先,我们必须弄明白几个问题

1如何将查询结果显示在页面上

这个问题放在jsp上,可能需要request,在框架中,依靠Struts2框架可以很轻松的搞定,在Action里定义一个比如说是Student类的对象,设置getset方法,用于获取Student类的信息,在调用持久层方法返回的结果赋值给student对象,然后进入结果视图,在结果视图也就是jsp页面中,利用Struts2的标签库迭代器就可以遍历出我们想要的关于Student的所有信息了。这个问题解决。


2如何将分页信息(也就是数据库的记录数,页数信息)通知到页面上?

这个问题和上个问题其实是一样的,可以合在一起完成。首先我们想,既然我们可以把数据库的信息传到页面上,那么关于分页的信息我们一样可以显示在页面上,这是没有问题的,关键在于我们如何获取这些分页信息,并且保证一个问题,就是我们的分页信息和我们查询的数据结果要一起传输到页面的问题,因为记录的显示要根据分页的条数来显示。其实我们可以这么做:


定义一个分页Bean,叫PageBean,在这个Bean中,我们定义一些关于分页信息的属性,比如说一共多少条记录,一共多少页,当前页....最重要的是我们再定义一个List<Student> list属性。用这个属性封装我们查询到的Student类的信息。然后在持久层定义一个方法叫做getPageBean()的方法,在这个方法里面我们可以先通过hql语句查询我们需要的数据然后赋值给一个List<Student>对象,然后再通过一系列方法获得关于分页信息的数据,然后再实例化一个PageBean,通过它的set方法把我们刚才查到的信息都封装在它的对象中,别忘了,还有pageBean.setList(studentList)这个方法....返回这个bean就可以了。

然后我们在Action得到我们要的这个bean,然后我们通过getList方法就可以获得关于Student类的信息了,再然后我就不讲了,和第一个问题是一样的了。

以上就是一个核心的问题,当然其解决方法是很多的,我为了方便起见把查询数据的结果和获得分页信息的结果放在一个方法里面了,显的比较冗长,其实是有些不合理的。之后会改善。这里我们重点讲解其实现的过程和原理。

(3)再一个问题,就是我们如何获得关于分页的相关信息?

这个问题的解答我也不知道,但是我们有百度,就可以查,基本上,关于分页的信息就包括以下内容:

A.List<> list    要返回的某一页的记录列表

B.Int allRow  总的记录数

C.Int totalPage  总的页数

D.Int currentPage  当前页数

E.Int pageSize 每页的记录数

下面我来讲解一下这几个属性的作用,首先其中两个属性是用户传递给程序的(传递的方式有很多,这里是每页的记录数pageSize我自定义为5.然后当前页数由url取回的值)我们首先可以通过int allRow = sessionFactory.openSession().find(hql).size();这句话获得数据库的信息的总的页数,那么我们已经知道总记录数,而且还知道了,我们要每页显示几条记录,那很轻松的就可以算出我们可以分几页了是不是?有的同学说让总记录数除以每页显示数就可以了,但这样会忽略一个问题,如果有9条记录,每页显示5条,9/5根据java算法,是得1啊,可我们要的结果是2,所以这里我们需要定义方法,在这个方法里面我们进行一下判断,比如说,假设我们的总记录数可以和每页显示数整除的话,那就取结果,如果不能整除就让结果+1,就Ok了。我们说我们定义的五个属性:某一页的记录列表我们通过hibernate的方法就可以查到,总记录数也可以查到,总页数我们刚才通过方法也得到了,当前页数我们可以通过url地址栏传过来,每页的记录数我们自己已经定义好了,这些属性我们都得到了,这个问题也解决了。

解决了以上最关键的三个问题,那么现在我们就可以大体的顺一遍,把刚才我们得到的那些数据进行整合。

(1)假设我们要求每页显示5条,首先显示第1页信息。那么我们将两个参数传递过去,让action接收然后让action内的业务层对象去调用持久层的相关方法即可。

(2)方法getPageBean()里面的代码大致如下:

通过截图我们发现我们将所有关于分页的信息和数据的资料我们都封装在了pageBean当中,在这里要注意两个方法,q.setFirstResult()和q.setMaxResults()方法,这两个方法就是用来设置我们获取的某一页的所有记录的关键。再然后,我们直接返回结果视图就可以了,在结果视图中,我们通过迭代器来取出我们想要的值就可以了。

(3)首先迭代显示我们需要用到的数据信息

注意我们对list进行迭代,这里我们首先要获得list的值,这个值我在action里面就得到了,怎么得到的,我就不说了,大家都懂的。

在这里还要注意的是,我们在做删除和修改操作的时候,我们传递过去的是id值,是一个int值。传递给action相关的方法进行删除或者修改就可以了。但这有个问题如果我们传递过去的是汉字,可能服务器接受到的就是乱码,这个问题我暂时还没有结果所以这里我用的id.以后会解决。

(4)然后,我们再迭代取得关于分页的内容

分页我们大家都看到了,使用了Struts2的标签if 和else,挺好用的。第一个判断是说,如果我的当前页为1的话,就显示第一页,上一页,但无连接。反之如果说不等于1,也就是说大于1的话,给第一页和上一页加上连接,连接的action都是queryAll方法,传递的参数是page,也就是要查找的页。这个大家一看就明白我就不细说了,下面和上面是一个道理。这里大家可能有点疑惑的是这个action的方法queryAll的代码是什么?其实很简单,就是再去调用持久层的getPageBean()方法一次,只是传递的参数不同了。

(5)最后,我们看一下效果图

3.总结反思

关于这个分页显示的文档,刚才我也说了,自己不怎么会,所以拿出一下午的时间从网上找资料,最后也没看懂,又自己想了很久才想明白,可能还有些不明白的地方,但是起码我知道了这样一个流程,在以后的开发中还回遇到相关类似更复杂的问题,我想他们的解决也无非就是那几个核心问题。所以我还是觉得,抄代码作用不大,抄会了不是真会了,想明白了才最重要。并且是独自想明白。虽然队长还是不怎么满意我做的,感觉有些简单了,但是对于自己来说,挺不错了,起码进步了,有了这样一次小小的成功的体会,以后再多的考验我也愿意去尝试了。呵呵。

记录这个文档有两个作用,一个是帮助自己加深对分页显示的理解,用自己的话说出来,会让自己更容易理解,其实也是想让看到这个文档的对分页不是很明白的同学一起明白过来,写错的地方,还请见谅。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值