如何将ArrayList绑定到Oracle中的PreparedStatement?

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