1. ホーム

[解決済み】JDBCで挿入IDを取得する方法は?

2022-04-28 16:24:37

質問

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

どのように解決するのですか?

自動生成されたキーであれば Statement#getGeneratedKeys() を使用します。これを呼び出すには 同じ Statement に使用されているものと同様に INSERT . 最初に 必要 を使用してステートメントを作成します。 Statement.RETURN_GENERATED_KEYS を使用して、JDBC ドライバにキーを返すように通知します。

以下は基本的な例です。

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の場合は CallableStatement を使用しています。 RETURNING 節または SELECT CURRVAL(sequencename) (またはそうするためのDB固有の構文)の直後で INSERT を同じトランザクションで実行し、最後に生成されたキーを取得します。以下も参照してください。 本解 .