繁体   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