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