java web实现分页显示数据

来源:互联网 发布:java递归输出二叉树 编辑:程序博客网 时间:2024/04/29 22:57

java web实现分页显示数据

 (2012-10-22 17:01:03)
转载
标签: 

分页显示

 

javaee

 

javaweb

 

数据库

 

it

分类: javaweb

一个简单的JAVA分页方法

 

 定义两个Vector,一个为储存查询所有记录的totalV,另一个储存当前页的记录currentPageV;

总的记录数:int totalSize = totalV.getSize();

每页显示的记录数:int countPerPage;

总页数:int totalPageNum = totalSize/countPerPage;

 

//如果总的记录数和每页记录数的余数大于零,

//那么总的页数为他们的整除结果加一

if (totalSize%countPerPage > 0 ){

totalPageNum = totalSize/countPerPage + 1;

}

当前的页数:pageNum

 

for (int j = 0;j

//分页,根据当前的页数和每页显示的记录数从totalV中取出记录

//currentPageV中添加记录;

//如果当前记录在(当前页码-1)*每页显示记录数(包括等于)

// 当前页码*每页显示记录数(不包括等于)之间的时候;

//就属于该页的数据

if ( (j >= (pageNum - 1) * countPerPage) && (j < pageNum * countPerPage)) {

currentPageV.addElement(totalV.get(j));

}

//currentPageV记录数等于每页显示记录数,

//停止往currentPageV中添加记录

if (currentPageV.size() == countPerPage) {

break;

}

}

那么,当前页中显示的记录,就是currentPageV中的记录。

 

 

 

第二个分页

在使用数据库的过程中,不可避免的需要使用到分页的功能,可是JDBC的规范对此却没有很好的解决。对于这个需求很多朋友都有自己的解决方案,比如使用Vector等集合类先保存取出的数据再分页。但这种方法的可用性很差,与JDBC本身的接口完全不同,对不同类型的字段的支持也不好。这里提供了一种与JDBC兼容性非常好的方案。 

JDBC和分页

  SunJDBC规范的制定,有时很让人哭笑不得,在JDBC1.0中,对于一个结果集(ResultSet)你甚至只能执行next()操作,而无法让其向后滚动,这就直接导致在只执行一次SQL查询的情况下无法获得结果集的大小。所以,如果你使用的是JDBC1.0的驱动,那么是几乎无法实现分页的。

  好在SunJDBC2规范中很好的弥补了这一个不足,增加了结果集的前后滚动操作,虽然仍然不能直接支持分页,但我们已经可以在这个基础上写出自己的可支持分页的ResultSet了。

 

 

和具体数据库相关的实现方法

  有一些数据库,如Mysql, Oracle等有自己的分页方法,比如Mysql可以使用limit子句,Oracle可以使用ROWNUM来限制结果集的大小和起始位置。这里以Mysql为例,其典型代码如下:

     // 计算总的记录条数

     String SQL = "SELECT Count(*) AS total " + this.QueryPart;

     rs = db.executeQuery(SQL);   

     if (rs.next())

     Total = rs.getInt(1);    

     // 设置当前页数和总页数

     TPages = (int)Math.ceil((double)this.Total/this.MaxLine);

     CPages = (int)Math.floor((double)Offset/this.MaxLine+1);

     // 根据条件判断,取出所需记录

     if (Total > 0) {

       SQL = Query + " LIMIT " + Offset + " , " + MaxLine;

       rs = db.executeQuery(SQL);      

     }   

     return rs;

   } 

  毫无疑问,这段代码在数据库是Mysql时将会是漂亮的,但是作为一个通用的类(事实上我后面要提供的就是一个通用类库中的一部分),需要适应不同的数据库,而基于这个类(库)的应用,也可能使用不同的数据库,所以,我们将不使用这种方法。

 

 

另一种繁琐的实现方法

  我看过一些人的做法(事实上包括我在内,一开始也是使用这种方法的),即不使用任何封装,在需要分页的地方,直接操作ResultSet滚到相应的位置,再读取相应数量的记录。其典型代码如下

0 0