2008-11-19 72 views
5

我想知道是否有一种方法将ArrayList(或任何类型的List,就此而言)绑定到最终将用于访问Oracle数据库的PreparedStatement。我发现:如何将ArrayList绑定到Oracle中的PreparedStatement?

PreparedStatement IN clause alternatives?

这似乎类似于我的问题,但这个问题更具体:我想一个ArrayList绑定到一个PreparedStatement在Oracle中使用,如果可能的话,怎么样这是否完成?

+0

在什么能力?你的声明(带有占位符)是什么样的?我怀疑这是一个通用的解决方案,因为1)List的长度会有所不同,2)您声明中占位符的数量可能不会。另外,并非所有的列表都是订购的。 – 2008-11-19 20:38:49

+0

Matt,所有实现了java.util.List的对象都提供了一个get(int)操作,用于检索指定索引处的对象。它还提供了一个迭代器。这两个都是非可选的:订单可能很奇怪,但是存在订单。所以所有的java.util.List实现*都是*排序的... – MetroidFan2002 2009-01-10 20:07:10

+0

...并且在Java中,List通常引用java.util.List接口契约。 – MetroidFan2002 2009-01-10 20:07:40

回答

5

你不能在一份声明列表绑定到一个参数。

生成与参数标记列表中的每个元素,例如SQL:

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

即使你会为每一个查询的新说法,我还是建议使用PreparedStatement。如果您的列表包含String实例,您将获得必要的转义以防止SQL注入。

但即使它是安全类型,如Integer对象,某些驱动程序或中间件可以缓存PreparedStatements,并且在请求相同表单时返回缓存实例。当然,有些测试是必要的。如果你的列表大小差异很大,你会得到很多不同的语句,而实施不佳的缓存可能没有准备好处理这么多。

3

你不能直接绑定它。有一种方法可以将数组作为参数传递。我不知道你想在数据库端做什么,所以这可能对你没有帮助。

基本上,你必须在数据库中创建一个嵌套表类型;根据该类型构建一个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') 
相关问题