개요
- auto_increment 가 걸린 PK값을 insert 직후에 바로 사용하고 싶다면 어떻게 해야 할까?
useGeneratedKeys
<insert id="insertEx" useGeneratedKeys="true" keyColumn="USERID" keyProperty="userId">
insert into STUDENT (
NAME
, EMAIL
) values (
#{name}
, #{email}
)
</insert>
public Student {
int userId;
String name;
String email;
}
- useGeneratedKeys : insert나 update가 되면 자동 생성된 키를 가져올 수 있다. (default: false)
- keyColumn : DB에서 auto_increment가 설정된 Column
- keyProperty : 값이 return이 될 property 설정. 여러 개를 사용한다면 콤마로 구분
selectKey
<insert id="insertStudent">
<selectKey keyProperty="userId" resultType="String" order="AFTER">
select last_insert_id() // 마지막 생성된 Auto_Increment 값을 반환 해주는 구문
</selectKey>
insert into STUDENT (
NAME
, EMAIL
) values (
#{name}
, #{email}
)
</insert>
public Student {
int userId;
String name;
String email;
}
- MyBatis 3.2.6 버전부터는 multiple select key 가 지원
- keyProperty : 값이 return이 될 property 설정. 여러 개를 사용한다면 콤마로 구분
- resultType : 반환 된 결과 타입
- order : BEFORE 또는 AFTER를 사용 가능.
- BEFORE : 키를 먼저 조회하고, 그 값을 keyProperty에 설정한 뒤 insert 구문 실행
- AFTER : insert 구문을 실행한 뒤 selectKey 구문을 실행
Service
public void studentInsert(Student student) {
System.out.println("userId : " + student.getUserId()); // userId : null
DAO.insertStudent(student);
System.out.println("userId : " + student.getUserId()); // userId : 1
}
- student가 삽입된 후, student 객체에는 userId가 설정되어 있어 다른 곳에서 사용 가능하다.