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>
태그에useGeneratedKeys
과keyProperty
를 지정한다.useGeneratedKeys
는true
를 지정한다.keyProperty
에 키 값을 설정하는 Java 측의 필드(속성) 이름을 지정한다.
- 그러면 INSERT시에 데이터베이스에서 생성된 ID가 자동으로 Java의 인스턴스에
set
설정된다.
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가 실행되게 된다.
최종 수정 : 2021-08-26