Spring/DB_MyBatis

[ mybatis ] insert/update 쿼리 실행 후 값 가져오기(useGeneratedKeys, keyProperty, SelectKey)

snow_hong 2022. 3. 15. 13:17

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>

[참고 사이트]

https://moonsiri.tistory.com/18

https://m.blog.naver.com/l1523/221706040458

728x90