本文介紹了對于UUID類型列,在插入新行時返回H2數據庫中默認生成的主鍵值的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
使用UUID數據type作為表的主鍵,并在插入新記錄時要求h2generate each UUID value by default,如何獲取新生成的UUID值?
我在Java應用程序中使用純JDBC 4.x,如果這對解決方案有幫助的話。
I KnowSCOPE_IDENTITY
函數為在標記為IDENTITY
的列上為自動遞增的序列號生成的鍵返回long
。但我使用UUID而不是遞增數字作為我的主鍵列類型。
推薦答案
Statement::getGeneratedKeys
如注釋和correct Answer by YCF_L所示,解決方案在于標準的JDBC:CallStatement::getGeneratedKeys
。這將生成該語句的上一次使用中默認生成的鍵值的ResultSet
。它與PreparedStatement
配合使用,并將自動生成的UUID值作為主鍵。
Statement.RETURN_GENERATED_KEYS
問題是,在默認情況下,而不是獲取的是生成的密鑰。您必須通過向Connection::prepareStatement
調用傳遞額外參數來激活此功能。額外的參數是int
,使用Statement
接口上定義的常量Statement.RETURN_GENERATED_KEYS
。在現代Java中,這很可能被定義為Enum
,但JDBC可以追溯到Java最早的日子,所以參數是一個簡單的int
。
示例應用程序
這是一個完整的示例應用程序,在一個文件中。
package work.basil.example.h2.auto_uuid;
import java.sql.*;
import java.util.UUID;
public class App {
public static void main ( String[] args ) {
App app = new App();
app.doIt();
}
private void doIt ( ) {
try {
Class.forName( "org.h2.Driver" );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
}
try (
Connection conn = DriverManager.getConnection( "jdbc:h2:mem:auto_uuid_example_db;DB_CLOSE_DELAY=-1" ) ; // Set `DB_CLOSE_DELAY` to `-1` to keep in-memory database in existence after connection closes.
Statement stmt = conn.createStatement() ;
) {
String sql = "CREATE TABLE person_ (
" +
" pkey_ UUID NOT NULL DEFAULT RANDOM_UUID() PRIMARY KEY ,
" +
" name_ VARCHAR NOT NULL
" +
");";
stmt.execute( sql );
// Insert row.
sql = "INSERT INTO person_ ( name_ )
";
sql += "VALUES ( ? )
";
sql += ";";
try (
PreparedStatement pstmt = conn.prepareStatement( sql , Statement.RETURN_GENERATED_KEYS ) ;
) {
pstmt.setString( 1 , "Jesse Johnson" );
pstmt.executeUpdate();
ResultSet rs = pstmt.getGeneratedKeys();
System.out.println( "INFO - Reporting generated keys." );
while ( rs.next() ) {
UUID uuid = rs.getObject( 1 , UUID.class );
System.out.println( "generated keys: " + uuid );
}
}
// Dump all rows.
System.out.println( "INFO - Reporting all rows in table `person_`." );
sql = "SELECT * FROM person_";
try ( ResultSet rs = stmt.executeQuery( sql ) ; ) {
while ( rs.next() ) {
UUID pkey = rs.getObject( "pkey_" , UUID.class );
String name = rs.getString( "name_" );
System.out.println( "Person: " + pkey + " | " + name );
}
}
} catch ( SQLException e ) {
e.printStackTrace();
}
}
}
運行時。
信息報告生成的密鑰。
生成密鑰:9c6ce984-151b-4e64-8334-d96e17be9525
INFO-報告表
person_
中的所有行。聯系人:9c6ce984-151b-4e64-8334-d96e17be9525|Jesse Johnson
如果您希望一次插入多行,而不是一行,請使用批處理。請參閱:Java: Insert multiple rows into MySQL with PreparedStatement。
如果您有多個自動生成的列,而不僅僅是此處看到的單個UUID列,請參閱other Answer by YCF_L。
這篇關于對于UUID類型列,在插入新行時返回H2數據庫中默認生成的主鍵值的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,