2011-03-02 55 views
3

我想使用JDBC插入到多个表。因为它要快,我想用PreparedStatementexecuteBatch方法。表格由外键关系组合。插入与jdbc的多个表

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

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

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

我该如何做到这一点?

回答

0

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

这是example

+0

谢谢。我的问题是,该系统是充满活力的,例如,可以添加新的表格和结构。然后必须在postgres-server中定义一个额外的功能(它应该在任何JDBC数据库上工作,而不仅仅是postgres)是非常有用的。有没有办法通过JDBC生成过程? Java-App必须是系统的中心 – 2011-03-02 16:55:54

0

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

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

如果您需要对未导入的数据库进行回退,使代码非常难看。

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

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

浪费了一整天的血腥日子,然后我得到的是一个丑陋的解决方案。 JDBC应该检查app-startup是否确实符合预期,否则会抛出一些不可恢复的恶意YouVeGotaF ** ckedUpDriverException。

1

您似乎主要使用PostgreSQL。可能很高兴知道,因为PostgreSQL JDBC驱动程序版本8.4-701PreparedStatement#getGeneratedKeys()功能完全正常。

你只需要如下使它返回键来准备语句:

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

因此,如果升级需要您的驱动程序和修复你如何准备语句的方式。这也适用于许多其他JDBC驱动程序。


一个完全不同的另一种方法是完全放弃平原JDBC和去一个抽象层并在“好“OL”休眠或现代潜水JPA。它们提供了一种纯粹的面向对象的Java数据库实体处理方法,无需使用生成的密钥等操作。它们都是透明地在封面下处理的,它们支持非常广泛的DB方言。

+0

感谢您的回复。你是说在8.4-801中的功能在9.0-801中被删除了吗?使用Statement.RETURN_GENERATED_KEYS在调用executeBatch()时会抛出一个Exeption,并说它不是显示结果,但会得到一些...这是否在8.4-701中起作用? – 2011-03-03 07:43:00