簡體   English   中英

在Java中插入SQL后訪問自動增量標識字段

[英]Access to auto increment identity field after SQL insert in Java

關於如何通過java.sql.Statement.executeUpdate調用分配給新創建的記錄的自動遞增標識字段的任何建議?

我知道如何在SQL中為幾個數據庫平台執行此操作,但是想知道java.sql存在哪些數據庫獨立接口來執行此操作,以及人們在跨數據庫平台上使用此體驗的任何輸入。

以下snibblet代碼應該做ya':

PreparedStatement stmt = conn.prepareStatement(sql, 
                                 Statement.RETURN_GENERATED_KEYS);
// ...

ResultSet res = stmt.getGeneratedKeys();
while (res.next())
    System.out.println("Generated key: " + res.getInt(1));

已知這適用於以下數據庫

  • 德比
  • MySQL的
  • SQL Server

對於不起作用的數據庫(HSQLDB,Oracle,PostgreSQL等),您需要使用特定於數據庫的技巧。 例如,在PostgreSQL上,您將調用SELECT NEXTVAL(...)來查詢相關序列。

請注意, executeUpdate(...)的參數是類似的。

ResultSet keys = statement.getGeneratedKeys();

稍后,只需迭代ResultSet。

我總是不得不在插入后使用查詢進行第二次調用。

您可以使用像hibernate這樣的ORM。 我認為它會為你做這些事情。

@ ScArcher2:我同意,Hibernate需要再次調用才能獲得新生成的標識,除非使用了高級生成器策略(sequence,hilo ...)

@ ScArcher2

第二次通話非常危險。 INSERT和選擇生成的自動生成的密鑰的過程必須是原子的,否則您可能會在密鑰選擇上收到不一致的結果。 考慮兩個異步INSERT ,它們在有機會選擇生成的密鑰之前完成。 哪個進程獲取哪個鍵列表? 大多數跨數據庫ORM都必須執行諸如進程內線程鎖定之類的煩人事情,以保持結果的確定性。 不是你想要手工完成的事情,特別是如果你使用的數據庫支持原子生成的密鑰檢索(HSQLDB是我所知道的唯一不支持的數據庫)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM