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();
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);
}
}
}
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);
}
}
}