JAVA下的OracleHelper包

 

JAVA下的OracleHelper包

在.NET平臺下有個被使用的很廣泛的SqlHelper工具類,是微軟專門針對SQL Server數據庫所編寫的數據訪問層中間件,很好的對ADO.NET進行了封裝。在實際應用中,由於項目需求,當時我曾對SqlHelper進行了若干改造,變成了能夠針對Oracle數據庫進行訪問的OracleHelper工具類,這些都是在.NET平臺下使用C#實現的。

近期,項目存在向java平臺下移植的可能,爲了屏蔽JDBC底層API,使平移更加容易,FuWaer花了點時間對C#下OracleHelper進行了改造,改造的目的就是要基本保持原有函數接口形式和類型不變,爲此,OracleHelper包由如下類組成:

共10個文件,其中,ey.db.oracle包中的OracleHelper.java實現了對JDBC的封裝;ey.db.type包中的9個類是爲了保持OracleHelper類函數能夠和C#下的OracleHelper類函數的形式和參數類型一致而編寫的。

全部內容可以通過以下鏈接下載:(寫此文章時blog無法上傳文件,稍後上傳,如有需要也可留下您的email或自行編譯文末源代碼)

源文件:Java_OracleHelper_1_0_20071027_src.zip 

JAR包:Java_OracleHelper_1_0_20071027_jar.jar

本工具包的使用實例可以參見《java下OracleHelper包使用實例》

接下來,FuWaer分別對每個類的功能進行簡短的介紹,全部源碼在文章末尾貼出了,如無法下載源代碼,也可分別拷貝源碼自行編譯。

DataColumn、DataRow、DataTable

這三個類是仿照C#中的對應類實現的,實現了二維表格數據的對象化存儲,目的在於對JDBC的ResultSet實現封裝,後面將會介紹,OracleHelper.java中的ConvertResultSetToDataTable函數及實現了從ResultSet構造DataTable的過程。

DataSet

這也是仿照C#中的DataSet實現的,它由一個或多個DataTable實例構成,該類用於OracleHelper.java中的ExecuteDataSet函數的返回值類型。它將方便已經熟悉了C#下DataSet操作的程序人員,對數據庫查詢的結果集將不再以底層的ResultSet存在,應用了DataSet,開發人員可以完全不用知道ResultSet的存在。

OracleConnection

該類是仿照C#中OracleClient命名空間下的OracleConnection實現的。OracleConnection類是對java.sql.Connection的封裝,經過封裝,開發人員將不用瞭解java.sql.Connection的相關內容。該類具有如下主要結構:

構造函數 public OracleConnection(String connectionString)

其中,connectionString是用來構造java.sql.Connection實例所必需的信息,規定connectionString應該具有如下格式:url;user;password,例如:jdbc:oracle:thin:@localhost:1521:db;system;manager

 關閉數據庫連接函數 public void Close()

啓動事務函數 public OracleTransaction BeginTransaction()

OracleTransaction

該類是仿照C#中OracleClient命名空間下的OracleTransaction實現的。OracleTransaction用於事務控制,通常,該類的實例是通過OracleConnection.BeginTransaction()獲得的。該類具有如下主要結構:

構造函數 public OracleTransaction(OracleConnection connection)

事務提交函數 public void Commit()

事務回滾函數 public void Rollback()

CommandType

這是個枚舉類,用於指示訪問數據庫的是文本型sql語句還是存儲過程,該枚舉類定義如下:

public enum CommandType {
 Text,
 StoreProcedure
}

ParameterDirection

這是個枚舉類,用於指示傳遞給存儲過程的參數的方向性,該枚舉類定義如下:

public enum ParameterDirection {
 IN,
 OUT
}

Parameter

這個類用於存儲向oracle存儲過程所傳遞的參數。

OracleHelper

該類是訪問oracle數據庫的核心類,該類以靜態函數的形式提供了對數據庫訪問的功能函數,仿照C#下OracleHelper,提供了12個公有靜態函數和1個私有靜態函數,針對開發人員來說,主要是應用其中的12個公有靜態函數,關於這些函數,這裏就不再多說了,如果您對於C#下的SqlHelper或OracleHelper比較熟悉的話,您一定能很快地知道這些函數該如何使用,這裏FuWaer給個函數結構圖:

 好了,下面給出這10個文件的源代碼

