我想知道是否有一種方法將ArrayList(或任何類型的List,就此而言)綁定到最終將用於訪問Oracle數據庫的PreparedStatement。我發現:如何將ArrayList綁定到Oracle中的PreparedStatement?
PreparedStatement IN clause alternatives?
這似乎類似於我的問題,但這個問題更具體:我想一個ArrayList綁定到一個PreparedStatement在Oracle中使用,如果可能的話,怎麼樣這是否完成?
我想知道是否有一種方法將ArrayList(或任何類型的List,就此而言)綁定到最終將用於訪問Oracle數據庫的PreparedStatement。我發現:如何將ArrayList綁定到Oracle中的PreparedStatement?
PreparedStatement IN clause alternatives?
這似乎類似於我的問題,但這個問題更具體:我想一個ArrayList綁定到一個PreparedStatement在Oracle中使用,如果可能的話,怎麼樣這是否完成?
你不能在一份聲明列表綁定到一個參數。
生成與參數標記列表中的每個元素,例如SQL:
SELECT NAME FROM ITEM WHERE ID IN (?, ?, ?, ?)
即使你會爲每一個查詢的新說法,我還是建議使用PreparedStatement
。如果您的列表包含String
實例,您將獲得必要的轉義以防止SQL注入。
但即使它是安全類型,如Integer
對象,某些驅動程序或中間件可以緩存PreparedStatements
,並且在請求相同表單時返回緩存實例。當然,有些測試是必要的。如果你的列表大小差異很大,你會得到很多不同的語句,而實施不佳的緩存可能沒有準備好處理這麼多。
那麼,從這個問題的答案來判斷,尤其是對那個問題中我錯誤回答的評論,你不能。
見http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/mapping.html#996857
你不能直接綁定它。有一種方法可以將數組作爲參數傳遞。我不知道你想在數據庫端做什麼,所以這可能對你沒有幫助。
基本上,你必須在數據庫中創建一個嵌套表類型;根據該類型構建一個Java對象,其中包含數組中的數據;並將其作爲參數傳遞。
如果創建的數據庫中的對象:
CREATE OR REPLACE TYPE my_nested_table IS TABLE OF VARCHAR2(20);
CREATE TABLE my_table (a my_nested_table) NESTED TABLE a STORE AS my_table_a;
然後你就可以編寫Java代碼是這樣的:
String[] insertvalues = { "a", "b", "c" };
PreparedStatement p = conn.prepareStatement("INSERT INTO my_table VALUES(?)");
ARRAY insertParameter = new ARRAY(a_desc, conn, insertvalues);
p.setArray(1, insertParameter);
p.execute();
Oracle中的結果是這樣的:
dev> select * from my_table;
A
--------------------------------------------------------------------------------
MY_NESTED_TABLE('a', 'b', 'c')
在什麼能力?你的聲明(帶有佔位符)是什麼樣的?我懷疑這是一個通用的解決方案,因爲1)List的長度會有所不同,2)您聲明中佔位符的數量可能不會。另外,並非所有的列表都是訂購的。 – 2008-11-19 20:38:49
Matt,所有實現了java.util.List的對象都提供了一個get(int)操作,用於檢索指定索引處的對象。它還提供了一個迭代器。這兩個都是非可選的:訂單可能很奇怪,但是存在訂單。所以所有的java.util.List實現*都是*排序的... – MetroidFan2002 2009-01-10 20:07:10
...並且在Java中,List通常引用java.util.List接口契約。 – MetroidFan2002 2009-01-10 20:07:40