用“SELECT TOP”语句优化分页显示数据库记录的类

        前一阵写了篇“ 数据库记录分页显示的类 ”的文章,其中采用的是结果集指针定位的方法,但这个方法是需要每次都取出数据库中的所有记录,这对系统性能的浪费是巨大的。
       因此,今天乘着有空写一个新的方法来对上次的类做个优化,该方法每次只从数据库中取出当前须显示页的记录,这将大大的缩短读取记录的时间,从而提高系统的总体性能。
下面是该类的代码:
import  java.sql. * ;
import  java.util. * ;

public   class  GetPage  {
  
private int pageSize = 6//每一页显示的记录数
  private int pageCount = 1//总的页数
  private int currentPage = 1//当前显示的页
  
//"showVar" 值为"-1"表示显示最后页,为"-2"表示显示上一页,为"-3"表示显示下一页,否则显示当前页。
  public Vector<Vector> doGet(int showVar) {
    Vector
<Vector> all = new Vector<Vector> (); //当前页的记录集
    Statement stmt = null;
    ResultSet rs 
= null;
    Connection con 
= null;

    
try {
      Class.forName(
"com.microsoft.jdbc.sqlserver.SQLServerDriver"); //定义数据库驱动
      String url =
          
"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=lesson"//连接数据库"lesson"
      String user = "sa"//用户名
      String password = "123"//密码
      con = DriverManager.getConnection(url, user, password); //连接
      stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
                                 ResultSet.CONCUR_UPDATABLE);
      String sql 
= "SELECT COUNT(*) FROM test"//获取纪录总条数
      rs = stmt.executeQuery(sql);
      rs.next();
      
int allRows = rs.getInt(1);
      pageCount 
= (allRows % pageSize == 0? (allRows / pageSize) :
          (allRows 
/ pageSize + 1);
      
if (pageCount == 0{
        pageCount 
= 1;
      }

      
switch (showVar) {
        
case -1:
          currentPage 
= pageCount;
          
break;
        
case -2:
          currentPage 
= (currentPage > 1? (currentPage - 1) : 1;
          
break;
        
case -3:
          currentPage 
= (currentPage < pageCount) ? (currentPage + 1) :
              pageCount;
          
break;
        
default:
          
if (showVar > 0 && showVar <= pageCount) {
            currentPage 
= showVar;
          }

      }

      
//****************从数据库中读取当前页的数据***********
      if (currentPage == 1{
        sql 
= "SELECT TOP " + pageSize +
            
" * FROM test ORDER BY ID";
      }

      
else {
        sql 
= "SELECT TOP " + pageSize +
            
" * FROM test WHERE(ID >(SELECT MAX(id) FROM(SELECT TOP " +
            pageSize 
* (currentPage - 1+
            
" id FROM test ORDER BY id) AS T)) ORDER BY ID";
      }

      rs 
= stmt.executeQuery(sql);
      
//*************************************************
      
//****************获取当前页的数据*******************
       Vector<Integer> id = new Vector<Integer> ();
      Vector
<String> zhuti = new Vector<String> ();
      
for (int i = 0; i < pageSize && rs.next(); i++{
        id.add(rs.getInt(
"id"));
        zhuti.add(rs.getString(
"zhuti"));
      }

      all.add(id);
      all.add(zhuti);
      
//*************************************************

    }

    
catch (Exception ex) {
      ex.printStackTrace();
    }

    
finally {
      
if (rs != null{
        
try {
          rs.close();
        }

        
catch (Exception e) {}
      }

      
if (stmt != null{
        
try {
          stmt.close();
        }

        
catch (Exception e) {}
      }

      
if (con != null{
        
try {
          con.close();
        }

        
catch (Exception e) {}
      }

    }


    
return all;
  }


  
public int getPageCount() {
    
return pageCount;
  }


  
public int getCurrentPage() {
    
return currentPage;
  }

}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值