日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文介紹了對于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數據庫中默認生成的主鍵值的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,

分享到:
標簽:主鍵 插入 數據庫中 生成 行時 返回 默認
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定