簡體   English   中英

如何將 ArrayList 綁定到 Oracle 中的 PreparedStatement?

[英]How do I bind an ArrayList to a PreparedStatement in Oracle?

我想知道是否有辦法將 ArrayList(或任何類型的 List,就此而言)綁定到最終將用於訪問 Oracle 數據庫的 PreparedStatement。 我發現:

PreparedStatement IN 子句的替代方案?

這似乎與我的問題相似,但這個問題更具體:我想將 ArrayList 綁定到要在 Oracle 中使用的 PreparedStatement,如果可能的話,這是如何實現的?

您不能將 List 綁定到准備好的語句中的單個參數。

為列表中的每個元素生成帶有參數標記的 SQL,例如:

SELECT NAME FROM ITEM WHERE ID IN (?, ?, ?, ?)

即使您將為每個查詢生成一個新語句,我仍然建議使用PreparedStatement 如果您的列表包含String實例,您將獲得必要的轉義以防止 SQL 注入。

但即使它是一個安全類型,如Integer對象,一些驅動程序或中間件也可以緩存PreparedStatements ,並在請求相同的表單時返回緩存的實例。 當然,一些測試是必要的。 如果您的列表大小差異很大,您將有許多不同的語句,並且實現不佳的緩存可能無法處理這么多。

不能直接綁定。 有一種方法可以將數組作為參數傳遞。 我不知道你想在數據庫端用它做什么,所以這可能對你沒有幫助。

基本上,您必須在數據庫中創建一個嵌套表類型; 基於該類型構建一個 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')

好吧,從那個問題的答案來看,尤其是對我在那個問題中的錯誤答案的評論,你不能。

請參閱https://docs.oracle.com/javase/1.5.0/docs/guide/jdbc/getstart/mapping.html#996857

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM