読者です 読者をやめる 読者になる 読者になる

JDBCでINSERT後のシーケンス値を取得する

JDBC

idカラムを作って自動採番するような場合。
JPAでINSERTすればidが入った状態でEntityが取れるけど、JDBCの場合にどうするか。
何故にJDBCかというと、バイナリデータを放り込むのにJPAではなくJDBCを使いたいから。
PostgreSQLのbyteaカラムに手動でデータを入れる - edgegram

参考:java - PreparedStatement with Statement.RETURN_GENERATED_KEYS - Stack Overflow

Statement.RETURN_GENERATED_KEYSを引数に追加すればできる。
Stetement使う(人が今どきいるか?)場合はexecuteUpdate()の第2引数、PreparedStatementならprepareStatement()で指定する。

PreparedStatement ps = con.prepareStatement("INSERT INTO binary_tbl (value) VALUES (?)", Statement.RETURN_GENERATED_KEYS);
ps.setBinaryStream(1, fis, (int)file.length());
ps.executeUpdate();

その後、PreparedStatement(or Statement)からgetGeneratedKeys()すれば、自動採番されたシーケンス値の一覧がResultSetで返ってくる。

ResultSet rs = ps.getGeneratedKeys();
if (rs != null && rs.next()) {
    long id = rs.getLong(1);
}

Statement.RETURN_GENERATED_KEYSの代わりにカラム名のString配列を指定しておけばカラム名で取れる。

PreparedStatement ps = con.prepareStatement("INSERT INTO binary_tbl (value) VALUES (?)", new String[]{"id"});
・・・
long id = rs.getLong("id");

あまりしないと思うが、1テーブル複数シーケンスとかの場合はカラム指定の方が分かりやすい。

Java8 + PostgreSQL9.4