Java で JDBC を使用してデータベース (私の場合は Microsoft SQL Server) のレコードを取得したいと考えていますINSERT
。同時に、挿入 ID を取得したいと考えています。JDBC API を使用してこれを実現するにはどうすればよいでしょうか。
ベストアンサー1
自動生成されたキーの場合は、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 の場合、同じトランザクション内で の直後に 句または (またはこれを行うための DB 固有の構文)をCallableStatement
使用RETURNING
して を呼び出すことで、最後に生成されたキーを取得できます。SELECT CURRVAL(sequencename)
INSERT
この答え。