【问题标题】:Insert into multiple table with jdbc使用 jdbc 插入多个表
【发布时间】:2011-07-07 10:21:00
【问题描述】:

我正在尝试使用 JDBC 插入多个表。因为它必须要快,所以我想使用PreparedStatement 和executeBatch 方法。表由外键关系组合。

  • 第一个想法是使用getGeneratedKeys(),但某些 JDBC 驱动程序会失败。例如。 PostgreSQL。

  • 第二个想法是使用 SQL-currval(...) 函数。但是必须为一个语句调用执行批处理,而另一个语句使所有键都具有相同的值。所以这个方法也失败了。

  • JDBC 不接受以分号分隔的插入。

我怎样才能做到这一点?

【问题讨论】:

    标签: database jdbc insert multiple-tables


    【解决方案1】:

    您似乎主要使用 PostgreSQL。很高兴知道,由于 PostgreSQL JDBC 驱动程序版本 8.4-701 PreparedStatement#getGeneratedKeys() 功能齐全。

    你只需要准备如下语句就可以让它返回key:

    statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
    

    因此,如有必要,请升级您的驱动程序并修复您准备语句的方式。顺便说一句,这也适用于许多其他 JDBC 驱动程序。


    一个完全不同的替代方案是完全放弃普通的 JDBC 并向上一个抽象层并潜入“好”的 Hibernate 或现代 JPA。他们提供了一种纯面向对象的 Java 数据库实体处理方法,无需摆弄生成的键等。这一切都在幕后透明地处理,它们支持非常广泛的 DB 方言。

    【讨论】:

    • 感谢您的回复。您是说 8.4-701 中的功能在 9.0-801 中被删除了吗?使用 Statement.RETURN_GENERATED_KEYS 会在调用 executeBatch() 时抛出 Exeption,说它不期望结果但正在获得一些结果……这在 8.4-701 中有效吗?
    【解决方案2】:

    好的,这是我自己的答案。

    只要供应商无法正确实现您需要的 getGeneratedKeys() 函数和特定于数据库的后备选项。

    如果您需要对未移植的数据库进行后备,会使代码非常难看。

    这是我对 Postgres 9.0 的解决方法:

    • 首先生成大量密钥 "SELECT nextval('public.\"table_column_seq\"') FROM generate_series(1,"+pollsize+")");
    • 然后在所有准备好的批处理语句中分发这些密钥。

    为此浪费了一整天的时间,然后我得到的只是一个丑陋的解决方案。 JDBC 应该在应用程序启动时检查驱动程序是否真的符合其预期,否则会抛出一些不可恢复的恶意 YouVeGotaF**ckedUpDriverException。

    【讨论】:

      【解决方案3】:

      如果代码必须快速运行,那么您应该尝试编写一个存储过程/函数,它将接受将插入表中的值数组。

      这是example。

      【讨论】:

      • 谢谢。我的问题是,系统是动态的,例如可以添加新的表格和结构。然后必须在 postgres-server 中定义一个额外的功能(它应该适用于任何 JDBC 数据库,而不仅仅是 postgres)是很多工作。有没有办法通过 JDBC 生成过程? Java-App 必须是系统的中心
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 2012-04-15
      • 2014-03-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 2011-05-21
      相关资源
      最近更新 更多