[ mybatis ] insert/update 쿼리 실행 후 값 가져오기(useGeneratedKeys, keyProperty, SelectKey)
insert/update 등을 실행하고서 결과를 확인해야 하는 상황이 생깁니다.
다음은 insert 되는 Auto Increment 값(mysql 등)이나 sequence 값(oracle 등)을 조회하는 방법입니다.
▷ useGeneratedKeys, keyProperty 옵션
사용하는 데이터베이스가 Mysql과 같이 자동생성 키를 지원한다면 useGeneratedKeys, keyProperty 옵션을 통해 insert 된 데이터의 key 값을 리턴 받을 수 있습니다. 리턴 받은 값은 보낸 VO에 저장됩니다.
- useGeneratedKeys : (insert, update에만 적용) 자동생성 키를 받을때 true로 설정한다. (default: false)
- keyProperty : 리턴 될 key property 설정.
여러개를 사용한다면 ,(콤마)를 구분자로 나열한다. 이 때, resultType은 모델 객체 혹은 HashMap 형식이어야 합니다.
만약 ON DUPLICATE KEY UPDATE를 사용한다면 update된 데이터의 key 값을 조회할 수 있습니다.
◎ Oracle일 경우
*Oracle이 아니면 PK를 자동증가 키로 설정하거나 selectKey 태그를 사용해야합니다.
[xml]
<insert id="insertEmp" useGeneratedKeys="true" keyProperty="seq" parameterType="emp.vo.empVO">
INSERT INTO emp ( name, email )
VALUES ( #{name}, #{email} )
</insert>
<insert id="upsertEmp" useGeneratedKeys="true" keyProperty="seq" parameterType="emp.vo.empVO">
INSERT INTO emp ( name, email )
VALUES ( #{name}, #{email}
) ON DUPLICATE KEY
UPDATE email = VALUES(email)
</insert>
[java]
EmpVO emp1 = new EmpVO();
emp1.setName('문시리');
emp1.setEmail('moonsiri@tistory.com');
empDAO.insertEmp(emp1); // insert
System.out.println(emp1.getSeq()); // seq = 1
EmpVO emp2 = new EmpVO();
emp2.setName('홍길동');
emp2.setEmail('gdhong@tistory.com');
empDAO.insertEmp(emp2); // insert
System.out.println(emp2.getSeq()); // seq = 2
emp1.setEmail('moonsiri@naver.com');
empDAO.upsertEmp(emp1); // upsert
System.out.println(emp1.getSeq()); // seq = 1
EmpVO emp3 = new EmpVO();
emp3.setName('성춘향');
emp3.setEmail('sch@tistory.com');
empDAO.upsertEmp(emp3); // insert
System.out.println(emp3.getSeq()); // seq = 3
▷ SelectKey 옵션
* Oracle이 아니면 PK를 자동증가 키로 설정하거나 selectKey 태그를 사용해야합니다.
Sequence를 사용하는 경우는 selectKey 옵션을 사용하면됩니다. 리턴 받은 값은 보낸 VO에 저장됩니다. 키를 조회해오는 태그이며 useGeneratedKeys 속성과는 다르게 쿼리를 한 번 더 실행해서 값을 가져오는 방식입니다. (※ SELECT문 이외의 문법은 실행되지 않습니다.)
- keyProperty : 리턴 받을 변수명
- resultType : 러턴 값의 자료형
- order : 순서 [ AFTER | BEFORE ] - (default: after)
*AFTER : insert 구문 실행 후 selectKey 구문 실행
*BEFORE : selectKey 구문 실행 후 리턴 값을 keyProperty에 셋팅한 뒤 insert 구문 실행
<insert id="insertEmp" parameterType="emp.vo.empVO" useGeneratedKeys="false">
INSERT INTO emp (
seq,
name,
email
)VALUES(
SQ_emp_id.NEXTVAL,
#{name},
#{email}
)
<selectKey keyProperty="seq" resultType="String" order="AFTER">
SELECT SQ_emp_id.CURRVAL FROM DUAL
</selectKey>
</insert>
[참고 사이트]