MyBatis で Auto Increment された ID を取得する

備忘録。

MyBatis で DB に INSERT した際に ID などの特定のカラムの値を取得する方法について。

MyBatis を使う場合、通常では INSERT や UPDATE は影響を与えた件数を返すことになる。しかし INSERT 時に ID を Auto Increment する場合、呼び出し側で生成された ID が欲しくなることがある。この場合、useGeneratedKeyskeyColumn というオプションを使う。

以下のテーブルを例に考えてみる

CREATE TABLE person (
  id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
  name VARCHAR(50) NOT NULL
);

このテーブルに name のみを指定して INSERT する。Mapper に渡すパラメータクラスは以下の通り

class Person {
  public int id;
  public String name;
}

MyBatis のアノテーションを使う場合、Mapper は以下のようになる。

interface PersonMapper {
  @Insert("INSERT INTO person (name) VALUES (#{name})")
  @Options(useGeneratedKeys=true, keyColumn="id")
    void insertVillage(Person person);
}

@Insert に加えて @Options を使って2つのオプションを与えているのがポイント。useGeneratedKeystrue の場合、パラメータとして渡されたオブジェクトの keyColumn に指定したフィールド(この場合は id)に INSERT したレコードの id が入る。(戻り値ではないことに注意)

参考: