我想知道是否有办法将ArrayList(或任何类型的List)绑定到PreparedStatement,最终将用于访问Oracle数据库。我找到了:

PreparedStatement IN子句替代方案?

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

有帮助吗?

解决方案

您无法将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')

那么,根据那个问题的答案来判断,特别是那个问题对我错误答案的评论,你不能。

参见 http:// java。 sun.com/j2se/1.3/docs/guide/jdbc/getstart/mapping.html#996857

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top