我想知道是否有一种方法将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