JDBC 分頁 DAO 代碼

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector; 
 
public class Pager {
    /** Used database connection */
    Connection conn = null;
 
    public Pager() {
    }
    
    /**
     * 分頁功能, 返回當頁的數據(JDBC 2.0 實現).
     *  * @param currentPage
     *            當前頁面數(取值範圍: 從 1 開始有效, 0 自動改爲 1)
     * @param pageCount
     *            每頁顯示記錄數
     * 
          * @return a Vector - 數據列表
     */
  public Vector pageData(int currentPage, int pageCount) {
    Vector results = new Vector();
String tableName = "table_name";// 要處理的表格名
 
  ResultSet rs = null;
    String sql = "SELECT * FROM " + tableName;
     Statement stmt = null;
 
  try {
      // TODO: open connection
      // 生成可滾動的結果集表達式
      stmt = conn.createStatement(ResultSet.
                TYPE_SCROLL_SENSITIVE,
                ResultSet.CONCUR_READ_ONLY);
      
   rs = stmt.executeQuery(sql);
 
      int count = recordCount(); // 總記錄數
 
      int totalPage = (int) Math.ceil(1.0 * count / pageCount); // 總頁面數
 
      if (currentPage <= 0) {
    currentPage = 1;
   }
 
   // 超出頁碼範圍, 不返回數據
      if (currentPage > totalPage) {
    currentPage = totalPage;
    return results;
   }
 
      if ((currentPage - 1) * pageCount > 0) {
    // 移動結果集數據到當前頁
    rs.absolute((currentPage - 1) * pageCount);
   } // rs.absolute(0); 在 ODBC 下會導致如下異常:java.sql.SQLException: Cursor
      // position (0) is invalid
 
      int i = 0; // Readed pages
      while (rs.next() && i < pageCount) {
    i++;
        // TODO: Read each row and process to value object
        ValueObject bean = new ValueObject();
        // TODO: Read value to value object
    result.add(bean);
   } } catch (Exception exception) {
      System.out.println("Occur a error in " + getClass()
     + ".pageData() : " + exception.getMessage());
   //       exception.printStackTrace();
  } finally {
      closeJDBCResource(stmt);
      closeJDBCResource(rs);
      closeJDBCResource(conn);
  }
 
  return results;
 }    
 
 /**
  * 返回當前數據庫中記錄的總數.
  * 
  * @return int 記錄總數
  */
  public int recordCount() {
    int allCount = -1;
 
    String tableName = "table_name";// 要處理的表格名
    String sql = "SELECT COUNT(*) FROM " + tableName;
 
  ResultSet rs = null;
    Statement stmt = null;
  
  try {
      // TODO: open connection
      stmt = conn.createStatement();
   rs = stmt.executeQuery(sql); if (rs.next()) {
    allCount = rs.getInt(1);
   }
    } catch (Exception exception) {
   System.out
          .println("Occur a error in " + getClass()
                       + ".recordCount() : " + exception.getMessage());
  } finally {
      closeJDBCResource(stmt);
      closeJDBCResource(rs); closeJDBCResource(conn);
  }
 
  return allCount;
 }
 
 /**
          * Close a jdbc resource, such as ResultSet, Statement, Connection.... All
          * these objects must have a method signature is void close().
     * 
     * @param resource -
     *            jdbc resouce to close
     */
    public static void closeJDBCResource(Object resource) {
        try {
            Class clazz = resource.getClass();
            java.lang.reflect.Method method = clazz.getMethod("close", null);
            method.invoke(resource, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * Test page.
     * @param args
     */
        public static void main(String[] args) {
        // 分頁, 讀取第一頁數據, 共讀取 5個記錄
        Vector data = new Pager().pageData(1, 5);
        // TODO: process value object, 更改類名 for(int i = 0; results != null && i < data.size(); i++) {
            ValueObject bean = (ValueObject)data.get(i);
  }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章