以前做的项目中,使用到分页都是通过封装一个页面类如 class page 来保存页面的信息,包括当前页码,每页显示页码数,总页数,总记录数,结果集
在SQL中通过当前页码和每页页码数来控制SQL,直接查询数据出来,然后挨着排的放到页面中,在页面加入链接或按钮来改变当前页码,实现分页
最近公司要求做的一个分页,页面中要有各种查询条件选项,可以实现查询功能,查询的同时要实现分页,这个还是有一点值得去思考的:
首先是拼接SQL,带条件的分页我感觉是有一定难度的,也是因为之前没那么做过,也挺有挑战性;我选择的是select top 和 not in 的组合来完成,这样的SQL最重要的一点是你要保证 not in 后面所要执行的 select 语句与它之前的 select 语句所操作的数据区域是一致的,否则查询出来的数据是不正确的;我写的语句是 :
select top 条数 * from (select top NO2 * from message where 条件 order by createTime desc)
t1 where t1.id not in (select top NO3 id from t1 order by createTime desc)
我的想法没错,但是t1在 not in 后的查询子句中引用无效,后来在老大的提示下,我在程序中改造了SQL,就是将各个区段的SQL封装成一个个体,然后对接他们,最后实现了功能。
另一种SQL则是采用套三层的方式,倒转查询出来的结果集,如:
select * from (select top 10 * from (select top 29 from message where 条件 order by id asc)
t1 ) t2 order by id desc
但是我将这条SQL的排序列改为其他的非标识列时,发现查询出的结果并非我想要的顺序,我也对这种语句操作方式理解不够,最后还是用自己的想法来实现了。
程序中要保证查询与分页的同步,而且还要保证页面跳转不会影响查询结果集;我重新封装了一个条件类,用来储存条件信息,这样就把散落的各种条件集合在一起,易于管理,后来证明这种方式确实是带了很大的便利。后来也是图方便,我还把条件类做成了分页类的成员,这样我在拼接SQL的时候比较简单一些。
页面的跳转我是通过按钮来实现的,起初设想的是,点击页面跳转按钮的时候触发表单提交,然后将表单信息发送过去,执行查询。这样要面对一个问题,之前点击查询按钮提交的表单数据需要记录下来,在页面跳转事件中要继续使用这些数据才能保证结果同步,否则表单提交完了以后就会清空,在提交就没有条件了,那后果可想而知。我选择session保存条件,判断用户按下的是不是查询按钮来决定是否要重新设定session中的条件值,然后分页信息需要通过 request来传递,分页按钮也不能触发表单提交了,而要改成链接参数的方式来传递分页信息,这样查询和分页互不干涉,同时能保证数据的正确性。
感觉自己还是太菜了,需要向那个偶像程序员学习,努力。。