一個繼承ArrayList類的ResultSet,一個繼承HashMap的Record
執行,把java.sql.ResultSet對象中的一列封裝成Record,加到ArrayList類型的ResultSet對象中
/**
* 執行 SQL 語句 (帶分頁功能)
* @param con 數據庫鏈接 Connection
* @param strSQL SQL語句
* @param nCommonPageSize 每頁最大記錄數
* @param nCurrentPage 當前頁號
* @param nTotalRecordCount 總記錄數, 如果等于 -1 或小于 0, 則由本函數相關方法得到此值
* @param obj 字段對象
* @return 如果執行的是查詢操作(select ...), 成功返回封裝成 RecordSet 的記錄集, 異常或失敗返回 null
* 如果執行的是寫操作, 成功返回空的 RecordSet(含操作的記錄個數), 異常或失敗返回 null
*/
public static RecordSet executeWithDefaultDriver(Connection con, String strSQL, int nCommonPageSize, int nCurrentPage, int nTotalRecordCount, Object[] obj)
{
PreparedStatement ps = null;
try
{
if(nCommonPageSize<=0)
throw new Exception("頁記錄數小于 0: (" + nCommonPageSize + " 條記錄/頁)");
if(nCurrentPage<=0)
throw new Exception("頁數小于 0: (第 " + nCurrentPage + " 頁)");
RecordSet set = new RecordSet();
strSQL = strSQL.trim();
ps = con.prepareStatement(strSQL, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
//設置字段值
setFieldValue(ps, obj, strSQL);
//判斷是否為查詢 SQL, 還是更新 SQL
if(strSQL.substring(0, strSQL.indexOf(" ")).equalsIgnoreCase("SELECT"))
{
ResultSet rs = ps.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int nColumn = rsmd.getColumnCount();
//移到結果集最后一條, 取得記錄總數
set.CURRENT_PAGE = nCurrentPage;
set.COMMON_PAGE_SIZE = nCommonPageSize;
if(nTotalRecordCount>=0)
set.TOTAL_RECORD_COUNT = nTotalRecordCount;
else
{
rs.last();
set.TOTAL_RECORD_COUNT = rs.getRow();
}
set.TOTAL_PAGE = (set.TOTAL_RECORD_COUNT + nCommonPageSize - 1) / nCommonPageSize;
if(nCurrentPage==set.TOTAL_PAGE && set.TOTAL_RECORD_COUNT%nCommonPageSize!=0)
set.CURRENT_PAGE_SIZE = set.TOTAL_RECORD_COUNT % nCommonPageSize;
else
set.CURRENT_PAGE_SIZE = nCommonPageSize;
if(set.TOTAL_RECORD_COUNT==0)
return set;
//定位到當前頁的頁首
rs.absolute(nCommonPageSize * (nCurrentPage - 1) + 1);
do
{
Record record = new Record();
for(int i=0;i<nColumn;i++)
{
String strField = rsmd.getColumnName(i+1).toUpperCase();
record.put(strField, rs.getObject(i+1));
}
set.add(record);
}
while(rs.getRow()<nCommonPageSize*nCurrentPage && rs.next());
rs.close();
}
else
set.TOTAL_RECORD_COUNT = ps.executeUpdate();
return set;
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
finally
{
try
{
if(ps!=null)
ps.close();
}
catch(Exception e){}
}
}
靜態方法直接調用,返回RS
調用
Record record =(Record)rs.get(i);
String code=record.getString("code");
取翻頁信息
<td valign="middle" align="right">每頁<%=rs.COMMON_PAGE_SIZE%>行
共<%=rs.TOTAL_RECORD_COUNT%>行
第<%=rs.CURRENT_PAGE%>頁
共<%=rs.TOTAL_PAGE%>頁
<BR>
<%if(rs.CURRENT_PAGE==1){ out.print(" 首頁 上一頁"); }else{ %>
<A HREF="javascript:gotoPage(1)">首頁</A>
<A HREF="javascript:gotoPage(<%=rs.CURRENT_PAGE-1%>)">上一頁</A>
<%}%>
<%if(rs.CURRENT_PAGE==rs.TOTAL_PAGE){ out.print("下一頁 尾頁"); }else{ %>
<A HREF="javascript:gotoPage(<%=rs.CURRENT_PAGE+1%>)">下一頁</A>
<A HREF="javascript:gotoPage(<%=rs.TOTAL_PAGE%>)">尾頁</A>
<%}%>
轉到第<SELECT name="jumpPage" onchange="Jumping()">
<% for(int i=1;i<=rs.TOTAL_PAGE;i++) {
if (i== rs.CURRENT_PAGE){
%>
<OPTION selected value=<%=i%>><%=i%></OPTION>
<%}else{%>
<OPTION value=<%=i%>><%=i%></OPTION>
<%}}%>
</SELECT>頁
</td>
//////////////////////////////////RecordSet.java///////////////////////////////////////
import java.util.*;
public class RecordSet
extends ArrayList {
// 記錄集信息
/** 總頁數 */
public int TOTAL_PAGE = -1;
/** 當前頁號 */
public int CURRENT_PAGE = -1;
/** 每頁最大記錄數 */
public int COMMON_PAGE_SIZE = -1;
/** 當前頁所含記錄數 */
public int CURRENT_PAGE_SIZE = -1;
/** 總記錄數 */
public int TOTAL_RECORD_COUNT = -1;
/** 當前指向的記錄位置 ( 初始位置在第一條記錄之前的空位上 ) */
private int currentRecordRow = 0;
/**
* 取得當前記錄的位置
* @return 記錄的位置
*/
public int getRow() {
return currentRecordRow;
}
/**
* 得到第n條記錄
* @param i 記錄位置 ( 取值范圍: 1--返回的記錄數 )
* @return 成功返回記錄, 異常或失敗返回 false
*/
public Record getRecord(int i) {
try {
return (Record)this.get(i - 1);
}
catch (Exception e) {
//Log.error(e);
return null;
}
}
/**
* 得到當前記錄
* @return 成功返回記錄, 異常或失敗返回 false
*/
public Record getRecord() {
if (isBeforeFirst()) {
//Log.warn("指針在初始位置, 請使用 first() 或 next() 方法將指針指向第一條記錄");
return null;
}
if (isAfterLast()) {
//Log.warn("指針在結束位置, 請使用 first() 方法將指針指向第一條記錄");
return null;
}
return getRecord(currentRecordRow);
}
/**
* 定位到絕對位置的記錄
* @param row 記錄位置 ( 0--返回的記錄數+1 )
* @return 成功返回 true, 異常或失敗返回 false
*/
public boolean absolute(int row) {
if (0 <= row && row <= this.size() + 1) {
currentRecordRow = row;
return true;
}
else {
return false;
}
}
/**
* 定位到首條記錄之前
*/
public void beforeFirst() {
currentRecordRow = 0;
}
/**
* 定位到末條記錄之后
*/
public void afterLast() {
currentRecordRow = this.size() + 1;
}
/**
* 定位到首條記錄
* @return 成功返回 true, 失敗返回 false
*/
public boolean first() {
if (this.isEmpty()) {
return false;
}
else {
currentRecordRow = 1;
return true;
}
}
/**
* 定位到末條記錄
* @return 成功返回 true, 失敗返回 false
*/
public boolean last() {
if (this.isEmpty()) {
return false;
}
else {
currentRecordRow = this.size();
return true;
}
}
/**
* 是否在首條記錄之前
* @return 是返回 true, 否返回 false
*/
public boolean isBeforeFirst() {
if (currentRecordRow == 0) {
return true;
}
else {
return false;
}
}
/**
* 是否在末條記錄之后
* @return 是返回 true, 否返回 false
*/
public boolean isAfterLast() {
if (currentRecordRow == this.size() + 1) {
return true;
}
else {
return false;
}
}
/**
* 是否位于首條記錄
* @return 是返回 true, 否返回 false
*/
public boolean isFirst() {
if (this.isEmpty()) {
return false;
}
else {
if (currentRecordRow == 1) {
return true;
}
else {
return false;
}
}
}
/**
* 是否位于末條記錄
* @return 是返回 true, 否返回 false
*/
public boolean isLast() {
if (this.isEmpty()) {
return false;
}
else {
if (currentRecordRow == this.size()) {
return true;
}
else {
return false;
}
}
}
/**
* 定位到前一條記錄
* @return 成功返回 true, 失敗返回 false
*/
public boolean previous() {
if (currentRecordRow < 1) {
return false;
}
else {
currentRecordRow--;
if (currentRecordRow < 1) {
return false;
}
else {
return true;
}
}
}
/**
* 定位到后一條記錄
* @return 成功返回 true, 失敗返回 false
*/
public boolean next() {
if (currentRecordRow > this.size()) {
return false;
}
else {
currentRecordRow++;
if (currentRecordRow > this.size()) {
return false;
}
else {
return true;
}
}
}
/**
* 得到數字(推薦使用這個方法得到數字, 可以避免各種數據庫數據類型不同而產生的問題)
* @param key 字段名
* @return 數字
*/
public double getNumber(String key) {
return Double.parseDouble(getString(key));
}
/**
* 得到 String 類型的值(用 getObject 方法取得, 并使用了 trim 方法去掉兩端空格, 當對象為空時返回空字符串)
* @param key 字段名
* @return String 類型的值
*/
public String getString(String key) {
Object obj = this.getRecord().getObject(key);
if (obj == null) {
return "";
}
else {
return obj.toString().trim();
}
}
/**
* 得到 Timestamp 類型的值
* @param key 字段名
* @return Timestamp 類型的值
*/
public java.sql.Timestamp getTimestamp(String key) {
return this.getRecord().getTimestamp(key);
}
/**
* 得到 Date 類型的值
* @param key 字段名
* @return Date 類型的值
*/
public java.sql.Date getDate(String key) {
return this.getRecord().getDate(key);
}
/**
* 得到 Time 類型的值
* @param key 字段名
* @return Time 類型的值
*/
public java.sql.Time getTime(String key) {
return this.getRecord().getTime(key);
}
/**
* 得到 BigDecimal 類型的值
* @param key 字段名
* @return BigDecimal 類型的值
*/
public java.math.BigDecimal getBigDecimal(String key) {
return this.getRecord().getBigDecimal(key);
}
/**
* 得到 long 類型的值
* @param key 字段名
* @return long 類型的值
*/
public long getLong(String key) {
return this.getRecord().getLong(key).longValue();
}
/**
* 得到 int 類型的值
* @param key 字段名
* @return int 類型的值
*/
public int getInt(String key) {
return this.getRecord().getInteger(key).intValue();
}
/**
* 得到 short 類型的值
* @param key 字段名
* @return short 類型的值
*/
public short getShort(String key) {
return this.getRecord().getShort(key).shortValue();
}
/**
* 得到 double 類型的值
* @param key 字段名
* @return double 類型的值
*/
public double getDouble(String key) {
return this.getRecord().getDouble(key).doubleValue();
}
/**
* 得到 float 類型的值
* @param key 字段名
* @return float 類型的值
*/
public float getFloat(String key) {
return this.getRecord().getFloat(key).floatValue();
}
/**
* 得到 boolean 類型的值
* @param key 字段名
* @return boolean 類型的值
*/
public boolean getBoolean(String key) {
return this.getRecord().getBoolean(key).booleanValue();
}
/**
* 得到 byte 類型的值
* @param key 字段名
* @return byte 類型的值
*/
public byte getByte(String key) {
return this.getRecord().getByte(key).byteValue();
}
/**
* 得到 byte[] 類型的值
* @param key 字段名
* @return byte[] 類型的值
*/
public byte[] getBytes(String key) {
return this.getRecord().getBytes(key);
}
/**
* 得到 Blob 類型的值
* @param key 字段名
* @return Blob 類型的值
*/
public java.sql.Blob getBlob(String key) {
return this.getRecord().getBlob(key);
}
/**
* 得到 Clob 類型的值
* @param key 字段名
* @return Clob 類型的值
*/
public java.sql.Clob getClob(String key) {
return this.getRecord().getClob(key);
}
/**
* 得到 Array 類型的值
* @param key 字段名
* @return Array 類型的值
*/
public java.sql.Array getArray(String key) {
return this.getRecord().getArray(key);
}
/**
* 得到 InputStream 類型的值
* @param key 字段名
* @return InputStream 類型的值
*/
public java.io.InputStream getBinaryStream(String key) {
return this.getRecord().getBinaryStream(key);
}
/**
* 得到 Object 類型的值
* 注意: 如果字段為 char 類型, 要注意返回的值尾部是否有多余的空格
* @param key 字段名
* @return Object 類型的值
*/
public Object getObject(String key) {
return this.getRecord().getObject(key);
}
/**
* 返回相鄰的頁號
* @param size 相鄰的頁數
* @return 成功返回所有相鄰的頁號集合, 失敗返回 null
*/
public int[] getNeighbouringPage(int size) {
try {
int left = (this.CURRENT_PAGE - 1 > size) ? size : this.CURRENT_PAGE - 1;
int right = (this.TOTAL_PAGE - this.CURRENT_PAGE > size) ? size :
this.TOTAL_PAGE - this.CURRENT_PAGE;
int begin = this.CURRENT_PAGE - left;
int[] num = new int[left + 1 + right];
for (int i = 0; i < num.length; i++) {
num[i] = begin + i;
}
return num;
}
catch (Exception e) {
//Log.error(e);
return null;
}
}
/**
* 與另一個記錄集合并
* @param rs 記錄集
*/
public void merge(RecordSet rs) {
try {
rs.beforeFirst();
while (rs.next()) {
this.add(rs.getRecord());
}
this.TOTAL_RECORD_COUNT += rs.TOTAL_RECORD_COUNT;
this.beforeFirst();
}
catch (Exception e) {
//Log.error(e);
}
}
}
//////////////////////////////////////////Record.java///////////////////////////////////////////
import java.util.*;
public class Record
extends HashMap {
/**
* 取得字段的值
* @param key 字段名
* @return 成功返回字段的取值, 異常或失敗返回 null
*/
public Object get(String key) {
if (key == null) {
return null;
}
else {
return super.get(key.toUpperCase());
}
}
/**
* 得到 String 類型的值
* @param key 字段名
* @return String 類型的值
*/
public java.lang.String getString(String key) {
Object obj = this.get(key);
return (java.lang.String) obj;
}
/**
* 得到 Timestamp 類型的值
* @param key 字段名
* @return Timestamp 類型的值
*/
public java.sql.Timestamp getTimestamp(String key) {
Object obj = this.get(key);
return (java.sql.Timestamp) obj;
}
/**
* 得到 Date 類型的值
* @param key 字段名
* @return Date 類型的值
*/
public java.sql.Date getDate(String key) {
Object obj = this.get(key);
return (java.sql.Date) obj;
}
/**
* 得到 Time 類型的值
* @param key 字段名
* @return Time 類型的值
*/
public java.sql.Time getTime(String key) {
Object obj = this.get(key);
return (java.sql.Time) obj;
}
/**
* 得到 BigDecimal 類型的值
* @param key 字段名
* @return BigDecimal 類型的值
*/
public java.math.BigDecimal getBigDecimal(String key) {
Object obj = this.get(key);
return (java.math.BigDecimal) obj;
}
/**
* 得到 Long 類型的值
* @param key 字段名
* @return Long 類型的值
*/
public java.lang.Long getLong(String key) {
Object obj = this.get(key);
return (java.lang.Long) obj;
}
/**
* 得到 Integer 類型的值
* @param key 字段名
* @return Integer 類型的值
*/
public java.lang.Integer getInteger(String key) {
Object obj = this.get(key);
return (java.lang.Integer) obj;
}
/**
* 得到 Short 類型的值
* @param key 字段名
* @return Short 類型的值
*/
public java.lang.Short getShort(String key) {
Object obj = this.get(key);
return (java.lang.Short) obj;
}
/**
* 得到 Double 類型的值
* @param key 字段名
* @return Double 類型的值
*/
public java.lang.Double getDouble(String key) {
Object obj = this.get(key);
return (java.lang.Double) obj;
}
/**
* 得到 Float 類型的值
* @param key 字段名
* @return Float 類型的值
*/
public java.lang.Float getFloat(String key) {
Object obj = this.get(key);
return (java.lang.Float) obj;
}
/**
* 得到 Boolean 類型的值
* @param key 字段名
* @return Boolean 類型的值
*/
public java.lang.Boolean getBoolean(String key) {
Object obj = this.get(key);
return (java.lang.Boolean) obj;
}
/**
* 得到 Byte 類型的值
* @param key 字段名
* @return Byte 類型的值
*/
public java.lang.Byte getByte(String key) {
Object obj = this.get(key);
return (java.lang.Byte) obj;
}
/**
* 得到 byte[] 類型的值
* @param key 字段名
* @return byte[] 類型的值
*/
public byte[] getBytes(String key) {
Object obj = this.get(key);
return (byte[]) obj;
}
/**
* 得到 Blob 類型的值
* @param key 字段名
* @return Blob 類型的值
*/
public java.sql.Blob getBlob(String key) {
Object obj = this.get(key);
return (java.sql.Blob) obj;
}
/**
* 得到 Clob 類型的值
* @param key 字段名
* @return Clob 類型的值
*/
public java.sql.Clob getClob(String key) {
Object obj = this.get(key);
return (java.sql.Clob) obj;
}
/**
* 得到 Array 類型的值
* @param key 字段名
* @return Array 類型的值
*/
public java.sql.Array getArray(String key) {
Object obj = this.get(key);
return (java.sql.Array) obj;
}
/**
* 得到 InputStream 類型的值
* @param key 字段名
* @return InputStream 類型的值
*/
public java.io.InputStream getBinaryStream(String key) {
Object obj = this.get(key);
return (java.io.InputStream) obj;
}
/**
* 得到 Object 類型的值
* @param key 字段名
* @return Object 類型的值
*/
public Object getObject(String key) {
return this.get(key);
}
}
posted on 2008-04-08 14:33
Ke 閱讀(1163)
評論(0) 編輯 收藏 所屬分類:
jdbc