【问题标题】:Java - Prepared statements and arraysJava - 准备好的语句和数组
【发布时间】:2009-08-29 05:58:58
【问题描述】:

如何在准备好的语句中处理数组?即,我想做一个查询,我得到的参数之一是我想在查询中使用的字符串数组(不要选择数组中包含字段的行)?

【问题讨论】:

标签: java sql database arrays prepared-statement


【解决方案1】:

一些 JDBC 驱动程序可能已经(在 JDBC 4 之前)包含专有扩展,这些扩展支持准备好的语句中的数组类型参数 - 您需要为此咨询 API。这意味着您必须在 SQL 中使用和操作类似数组的类型。

一种解决方法是使用临时表。这些是此类解决方案的元步骤:

  1. 开始事务(如果您在事务内部,这是自动的 方法 - EJB 或 Spring);
  2. 使用 JDBC 批量插入和准备好的语句创建并填充带有数组元素的临时表(临时表必须具有事务范围 - 这也是数据库专有的,但至少受 Oracle 支持);
  3. 构造所需的 SQL,其中包括与临时表的连接以使用数组值(可以是显式内部或外部 JOIN 或隐式连接,例如使用 EXISTS 等);
  4. 提交(或在应用程序异常时回滚)事务(这应该会破坏临时表;并发事务不应与临时表的同名冲突)。

示例:IN 表达式被替换为 JOIN 到临时表。

【讨论】:

  • IBM DB2 也可以做到这一点(具有事务范围的临时表)。我喜欢这个想法,但与简单地动态构建 IN 子句相比有什么好处?
  • 我无法证明这一点,但差异看起来像 O(log(n)) 与 O(n) 甚至更糟。对于较大的 n (n>5),创建和填充临时表的开销可以忽略不计。最初我们引入它是为了克服具有大量元素的 IN 运算符的性能问题。在添加了使使用透明和简洁的便捷方法之后,我们再也没有回头使用 IN(在元素数量变化的情况下)。
  • 只是快速性能评论:通过将 IN 替换为临时表,您实际上将 OR 运算符替换为内部联接。任何 DBA 都会同意由此带来的性能提升是巨大的。
【解决方案2】:

现在这可能对您没有帮助,但我了解到 JDBC 4 将支持 2003 版 SQL 中定义的数组类型。

【讨论】:

    【解决方案3】:

    这在很大程度上取决于所使用的 RDBMS。通常可以使用供应商的 jdbc 驱动程序扩展来完成此类功能。

    我发现的 2 个变体是(对于 Oracle): http://blogs.itemis.de/kloss/2009/03/05/arrays-preparedstatements-jdbc-and-oracle/

    http://www.angelfire.com/home/jasonvogel/java_jdbc_arrays.html

    试试看能不能帮到你。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多