본문 바로가기
java

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

by moonsiri 2020. 10. 9.
728x90
반응형

insert/update 등을 실행하고서 결과를 확인해야 하는 상황이 생깁니다.

다음은 insert 되는 Auto Increment 값(mysql 등)이나 sequence 값(oracle 등)을 조회하는 방법입니다.

 

 

useGeneratedKeys, keyProperty 옵션

 

사용하는 데이터베이스가 Mysql과 같이 자동생성 키를 지원한다면 useGeneratedKeys, keyProperty 옵션을 통해 insert 된 데이터의 key 값을 리턴 받을 수 있습니다.

  • useGeneratedKeys : (insert, update에만 적용) 자동생성 키를 받을때 true로 설정한다. (default: false)
  • keyProperty : 리턴 될 key property 설정. 여러개를 사용한다면 ,(콤마)를 구분자로 나열한다.

만약 ON DUPLICATE KEY UPDATE를 사용한다면 update된 데이터의 key 값을 조회할 수 있습니다.

 

<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>

 

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과 같이 Sequence를 사용하는 경우는 selectKey 옵션을 사용하면됩니다.

  • selectKey
    • keyProperty : 리턴 받을 변수명
    • resultType : 러턴 값의 자료형
    • order : 순서 [AFTER|BEFORE]
      • 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="long" order="AFTER">
    	SELECT SQ_emp_id.CURRVAL FROM DUAL
    </selectKey>
</insert>

 

 

[Reference]

mybatis.org/mybatis-3/sqlmap-xml.html

728x90
반응형

댓글