?? datautil.java~2~
字號:
package com.corp.bisc.ebiz.util;
import java.util.*;
import java.sql.*;
import java.io.*;
/**
* DataObject類是用于派生來源于數據庫的數據對象。利用DataObject提供
* 的機制,派生的數據對象類可比較簡便的實現從數據庫中取出數值,將數據
* 對象的數值插入或更新到數據庫等功能。
*
* @author: Jim, Yang Jiang Ming
*/
public abstract class DataUtil {
boolean m_bDebug = false;
/** 該對象是否新創建,不存在于數據庫中 */
protected boolean m_bIsNewDataObject;
/** 若該數據對象是由另一對象用loadObjects()方法創建的,該域指明創建者 */
protected DataUtil m_objCreator;
/**
* 缺省構造函數,創建一個新的數據對象。
*/
public DataUtil() {
initNewObject();
m_bIsNewDataObject = true;
}
/**
* 構造函數,用strWhere限定的條件從數據庫中取出第一個符合條件
* 的結果,初始化數據對象。
* @param conn Connection 到數據庫的連接
* @param strWhere String 限定條件
*/
public DataUtil(Connection conn, String strWhere) throws Exception {
m_bIsNewDataObject = true;
initNewObject();
load(conn, strWhere);
}
/**
* 從數據庫中刪除符合指定條件的數據對象。
* @param conn Connection 到數據庫的連接
* @param strWhere String 刪除條件
*/
public void delete(Connection conn, String strWhere) throws Exception {
boolean bAutoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
try {
Statement stmt;
String str;
if (sqlDelete() == null)
throw new Exception("試圖在不支持刪除的數據對象上執行刪除操作。");
str = sqlDelete().toUpperCase();
if (str.indexOf(" WHERE ") != -1)
str = str + " AND " + strWhere;
else
str = str + " WHERE " + strWhere;
//刪除
stmt = conn.createStatement();
stmt.executeUpdate(str);
stmt.close();
conn.commit();
} catch (Exception e) {
throw e;
} finally {
conn.rollback();
conn.setAutoCommit(bAutoCommit);
}
}
public void dump(PrintStream out) {
}
/**
* 將字符串中的"'"替換為"''"。
* 處理后的字符串可以用于拼接成要執行的SQL語句。
*
* @param str String 要處理的字符串
*/
static public String fixDBString(String str) {
if (str == null)
return "";
if (str.indexOf('\'') == -1)
return str;
int strLen = str.length();
StringBuffer sb = new StringBuffer();
char c;
for (int i = 0; i < strLen; i++) {
c = str.charAt(i);
sb.append(c);
if (c == '\'') {
sb.append('\'');
}
}
return sb.toString();
}
/**
* 將字符串中的"'"替換為"''",將超出長度的字符截去。
* 處理后的字符串可以用于拼接成要執行的SQL語句。
*
* @param str String 要處理的字符串
* @param dbLen int 長度
*/
protected String fixDBString(String str, int dbLen) {
if (str == null) {
return "";
}
int strLen = str.length();
int len = 0;
StringBuffer sb = new StringBuffer();
char c;
for (int i = 0; i < strLen; i++) {
c = str.charAt(i);
if (Character.UnicodeBlock.of(c) == Character.UnicodeBlock.BASIC_LATIN) {
len++;
} else {
len += 2;
}
if (c == '\'') {
len++;
}
if (len > dbLen) {
break;
}
sb.append(c);
if (c == '\'') {
sb.append('\'');
}
}
return sb.toString();
}
/**
* 將超出長度的字符串截去。
* 處理后的字符串可以用來準備PreparedStatement。
*
* @param str String 要處理的字符串,可以為null
* @param dbLen int 長度
*/
protected String fixLen(String str, int dbLen) {
if (str == null)
return null;
int strLen = str.length();
if (strLen * 2 < dbLen)
return str;
int len = 0;
StringBuffer sb = new StringBuffer();
char c;
for (int i = 0; i < strLen; i++) {
c = str.charAt(i);
if (Character.UnicodeBlock.of(c) == Character.UnicodeBlock.BASIC_LATIN) {
len++;
} else {
len += 2;
}
if (len > dbLen) {
break;
}
sb.append(c);
}
return sb.toString();
}
/**
* 用于實現從數據庫中讀出數據對象。
* 從由sqlSelect(), sqlFrom(), sqlWhere()構造的SQL語句執行后產生的
* 結果集中取出數據。
* @param conn Connection 到數據庫的連接
* @param rs ResultSet 包含數據對象數據的結果集
*/
protected void getFromResultSet(Connection conn, ResultSet rs)
throws Exception {
}
protected void initNewObject() {
m_objCreator = null;
}
/**
* 判斷對象是否為新的數據對象(不是從數據庫中讀取出來的)
* @return boolean 如果對象不是從數據庫中讀取出來的,返回true,否則false
*/
public boolean isNewDataObject() {
return m_bIsNewDataObject;
}
/**
* 用strWhere限定的條件從數據庫中取出第一個符合條件的結果,填入當前對象
* @param conn Connection 到數據庫的連接
* @param strWhere String 限定條件
*/
public boolean load(Connection conn, String strWhere) throws Exception {
boolean bLoaded = true;
Statement stmt;
ResultSet rs;
if (sqlFrom() == null)
throw new Exception("試圖在不支持從數據庫讀取的數據對象上執行讀取操作。");
//構造Where子句
String strFullWhere = sqlWhere();
if (strWhere != null)
if (!strWhere.equals(""))
if (!strFullWhere.equals(""))
strFullWhere = strFullWhere + " and " + strWhere;
else
strFullWhere = strWhere;
//取出對象
stmt = conn.createStatement();
rs =
stmt.executeQuery(
"select "
+ sqlSelect()
+ " from "
+ sqlFrom()
+ (strFullWhere.equals("") ? "" : " where " + strFullWhere)
+ (sqlOrder().equals("") ? "" : " order by " + sqlOrder()));
if (rs.next())
getFromResultSet(conn, rs);
else {
bLoaded = false;
System.out.println("CAUTION: Try to load object but failed.");
System.out.println("Load from: " + sqlFrom());
System.out.println("By: " + strWhere);
}
rs.close();
stmt.close();
if (bLoaded) {
m_bIsNewDataObject = false;
objectLoaded(conn);
}
return bLoaded;
}
/**
* 從數據庫中讀出所有數據對象
* @param conn Connection 到數據庫的連接
* @return Vector 所有數據對象
*/
public Vector loadObjects(Connection conn) throws Exception {
return loadObjects(conn, "");
}
/**
* 從數據庫中讀出所有符合條件的數據對象
* @param conn Connection 到數據庫的連接
* @param String strWhere 查找條件
* @return Vector 符合條件的所有數據對象
*/
public Vector loadObjects(Connection conn, String strWhere) throws Exception {
Statement stmt;
ResultSet rs;
Vector vec = new Vector();
if (sqlFrom() == null)
throw new Exception("試圖在不支持從數據庫讀取的數據對象上執行讀取操作。");
//構造Where子句
String strFullWhere = sqlWhere();
if (strWhere != null)
if (!strWhere.equals(""))
if (!strFullWhere.equals(""))
strFullWhere = strFullWhere + " and " + strWhere;
else
strFullWhere = strWhere;
//{構造列表
stmt = conn.createStatement();
rs =
stmt.executeQuery(
"select "
+ sqlSelect()
+ " from "
+ sqlFrom()
+ (strFullWhere.equals("") ? "" : " where " + strFullWhere)
+ (sqlOrder().equals("") ? "" : " order by " + sqlOrder()));
//取出對象
DataUtil dataObject;
while (rs.next()) {
dataObject = (DataUtil) getClass().newInstance();
dataObject.objectCreated(this);
dataObject.getFromResultSet(conn, rs);
dataObject.m_bIsNewDataObject = false;
vec.add(dataObject);
}
rs.close();
stmt.close();
//}
for (int i = 0; i < vec.size(); i++)
((DataUtil) vec.elementAt(i)).objectLoaded(conn);
return vec;
}
/**
* 將數據庫中符合指定條件的數據對象分頁,取出位于指定頁面的數據對象。
* @param conn Connection 到數據庫的連接
* @param String strWhere 查找條件
* @param itemsPerPage 每頁包含對象數
* @param pageNo 要取出的頁面號,從1開始
*/
public DataObjectList loadObjects(
Connection conn,
String strWhere,
int itemsPerPage,
int pageNo)
throws Exception {
return loadObjects(conn, strWhere, itemsPerPage, pageNo, true);
}
/**
* 將數據庫中符合指定條件的數據對象分頁,取出位于指定頁面的數據對象。
* @param conn Connection 到數據庫的連接
* @param String strWhere 查找條件
* @param itemsPerPage 每頁包含對象數
* @param pageNo 要取出的頁面號,從1開始
* @param fixPageNo boolean 為true表示如果指定的pageNo不在目前分頁范圍內,
* 則將其調整到最接近的值;為false時不調整,返回的DataObjectList的列表為空。
*/
public DataObjectList loadObjects(
Connection conn,
String strWhere,
int itemsPerPage,
int pageNo,
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -