我的分页算法
admin 发布于:2009-09-06 19:47:00
阅读:loading
以前学过的分页也不少,有用游标、top的,但是学习分页的时候往往是很郁闷的,因为根本没有掌握其中的原理,后来因为需要,就在以前的项目中扒了一个Hibernatge的分页的出来,有了hibernate的分页还远不够,因为自己不知道是怎么回事,jdbc在实际应用中也是应用的非常多的,这就要求我们要在平时项目过程中既要用到hibernate,但是也不可以不用jdbc,单纯的任务有了hibernate以后,觉得jdbc很低级,错了,这个事情还得看具体项目需求的。比如说一个非常简单的例子,用户修改密码的时候,用jdbc可以直接这样写sql语句:update tableName set password = ? where idorname = ? 这样就可以直接修改,如果换成是hibernate了,必须先根据传递的这个idorname来查询一下数据库,然后再更改,不然直接根据idorname会覆盖其他的信息,会把其他信息置为空的,还有我常用的hibernate的删除的时候:dao.delete(Class.class ,id);用这种方法来执行批量的删除,效果明显的不怎么好,因为如果用这个删除的话,多条数据,由于不能写SQL语句,所以说必须是用for或其他循环删除,就多调用了N此数据库连接来删除,而用jdbc的话,可以直接写SQL语句,我常用的处理是1、用字符串拼接的方法如:
String sqls = "";
for(int i=0;i<array.length();i++){
sqls += "delete tableName where id = " + array[i] + "; "
}
executeUpdate(sqls);
第二种方法更好,就是
String sqls = request.getParameter("ids");
//获取到的是 1,2,3,4,5,6,7,8,
获取sqls的第一位到length-1为的字符串,即1,2,3,4,5,6,7,8
executeUpdate("delete form tableName where id in ( " + sql +")");
哦了,所以说jdbc可以直接写SQL更灵活,并且某些基本的算法,比如说是判断呀,都可以交给SQL语句,我的hibernate能力也不行,知道一个Query类,有一个executeUpdate方法,也是可以执行sql语句,但是他执行的sql语句是返回你这条新增、删除、修改可以影响到的多少条数据,但是并没有正真意义上执行sql语句。本人只是浅谈,重点还是后面的:
心里想有了这个分页就可以不用JDBC的分页了,正好我JDBC分页也搞的不好,今天的功能在hibernate里面至少要配置5、6个映射关系,我心虚了,一点搞错了,那不是找起错误来人就要疯了,我考虑用jdbc,虽然创建了一个大大的javabean,按照标准的java语言规范有注释啥的,这个大javabean有700多行,狠,也太多了。既然考虑用javabean那么分页是必须的,所以说今天根据需求我自己在一个小时内写好了分页算法,从分页的pagebean到处理类,全是自己写的,其思想就是上次搞的自定义标签分页思想。
先说一下个人感觉的优点:
1、不分数据库,实用性强。
以前那个自定义标签分页的给朋友用其他数据库测试过,所以说这点肯定没有问题,只是数据库连接和驱动要换。
2、支持随便一条SQL查询的SQL语句。
随便给我一条查询的sql语句,强大之处就在于:SQLServer数据库常用分页方法是top分页,mysql常用的分页方法是limit,Oracle常用的记不清了,里面的pageSize可以变,roundNumber就是显示当前页附近的N条数据也可以变(没有给默认值)。
3、实现基本分页所有功能。
如下图:
有基本的 首页 上一页 永远显示当前页附件的N页链接 下一页 末页
怎么样?还可以吧。
4、性能方面:估计还不错,等以后再改进。
5、升级和维护非常方便,可以把这个分页换成ajax的或dwr的无刷新分页都很容易。
具体描述下原理机制:
1、核心是:用sun提供的离线结果集来分页
2、非常简单,只是你没有发现。
具体描述:
1、我的JDBC_PageBean:
4个属性变量分别是:
pageSize:指定分页数据的大小,即每页显示的数据为多少(可按需求给定)
count:总的数据量(可用结果集resultSet.last();int count = resultSet.getRow()来设置)
page:当前为第几页
prePage:为上一页
nextPage:下一页
lastPage:最后一页
roundNumberHTML:生成[1] [2] 3 [4] [5]
这个分页bean,其实只要获取一个变量就行了,就是总记录数。有了总记录数,再根据每页显示的数据数可以算出一共有多少页数据,怎么算了,可以用java的Math提供的方法,里面提供了大量的算法。上一页的算法就是当前页-1页,返回的小于等于1为第一页,否则返回当前页-1页,下一页同理,不过是跟总页数比较。
到这里,里面的分页属性都有数据了。
点赞