您的位置:首页 > 编程语言 > Java开发

JAVA实现关系数据库的翻页 by masse@CSDN:

2007-09-04 08:39 447 查看
顺便宣传一下自己的网站:http://www.jopener.com
对应的中文版:http://www.jopener.cn

这个方法没有什么特别的,其实也算不上原创。也是从同事那里学来的。为了方便初学者了解原理,代码中我没有使用任 何框架。代码可以适用于mysql,oracle,sqlserver,db2等等主流关系数据库。

以下代码是我从自己以前写的程序中抽取出来的核心,只能表述思路,如要使用,可能还需要很多调整。

(1) 数据库表sys_User定义如下:
ID Name Email Desc …
1 masse jopener@gmail.com 当午 …
其中,ID为整型,其它均为字符串。

(2) User类,请自行为每个方法添加getter和setter方法。为了表述方便,我写了User(ResultSet)这个构造函数。
public class User {
public User(ResultSet rs) {
id = rs.getInt("ID");
name = rs.getString("Name");
email = rs.getString("Email");
desc = rs.getString("Desc");
}
private int id;
private String name;
private String email;
private String desc;
}

(3) UserDao类,用于数据库读取,我这里仅仅给出了最核心部分。其中对于start,count等的有效性参数,请自行判断;sql语句如果有查询的filter,或者order等语句,也可根据情况自行调整。我只给出程序框架。

// 取出从start开始的count条记录。如,start为1,count为20,则取出数据库前20条记录
public class UserDao {

public List getUsers(Connection conn, int start, int count) throws Exception {
PreparedStatement pStmt = null;
ResultSet rs = null;
List result = new ArrayList();
try {
String sql = "SELECT * FROM sys_User";
pStmt = conn.preparedStatement(sql);
rs = pStmt.executeQuery();
if (rs.absolute(startRow)) {
result.add(new User(rs));
for (int rowIndex = 0; rowIndex < rowCount - 1; rowIndex++) {
if (!rs.next()) {
break;
}
result.add(new User(rs));
}
}
} catch (Exception e) {
throw e; // process exception here
} finally {
// close rs & pStmt here
}
return result;
}
}

(4) JSP页面的实现。基本的思路就是,根据当前页数,计算出需要的start即可。如指定每页count条,当前在第n页,那么start=(n-1) *count+1。然后作为参数,即可得到翻页结果集。具体的实现可以用传统的翻页,也可用ajax。这里灵活性很大,就不再赘述了。

优势:
(1)没有使用任何框架,适合初学者,也适合对某些成型系统进行升级修改。同时扩展性很强。
(2)使用几乎所有的关系数据库,因为没有使用任何特殊的sql语法。比如top ,limit,rownum等等,sql也可以根据情况修改,实现任何查询的翻页。

缺陷:
(1)性能:只适用于简单应用,且数据不多的情况下。尽管我自己测试过50万。

关于性能的优化步骤(可选):
(1) 抽象接口Dao,这里可以添加所有需要的接口,下面仅仅给例子
public interface UserDao{
public List getUsers(int start ,int count)throws Exception;
public List getUsers(String filter,int start ,int count)throws Exception;
public List getUsers(String filter,int start ,int count,String[] sortNames,int[] sortTypes)throws Exception;
}
(2)实现类根据各种数据库的特性做翻页优化
sqlserver有人说用top,但是用top的效率很低,尤其是在要排序的情况下分页。
mysql用limit
oracle用rownum

不过再优化就不如hibernate之类的persistence了。这个方法就是简单,易于理解,适合于初学者。如果只是做一个简单的小东西,也不错~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: