我已經四處尋找了一個很好的例子,但是我還沒有碰到過。我想使用IBATIS框架將一個自定義的字符串數組從Java傳遞到Oracle並返回。有沒有人有一個很好的鏈接到一個例子?我從IBATIS調用存儲過程。在java中傳入並返回ibatis和oracle中的自定義數組對象
感謝
我已經四處尋找了一個很好的例子,但是我還沒有碰到過。我想使用IBATIS框架將一個自定義的字符串數組從Java傳遞到Oracle並返回。有沒有人有一個很好的鏈接到一個例子?我從IBATIS調用存儲過程。在java中傳入並返回ibatis和oracle中的自定義數組對象
感謝
你必須先從TypeHandler
定製的實例。我們寧願實施更簡單的TypeHandlerCallback
,但在這種情況下我們需要訪問底層Connection
。
public class ArrayTypeHandler implements TypeHandler {
public void setParameter(PreparedStatement ps, int i, Object param, String jdbcType)
throws SQLException {
if (param == null) {
ps.setNull(i, Types.ARRAY);
} else {
Connection conn = ps.getConnection();
Array loc = conn.createArrayOf("myArrayType", (Object[]) param);
ps.setArray(i, loc);
}
}
public Object getResult(CallableStatement statement, int i)
throws SQLException {
return statement.getArray(i).getArray();
}
...
}
然後,接線它在iBATIS的配置:
<?xml version="1.0"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="arrayTest">
<parameterMap id="storedprocParams" class="map">
<parameter property="result" mode="OUT" jdbcType="ARRAY" typeHandler="ArrayTypeHandler"/>
<parameter property="argument" mode="IN" jdbcType="ARRAY" typeHandler="ArrayTypeHandler"/>
</parameterMap>
<procedure id="storedproc" parameterMap="arrayTest.storedprocParams">
{? = call My_Array_Function(?)}
</procedure>
</sqlMap>
希望這有助於!
這是一個很好的起點 - 我必須從RAD獲得本地連接,添加描述我的自定義數組的描述符,並確保數據庫中的對象可以訪問。看看我在答案中做了什麼。 – Justin 2008-09-29 20:39:23
bsanders給了我一個很好的起點 - 這是我必須做的,使其在RAD環境(websphere 6.2)中工作。
public Object getResult(CallableStatement statement, int i) throws SQLException {
return statement.getArray(i).getArray(); //getting null pointer exception here
}
public void setParameter(PreparedStatement ps, int i, Object param, String jdbcType) throws SQLException {
if (param == null) {
ps.setNull(i, Types.ARRAY);
} else {
String[] a = (String[]) param;
//ARRAY aOracle = ARRAY.toARRAY(a, (OracleConnection)ps.getConnection());
//com.ibm.ws.rsadapter.jdbc.WSJdbcConnection
w = (com.ibm.ws.rsadapter.jdbc.WSJdbcConnection)ps.getConnection());
//com.ibm.ws.rsadapter.jdbc.WSJdbcObject x;
Connection nativeConnection = Connection)WSJdbcUtil.getNativeConnection((WSJdbcConnection)ps.getConnection());
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("F2_LIST", nativeConnection);
ARRAY dataArray = new ARRAY(descriptor, nativeConnection, a);
ps.setArray(i, dataArray);
}
}
注意我必須得到的nativeConnection,我必須做的描述符,等等。但是,雖然我可以將一些東西作爲字符串數組傳遞到數據庫中,但我一直無法弄清楚爲什麼我沒有收回任何東西。我OUT參數(的getResult(CallableStatement的statment,int i)以拋出一個空指針異常,即使我設置了參數,在數據庫中PLSQL。
--stored procedure to take a | delimited ids
PROCEDURE array_test (argument IN f2_list, result OUT f2_list)
AS
l_procname_v VARCHAR2 (50) := 'array_test';
l_param_list VARCHAR2 (2000)
:= l_procname_v || ' param_values: p_string: ';
p_status_n NUMBER;
p_message_v VARCHAR2 (2000);
ret_list f2_list := new f2_list();
l_count_v varchar2(200);
BEGIN
l_count_v := argument.COUNT;
for x in 1..argument.count
LOOP
pkg_az_common_util.az_debug (package_nm,
l_procname_v,
pkg_az_data_type_def.debug_num,
argument(x)
);
end loop;
pkg_az_common_util.az_debug (package_nm,
l_procname_v,
pkg_az_data_type_def.debug_num,
l_count_v
);
ret_list.extend();
ret_list(1) := 'W';
ret_list.extend();
ret_list(2) := 'X';
ret_list.extend();
ret_list(3) := 'Y';
ret_list.extend();
ret_list(4) := 'Z';
result := ret_list;
EXCEPTION
WHEN OTHERS
THEN
p_status_n := pkg_az_common_util.get_error_code;
p_message_v :=
TO_CHAR (p_status_n)
|| '|'
|| 'Oracle Internal Exception('
|| l_procname_v
|| ')'
|| '|'
|| TO_CHAR (SQLCODE)
|| '|'
|| SQLERRM
|| l_param_list;
standard_pkg.log_error (package_nm,
l_procname_v,
SQLCODE,
p_message_v
);
IF p_status_n = 1
THEN
RAISE;
END IF;
END array_test;
這裏是我如何訪問它:?
Map queryParamsTest = new HashMap();
String[] testArray = {"A", "B", "C"};
queryParamsTest.put("argument", testArray);
DaoUtils.executeQuery(super.getSqlMapClientTemplate(),
"arrayTest", queryParamsTest, queryParamsTest
.toString()); //just executes query
String[] resultArray = (String[])queryParamsTest.get("result");
for(int x = 0; x< resultArray.length; x++)
{
System.out.println("Result: " + resultArray[x]);
}
<parameterMap id="storedprocParams" class="map">
<parameter property="argument" mode="IN" jdbcType="ARRAY" typeHandler="ArrayTypeHandler"/>
<parameter property="result" mode="OUT" jdbcType="ARRAY" typeHandler="ArrayTypeHandler"/>
</parameterMap>
<procedure id="arrayTest" parameterMap="storedprocParams">
{call pkg_az_basic_dev.array_test(?, ?)}
</procedure>
任何想法
嘗試使用statement.getObject(i)
,然後轉換爲數組
那麼,在公司的傢伙發現了解決方案:你需要在你的類型控制器已經實現的getResult方法(S)和你的映射器
我注意到ARRAY類型在batis文檔中不受支持,我發現desinformative – tomasb 2011-10-20 10:15:50
什麼叫一*定製*字符串數組是指提供了額外的屬性jdbcTypeName = ORACLE_REAL_ARRAY_TYPE,這是莫名其妙地不同的String [] ? – 2008-09-26 00:36:26