本文介紹了對(duì)于UUID類(lèi)型列,在插入新行時(shí)返回H2數(shù)據(jù)庫(kù)中默認(rèn)生成的主鍵值的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
使用UUID數(shù)據(jù)type作為表的主鍵,并在插入新記錄時(shí)要求h2generate each UUID value by default,如何獲取新生成的UUID值?
我在Java應(yīng)用程序中使用純JDBC 4.x,如果這對(duì)解決方案有幫助的話(huà)。
I KnowSCOPE_IDENTITY
函數(shù)為在標(biāo)記為IDENTITY
的列上為自動(dòng)遞增的序列號(hào)生成的鍵返回long
。但我使用UUID而不是遞增數(shù)字作為我的主鍵列類(lèi)型。
推薦答案
Statement::getGeneratedKeys
如注釋和correct Answer by YCF_L所示,解決方案在于標(biāo)準(zhǔn)的JDBC:CallStatement::getGeneratedKeys
。這將生成該語(yǔ)句的上一次使用中默認(rèn)生成的鍵值的ResultSet
。它與PreparedStatement
配合使用,并將自動(dòng)生成的UUID值作為主鍵。
Statement.RETURN_GENERATED_KEYS
問(wèn)題是,在默認(rèn)情況下,而不是獲取的是生成的密鑰。您必須通過(guò)向Connection::prepareStatement
調(diào)用傳遞額外參數(shù)來(lái)激活此功能。額外的參數(shù)是int
,使用Statement
接口上定義的常量Statement.RETURN_GENERATED_KEYS
。在現(xiàn)代Java中,這很可能被定義為Enum
,但JDBC可以追溯到Java最早的日子,所以參數(shù)是一個(gè)簡(jiǎn)單的int
。
示例應(yīng)用程序
這是一個(gè)完整的示例應(yīng)用程序,在一個(gè)文件中。
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();
}
}
}
運(yùn)行時(shí)。
信息報(bào)告生成的密鑰。
生成密鑰:9c6ce984-151b-4e64-8334-d96e17be9525
INFO-報(bào)告表
person_
中的所有行。聯(lián)系人:9c6ce984-151b-4e64-8334-d96e17be9525|Jesse Johnson
如果您希望一次插入多行,而不是一行,請(qǐng)使用批處理。請(qǐng)參閱:Java: Insert multiple rows into MySQL with PreparedStatement。
如果您有多個(gè)自動(dòng)生成的列,而不僅僅是此處看到的單個(gè)UUID列,請(qǐng)參閱other Answer by YCF_L。
這篇關(guān)于對(duì)于UUID類(lèi)型列,在插入新行時(shí)返回H2數(shù)據(jù)庫(kù)中默認(rèn)生成的主鍵值的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,