JDBC で挿入 ID を取得するにはどうすればいいですか? 質問する

JDBC で挿入 ID を取得するにはどうすればいいですか? 質問する

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

ベストアンサー1

自動生成されたキーの場合は、Statement#getGeneratedKeys()Statementこれに使用します。で使用されているのと同じものを呼び出す必要がありますINSERT。まず、次の文を使用して文を作成する必要があります。Statement.RETURN_GENERATED_KEYSJDBC ドライバーにキーを返すように通知します。

基本的な例を以下に示します。

public void create(User user) throws SQLException {
    try (
        Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_INSERT,
                                      Statement.RETURN_GENERATED_KEYS);
    ) {
        statement.setString(1, user.getName());
        statement.setString(2, user.getPassword());
        statement.setString(3, user.getEmail());
        // ...

        int affectedRows = statement.executeUpdate();

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

        try (ResultSet generatedKeys = statement.getGeneratedKeys()) {
            if (generatedKeys.next()) {
                user.setId(generatedKeys.getLong(1));
            }
            else {
                throw new SQLException("Creating user failed, no ID obtained.");
            }
        }
    }
}

動作するかどうかは、JDBC ドライバーに依存することに注意してください。現在、最新バージョンのほとんどは動作しますが、私の記憶が正しければ、Oracle JDBC ドライバーではこの点がまだ多少問題になっています。MySQL と DB2 では、すでに長年サポートされています。PostgreSQL では、つい最近サポートを開始しました。MSSQL については、使用したことがないのでコメントできません。

Oracle の場合、同じトランザクション内で の直後に 句または (またはこれを行うための DB 固有の構文)をCallableStatement使用RETURNINGして を呼び出すことで、最後に生成されたキーを取得できます。SELECT CURRVAL(sequencename)INSERTこの答え

おすすめ記事