我正在尝试使用JDBC插入多个表。因为它必须快速,我想使用PreparedStatement
和executeBatch
方法。表由外键关系组合。
第一个想法是使用getGeneratedKeys()
,但这会导致一些JDBC驱动程序失败。例如。的PostgreSQL。
第二个想法是使用SQL-currval(...) - 函数。但是必须为一个语句调用执行批处理而为另一个语句调用执行批处理使所有键都具有相同的值。所以这种方法也失败了。
JDBC不接受分号分隔插入。
我怎样才能做到这一点?
答案 0 :(得分:1)
您似乎主要使用PostgreSQL。可能很高兴知道,因为PostgreSQL JDBC驱动程序版本8.4-701 PreparedStatement#getGeneratedKeys()
完全正常。
您只需要按如下方式准备语句,使其返回键:
statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
因此,必要时升级您的驱动程序并确定准备语句的方式。这也适用于许多其他JDBC驱动程序。
一个完全不同的选择是完全删除普通的JDBC并进入一个抽象层并潜入“好'ol”Hibernate或现代JPA。它们提供了一种纯粹的面向对象的Java数据库实体处理方法,无需使用生成的密钥等。它全部透明地处理,它们支持非常广泛的数据库方言。
答案 1 :(得分:0)
如果代码必须快速运行,那么你应该尝试编写一个存储过程/函数,它将接受将插入表中的值数组。
这是一个example。
答案 2 :(得分:0)
好的,这是我自己的答案。
供应商无法正确实现所需的getGeneratedKeys()函数以及特定于数据库的回退选项。
如果您需要对未经移植的数据库进行回退,则会使代码变得非常难看。
这是我对Postgres 9.0的解决方法:
"SELECT nextval('public.\"table_column_seq\"') FROM generate_series(1,"+pollsize+")");
浪费了整整一天的血腥日子,然后我得到的只是一个丑陋的解决方案。 JDBC应检查应用程序启动,如果驱动程序确实符合其预期,否则抛出一些不可恢复的邪恶的YouVeGotaF ** ckedUpDriverException。