java sql 実行 - JDBCで挿入IDを取得する方法は?




5 Answers

  1. 生成された列の作成

    String generatedColumns[] = { "ID" };
    
  2. この遺伝子化されたColumnをステートメントに渡す

    PreparedStatement stmtInsert = conn.prepareStatement(insertSQL, generatedColumns);
    
  3. ResultSetオブジェクトを使用してステートメント上のGeneratedKeysをフェッチする

    ResultSet rs = stmtInsert.getGeneratedKeys();
    
    if (rs.next()) {
        long id = rs.getLong(1);
        System.out.println("Inserted ID -" + id); // display inserted record
    }
    
insert select delete

私はJavaでJDBCを使用してデータベース(私の場合はMicrosoft SQL Server)にレコードをINSERTしたいと思います。 同時に、私は挿入IDを取得したいと思います。 JDBC APIを使用してこれをどのように達成できますか?




Statement.RETURN_GENERATED_KEYSを使用している「サポートされていない機能」エラーによると、これを試してください:

    String[] returnId = { "BATCHID" };
    String sql = "INSERT INTO BATCH (BATCHNAME) VALUES ('aaaaaaa')";
    PreparedStatement statement = connection
            .prepareStatement(sql, returnId);
    int affectedRows = statement.executeUpdate();

    if (affectedRows == 0) {
        throw new SQLException("Creating user failed, no rows affected.");
    }

    try (ResultSet rs = statement.getGeneratedKeys()) {
        if (rs.next()) {
            System.out.println(rs.getInt(1));
        }
        rs.close();

    }

BRANCHIDは自動生成されたIDです




comment代わりに、私はポストに答えるだけです。

インタフェースjava.sql.PreparedStatement

  1. columnIndexes «columnIndexesとSQL文を受け入れるprepareStatement関数を使用できます。 Statement.RETURN_GENERATED_KEYS commentまたはStatement.NO_GENERATED_KEYS [2]は、columnIndexesで許可される定数フラグが1つ以上の '?' INパラメータプレースホルダ。

    SYNTAX«

    Connection.prepareStatement(String sql, int autoGeneratedKeys)
    Connection.prepareStatement(String sql, int[] columnIndexes)
    

    例:

    PreparedStatement pstmt = 
        conn.prepareStatement( insertSQL, Statement.RETURN_GENERATED_KEYS );
    
  1. columnNames « 'id', 'uniqueID', ...など'id', 'uniqueID', ... columnNamesを一覧表示し'id', 'uniqueID', ... ターゲット表に、戻されるべき自動生成キーが入っています。 SQLステートメントがINSERTステートメントでない場合、ドライバーはそれらを無視します。

    SYNTAX«

    Connection.prepareStatement(String sql, String[] columnNames)
    

    例:

    String columnNames[] = new String[] { "id" };
    PreparedStatement pstmt = conn.prepareStatement( insertSQL, columnNames );
    

完全な例:

public static void insertAutoIncrement_SQL(String UserName, String Language, String Message) {
    String DB_URL = "jdbc:mysql://localhost:3306/test", DB_User = "root", DB_Password = "";

    String insertSQL = "INSERT INTO `unicodeinfo`( `UserName`, `Language`, `Message`) VALUES (?,?,?)";
            //"INSERT INTO `unicodeinfo`(`id`, `UserName`, `Language`, `Message`) VALUES (?,?,?,?)";
    int primkey = 0 ;
    try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        Connection conn = DriverManager.getConnection(DB_URL, DB_User, DB_Password);

        String columnNames[] = new String[] { "id" };

        PreparedStatement pstmt = conn.prepareStatement( insertSQL, columnNames );
        pstmt.setString(1, UserName );
        pstmt.setString(2, Language );
        pstmt.setString(3, Message );

        if (pstmt.executeUpdate() > 0) {
            // Retrieves any auto-generated keys created as a result of executing this Statement object
            java.sql.ResultSet generatedKeys = pstmt.getGeneratedKeys();
            if ( generatedKeys.next() ) {
                primkey = generatedKeys.getInt(1);
            }
        }
        System.out.println("Record updated with id = "+primkey);
    } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }
}



それは通常のStatementのものでも使うことができます( PreparedStatementだけでなく)

Statement statement = conn.createStatement();
int updateCount = statement.executeUpdate("insert into x...)", Statement.RETURN_GENERATED_KEYS);
try (ResultSet generatedKeys = statement.getGeneratedKeys()) {
  if (generatedKeys.next()) {
    return generatedKeys.getLong(1);
  }
  else {
    throw new SQLException("Creating failed, no ID obtained.");
  }
}



Connection cn = DriverManager.getConnection("Host","user","pass");
Statement st = cn.createStatement("Ur Requet Sql");
int ret  = st.execute();



Related