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

顺便宣传一下自己的网站: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了。这个方法就是简单,易于理解,适合于初学者。如果只是做一个简单的小东西,也不错~~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值