はじめに
JDBCを利用して、JavaのコードからDBにレコードをインサートする際、Auto_Increment(オートインクリメント)される値を取得する方法を示す。
SELECT LAST_INSERT_ID()
によって、最後に採番された値を取得することができるが、返り値として取得したい場合に利用できる。
使用環境
- MySQL 8.0
- Java 8
前提事項
まず、以下のようなデータベース/テーブルを作成する。
- データベース名 : testdb
- テーブル名 : test
ここで、testテーブルにAuto_Incrementの設定を施した主キーであるidカラム
とChar型のnameカラム
を用意する。
テーブルを作成するSQLは以下のとおりである。
CREATE TABLE test(
id INT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
);
テーブルのカラム情報を確認すると(SHOW COLUMNS FROM テーブル名)、主キーのidカラムにAuto_Incrementが設定されている
ことがわかる。
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int | NO | PRI | NULL | auto_increment |
name | char | NO | NULL |
Auto_Increment_IDの取得方法
まず、Javaのソースを示す。
public class Test {
public static void main(String[] args) {
int autoIncrementKey = 0;
try {
// ドライバロード
Class.forName("com.mysql.jdbc.Driver");
// MySQL に接続
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/testdb?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC", "user", "password");
String sql = "insert into test(name) values (?)";
// ステートメント生成
// ここでRETURN_GENERATED_KEYSを設定する
PreparedStatement stmt = con.prepareStatement(sql, java.sql.Statement.RETURN_GENERATED_KEYS);
stmt.setString(1, "XXX");
stmt.executeUpdate();
// getGeneratedKeys()により、Auto_IncrementされたIDを取得する
ResultSet res = stmt.getGeneratedKeys();
if(res.next()){
autoIncrementKey = res.getInt(1);
}
System.out.println(autoIncrementKey);
res.close();
stmt.close();
con.close();
} catch (Exception e){
System.out.println(e);
}
}
}
PreparedStatementを生成する際、第2引数にjava.sql.Statement.RETURN_GENERATED_KEYS
を設定する。
そして、stmt.exceuteUpdate()でInsert文を実行後、stmt.getGeneratedKeys()
を実行することで、自動採番されたidを取得することができる。
おわりに
生のJavaやSQLを利用する機会は少ないが、備忘録として。