MyBatis | 登録 INSERT | 自動生成されたキー値を取得する

ソースコード

sample_mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sample.mybatis">

  <insert id="insertTest" useGeneratedKeys="true" keyProperty="id">
    insert into test_table (
        value
    ) values (
        #{value}
    )
  </insert>

</mapper>

Main.java

package sample.mybatis;

import java.io.InputStream;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Main {

    public static void main(String[] args) throws Exception {
        try (InputStream in = Main.class.getResourceAsStream("/mybatis-config.xml")) {
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

            try (SqlSession session = factory.openSession()) {
                TestTable table = new TestTable("piyo");

                session.insert("sample.mybatis.insertTest", table);
                session.commit();

                System.out.println(table);
            }
        }
    }
}

実行結果

[DEBUG] s.m.insertTest  - ==>  Preparing: insert into test_table ( value ) values ( ? ) 
[DEBUG] s.m.insertTest  - ==> Parameters: fuga(String)
[DEBUG] s.m.insertTest  - <==    Updates: 1
TestTable [id=7, value=piyo]

test_table

id value
7 piyo

説明

  • <insert>タグにuseGeneratedKeyskeyPropertyを指定する。
    • useGeneratedKeysにはtrueを指定する。
    • keyPropertyにはキー値を設定するJava側のフィールド(プロパティ)名を指定する。
  • すると、INSERT時にデータベースで生成されたIDが自動的にJavaのインスタンスへ設定される。

Oracleシーケンスオブジェクトの場合

IDをシーケンスオブジェクトから取得する場合は、次のようにする。

sample_mapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sample.mybatis">

  <insert id="insertTest">
    <selectKey keyProperty="id" resultType="_int" order="BEFORE">
      select test_table_seq.nextval
        from dual
    </selectKey>
    insert into test_table (
        id
        ,value
    ) values (
        #{id}
        ,#{value}
    )
  </insert>
</mapper>

実行結果

[DEBUG] s.m.insertTest!selectKey - ==>  Preparing: select test_table_seq.nextval from dual 
[DEBUG] s.m.insertTest!selectKey - ==> Parameters: 
[DEBUG] s.m.insertTest!selectKey - <==      Total: 1
[DEBUG] s.m.insertTest  - ==>  Preparing: insert into test_table ( id ,value ) values ( ? ,? ) 
[DEBUG] s.m.insertTest  - ==> Parameters: 11(Integer), aaa(String)
[DEBUG] s.m.insertTest  - <==    Updates: 1
TestTable [id=11, value=aaa]

確認

SQL> select * from test_table;

        ID VALUE
---------- -----
        11 aaa

説明

  • <insert>タグの中に<selectKey>タグを宣言する。
  • keyProperty属性で、生成されたIDを設定するJavaフィールド(プロパティ)名を指定する。
  • order属性にBEFOREを設定すると、先に値を取得してからINSERTが実行される。