文件1:OracleHelper.java

package ey.db.oracle;

import ey.db.type.*;
import java.sql.*;

/**
 * 
 * 
@author FuWaer
 * 
@version 1.0
 * 
 
*/
public class OracleHelper {

    
/**
     * 
     * 
@param connectionString
     * 
@param commandType
     * 
@param commandText
     * 
@return
     * 
@throws Exception
     
*/
    
public static DataSet ExecuteDataSet(String connectionString,
            CommandType commandType, String commandText) 
throws Exception {
        
return ExecuteDataSet(new OracleConnection(connectionString),
                commandType, commandText);
    }

    
/**
     * 
     * 
@param connectionString
     * 
@param commandType
     * 
@param commandText
     * 
@param parameters
     * 
@return
     * 
@throws Exception
     
*/
    
public static DataSet ExecuteDataSet(String connectionString,
            CommandType commandType, String commandText,
            Parameter... parameters) 
throws Exception {
        
return ExecuteDataSet(new OracleConnection(connectionString),
                commandType, commandText, parameters);
    }

    
/**
     * 
     * 
@param connection
     * 
@param commandType
     * 
@param commandText
     * 
@return
     * 
@throws Exception
     
*/
    
public static DataSet ExecuteDataSet(OracleConnection connection,
            CommandType commandType, String commandText) 
throws Exception {
        
return ExecuteDataSet(connection, commandType, commandText,
                
new Parameter[0]);
    }

    
/**
     * 
     * 
@param connection
     * 
@param commandType
     * 
@param commandText
     * 
@param parameters
     * 
@return
     * 
@throws Exception
     
*/
    
public static DataSet ExecuteDataSet(OracleConnection connection,
            CommandType commandType, String commandText,
            Parameter... parameters) 
throws Exception {

        DataSet ds 
= new DataSet();
        
if (commandType.equals(CommandType.Text)) {
            Statement s 
= connection.GetConnection().createStatement();
            ResultSet rs 
= s.executeQuery(commandText);
            ds.AddTable(ConvertResultSetToDataTable(rs));
        } 
else if (commandType.equals(CommandType.StoreProcedure)) {

            Parameter[] paras 
= parameters;

            String sql 
= "";
            
for (int i = 0; i < paras.length; i++) {
                sql 
= sql + "?,";
            }
            
if (sql.length() > 0) {
                sql 
= "(" + sql.substring(0, sql.length() - 1+ ")";
            }

            sql 
= "{ call " + commandText + sql + " }";
            CallableStatement proc 
= null;
            proc 
= connection.GetConnection().prepareCall(sql);
            
for (int i = 0; i < paras.length; i++) {
                Parameter p 
= paras[i];
                
if (p.parameterDirection == ParameterDirection.IN) {
                    proc.setObject(i 
+ 1, p.Value, p.parameterType);
                } 
else if (p.parameterDirection == ParameterDirection.OUT) {
                    proc.registerOutParameter(i 
+ 1, p.parameterType);
                }
            }
            
try {
                proc.execute();

                
for (int i = 0; i < paras.length; i++) {
                    Parameter p 
= paras[i];
                    
if (p.parameterDirection == ParameterDirection.OUT) {
                        p.Value 
= proc.getObject(i + 1);
                        
if (p.parameterType == oracle.jdbc.OracleTypes.CURSOR) {
                            ResultSet rs 
= (ResultSet) p.Value;
                            DataTable dt 
= ConvertResultSetToDataTable(rs);
                            DataSet _lds 
= new DataSet();
                            _lds.AddTable(dt);
                            p.Value 
= _lds;
                            ds.AddTable(dt);
                        }
                    }
                }
            } 
catch (Exception e) {
                
throw e;
            } 
finally {
                connection.Close();
            }

        } 
else {
            
throw new Exception("commandType is invalid");
        }

        
return ds;
    }

    
/**
     * 
     * 
@param transaction
     * 
@param commandType
     * 
@param commandText
     * 
@return
     * 
@throws Exception
     
*/
    
public static DataSet ExecuteDataSet(OracleTransaction transaction,
            CommandType commandType, String commandText) 
throws Exception {
        
return ExecuteDataSet(transaction.Connection, commandType, commandText);
    }

    
/**
     * 
     * 
@param transaction
     * 
@param commandType
     * 
@param commandText
     * 
@param parameters
     * 
@return
     * 
@throws Exception
     
*/
    
public static DataSet ExecuteDataSet(OracleTransaction transaction,
            CommandType commandType, String commandText,
            Parameter... parameters) 
throws Exception {
        
return ExecuteDataSet(transaction.Connection, commandType, commandText,
                parameters);
    }

    
/**
     * 
     * 
@param connectionString
     * 
@param commandType
     * 
@param commandText
     * 
@throws Exception
     
*/
    
public static void ExecuteNonQuery(String connectionString,
            CommandType commandType, String commandText) 
throws Exception {
        ExecuteNonQuery(
new OracleConnection(connectionString), commandType,
                commandText);
    }

    
/**
     * 
     * 
@param connectionString
     * 
@param commandType
     * 
@param commandText
     * 
@param parameters
     * 
@throws Exception
     
*/
    
public static void ExecuteNonQuery(String connectionString,
            CommandType commandType, String commandText,
            Parameter... parameters) 
throws Exception {
        ExecuteNonQuery(
new OracleConnection(connectionString), commandType,
                commandText, parameters);
    }

    
/**
     * 
     * 
@param connection
     * 
@param commandType
     * 
@param commandText
     * 
@throws Exception
     
*/
    
public static void ExecuteNonQuery(OracleConnection connection,
            CommandType commandType, String commandText) 
throws Exception {
        ExecuteNonQuery(connection, commandType, commandText, 
new Parameter[0]);
    }

    
/**
     * 
     * 
@param connection
     * 
@param commandType
     * 
@param commandText
     * 
@param parameters
     * 
@throws Exception
     
*/
    
public static void ExecuteNonQuery(OracleConnection connection,
            CommandType commandType, String commandText,
            Parameter... parameters) 
throws Exception {
        
        
if (commandType.equals(CommandType.Text)) {
            Statement s 
= connection.GetConnection().createStatement();
            s.execute(commandText);
            
        } 
else if (commandType.equals(CommandType.StoreProcedure)) {

            Parameter[] paras 
= parameters;

            String sql 
= "";
            
for (int i = 0; i < paras.length; i++) {
                sql 
= sql + "?,";
            }
            
if (sql.length() > 0) {
                sql 
= "(" + sql.substring(0, sql.length() - 1+ ")";
            }

            sql 
= "{ call " + commandText + sql + " }";
            CallableStatement proc 
= null;
            proc 
= connection.GetConnection().prepareCall(sql);
            
for (int i = 0; i < paras.length; i++) {
                Parameter p 
= paras[i];
                
if (p.parameterDirection == ParameterDirection.IN) {
                    proc.setObject(i 
+ 1, p.Value, p.parameterType);
                } 
else if (p.parameterDirection == ParameterDirection.OUT) {
                    proc.registerOutParameter(i 
+ 1, p.parameterType);
                }
            }
            
try {
                proc.execute();

                
for (int i = 0; i < paras.length; i++) {
                    Parameter p 
= paras[i];
                    
if (p.parameterDirection == ParameterDirection.OUT) {
                        p.Value 
= proc.getObject(i + 1);
                        
if (p.parameterType == oracle.jdbc.OracleTypes.CURSOR) {
                            ResultSet rs 
= (ResultSet) p.Value;
                            DataTable dt 
= ConvertResultSetToDataTable(rs);
                            DataSet _lds 
= new DataSet();
                            _lds.AddTable(dt);
                            p.Value 
= _lds;
                        }
                    }
                }
            } 
catch (Exception e) {
                
throw e;
            } 
finally {
                connection.Close();
            }

        } 
else {
            
throw new Exception("commandType is invalid");
        }    
    }

    
/**
     * 
     * 
@param transaction
     * 
@param commandType
     * 
@param commandText
     * 
@throws Exception
     
*/
    
public static void ExecuteNonQuery(OracleTransaction transaction,
            CommandType commandType, String commandText) 
throws Exception {
        ExecuteNonQuery(transaction.Connection, commandType, commandText);
    }

    
/**
     * 
     * 
@param transaction
     * 
@param commandType
     * 
@param commandText
     * 
@param parameters
     * 
@throws Exception
     
*/
    
public static void ExecuteNonQuery(OracleTransaction transaction,
            CommandType commandType, String commandText,
            Parameter... parameters) 
throws Exception {
        ExecuteNonQuery(transaction.Connection, commandType, commandText,
                parameters);
    }

    
/**
     * 將ResultSet裝換爲DataTable的函數
     * 
     * 
@param rs
     * 
@return
     * 
@throws Exception
     
*/
    
private static DataTable ConvertResultSetToDataTable(ResultSet rs)
            
throws Exception {
        ResultSetMetaData rsmd 
= rs.getMetaData();
        
int columnCount = rsmd.getColumnCount();

        DataTable dt 
= new DataTable();
        
while (rs.next()) {
            DataRow dr 
= new DataRow();
            
for (int i = 1; i <= columnCount; i++) {
                DataColumn dc 
= new DataColumn(rsmd.getColumnName(i), rs
                        .getObject(i));
                dr.AddColumn(dc);
            }
            dt.AddRow(dr);
        }
        
return dt;
    }
}

文件2:DataColumn.java

package ey.db.type;

/**
 * 
 * 
@author FuWaer
 * 
@version 1.0
 
*/
public class DataColumn extends Object {
    
public DataColumn()
    {
    }
    
public DataColumn(String n,Object v)
    {
        colName 
= n;
        colValue 
= v;
    }

    
public Object colValue = null;
    
public String colName = null;
    
}

文件3:DataRow.java

package ey.db.type;

/**
 * 
 * 
@author FuWaer
 * 
@version 1.0
 * 
 
*/
public class DataRow extends Object {
    
    
public DataRow(DataColumn[] cols)
    {
        Columns 
= cols.clone();
    }
    
public DataRow()
    {
        
    }
    
public void AddColumn(DataColumn col)
    {
        DataColumn[] _cols 
= Columns.clone();
        Columns 
= null;
        Columns 
= new DataColumn[_cols.length+1];
        
for(int i=0;i<_cols.length;i++)
        {
            Columns[i] 
= _cols[i];
        }
        Columns[Columns.length
-1= col;
        _cols 
= null;
    }
    
public DataColumn [] Columns = new DataColumn[0];
    
}

文件4:DataTable.java

package ey.db.type;

/**
 * 
 * 
@author FuWaer
 * 
@version 1.0
 
*/
public class DataTable {
    
    
public DataTable(DataRow[] rows)
    {
        Rows 
= rows.clone();
    }
    
    
public DataTable()
    {
        
    }
    
    
public void AddRow(DataRow row)
    {
        DataRow[] _rows 
= Rows.clone();
        
this.Rows = null;
        
this.Rows = new DataRow[_rows.length+1];
        
for(int i=0;i<_rows.length;i++)
        {
            
this.Rows[i] = _rows[i];
        }
        
this.Rows[this.Rows.length-1= row;
        _rows 
= null;
    }
    
    
public DataRow[] Rows = new DataRow[0];
}

文件5:DataSet.java

package ey.db.type;

/**
 * 
 * 
@author FuWaer
 * 
@version 1.0
 
*/
public class DataSet {
    
    
public DataSet(DataTable[] tables)
    {
        
this.Tables = tables.clone();
    }
    
    
public DataSet()
    {
        
    }
    
    
public void AddTable(DataTable table)
    {
        DataTable[] _tables 
= this.Tables.clone();
        
this.Tables = null;
        
this.Tables = new DataTable[_tables.length+1];
        
for(int i=0;i<_tables.length;i++)
        {
            
this.Tables[i] = _tables[i];
        }
        
this.Tables[this.Tables.length-1= table;
        _tables 
= null;
    }
    
    
public DataTable[] Tables = new DataTable[0];
}

文件6:OracleConnection.java

package ey.db.type;

import java.sql.*;

/**
 * 
 * 
@author FuWaer
 * 
@version 1.0
 
*/
public class OracleConnection {
    
    
/**
     * OracleConnection構造函數
     * 
@param String connectionString :
     *                 數據庫連接參數,格式:url;user;passworld.
     *                 例如:jdbc:oracle:thin:@localhost:1521:db;system;manager
     * 
@throws Exception
     
*/
    
public OracleConnection(String connectionString) throws Exception
    {
        Class.forName(
this._driver);
        String[] _sa 
= connectionString.split(";");
        
this.connection = DriverManager.getConnection(_sa[0], _sa[1], _sa[2]);
    }
    
    
/**
     * 關閉數據庫連接
     * 
@throws Exception
     
*/
    
public void Close() throws Exception
    {
        
if(!connection.isClosed()&&connection.getAutoCommit())
        {
            
this.connection.close();
        }
    }
    
    
/**
     * 從OracleConnection類創建事務處理的OracleTransaction類實例
     * 
@return
     * 
@throws Exception
     
*/
    
public OracleTransaction BeginTransaction() throws Exception
    {
        OracleTransaction tran 
= new OracleTransaction(this);
        
return tran;
    }
    
    
/**
     * 獲取java.sql.Connection對象
     * 
@return java.sql.Connection對象
     
*/
    
public Connection GetConnection()
    {
        
return this.connection;
    }
    
    
private String _driver = "oracle.jdbc.driver.OracleDriver";
    
private Connection connection = null;

}


文件7:OracleTransaction.java

package ey.db.type;

/**
 * 
 * 
@author FuWaer
 * 
@version 1.0
 
*/
public class OracleTransaction {

    
public OracleTransaction(OracleConnection connection) throws Exception
    {    
        
this.Connection = connection;
        
this.Connection.GetConnection().setAutoCommit(false);
    }
    
    
/**
     * 事務提交
     * 
@throws Exception
     
*/
    
public void Commit() throws Exception
    {
        
try
        {
            
this.Connection.GetConnection().commit();
        }
        
catch(Exception e)
        {
            
throw e;
        }
        
finally
        {
            
this.Connection.GetConnection().setAutoCommit(true);
            
this.Connection.Close();
        }
    }
    
    
/**
     * 事務回滾
     * 
@throws Exception
     
*/
    
public void Rollback() throws Exception
    {
        
try
        {
            
this.Connection.GetConnection().rollback();
        }
        
catch(Exception e)
        {
            
throw e;
        }
        
finally
        {
            
this.Connection.GetConnection().setAutoCommit(true);
            
this.Connection.Close();
        }
    }
    
    
public OracleConnection Connection = null;

}

文件8:CommandType.java

package ey.db.type;

/**
 * 命令類型枚舉類
 * 
@author FuWaer
 * 
@version 1.0
 
*/
public enum CommandType {
    Text,
    StoreProcedure
}

文件9:ParameterDirection.java

package ey.db.type;

/**
 * 
 * 
@author FuWaer
 * 
@version 1.0
 
*/
public enum ParameterDirection {
    IN,
    OUT
}

文件10:Parameter.java

package ey.db.type;

/**
 * 
 * 
@author FuWaer
 * 
@version 1.0
 
*/
public class Parameter {
    
public Parameter(
            String paraName,
            
int paraType,
            Object paraValue,
            ParameterDirection paraDirection
            )
    {
        
this.parameterName = paraName;
        
this.parameterType = paraType;
        
this.Value = paraValue;
        
this.parameterDirection = paraDirection;
    }
    
    
public Parameter(
            String paraName,
            
int paraType,
            Object paraValue
            )
    {
        
this.parameterName = paraName;
        
this.parameterType = paraType;
        
this.Value = paraValue;
        
this.parameterDirection = ParameterDirection.IN;
    }
    
    
public String parameterName = "";
    
public Object Value = null;
    
public ParameterDirection parameterDirection = null;
    
public int parameterType = 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章