MySQLでINSERT直後にauto_incrementカラムの値を取得する方法

最近、JavaMySQLに格闘している。

AUTO_NUMBERは、MySQLではauto_incrementと呼ばれる。auto_incrementのカラムが設定されたテーブルにINSERTするとそのレコードにインクリメントされた値を勝手に設定してくれる。だが、インクリメントされた値をアプリ側でオブジェクトに反映させる方法がどうもすっきりしない。基本は、INSERTした直後になんらかの方法で追加したばかりのレコードを再検索(SELECT)すればいいのだが、そもそもauto_incrementのカラムはPrimary keyに設定していたりするので、再検索も難しい場合がある。SELECT LAST_INSERT_ID()という方法があることが分かったので、メモしておく。

以下の感じでauto_incrementカラムのあるテーブルが定義されているとする。


create table DUMMY (
AUTO_NUM int auto_increment primary key,
NAME varchar(60) not null,
NAME_EN varchar(60),
DESCRIPTION varchar(500)
);

INSERT実行直後にSELECT LAST_INSERT_ID()を実行できるようなメソッドを用意する。


public int executeInsertWithAutoNum(Connection conn, String sql){
Statement stmt = null;
try {
stmt = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
return -1;
}
int result = 0;
try {
result = stmt.executeUpdate(sql);
ResultSet rs = stmt.executeQuery("SELECT LAST_INSERT_ID() AS LAST");
if (rs != null && rs.next()){
result = rs.getInt("LAST");
}
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
return -1;
}
return result;
}

Dummyオブジェクトを永続化した際にAUTO_NUMBERが反映されるようにしておく。


public void insert(Dummy p){
Connection conn = Xxx.getConnection(); // Xxxは任意
String sql = "INSERT INTO DUMMY (NAME,NAME_EN,DESCRIPTION) VALUES (";
sql += "'" + p.getName() + "',";
sql += "'" + p.getName_en() + "',";
sql += "'" + p.getDescription() + "')";
int autoNum = executeInsertWithAutoNum(conn, sql);
if (autoNum >= 0){
p.setAutoNum(autoNum);
}
}