본문 바로가기
Dev Story 💻/Java

[MyBatis] selectKey태그를 이용하여 insert하고 난 후 key값 리턴받기

by 몽테 2023. 3. 8.
반응형

1. 개요

 

MyBatis로 데이터 CRUD를 관리하는 프로젝트를 진행할 때,

간혹 insert 후 시퀀스 값을 얻어와야 할 때가 있다.

예를 들어, 다른 시스템과 인터페이스되는 API를 개발할 때, 시퀀스key 값을 리턴을 해줘야 하거나,

인서트한 후에 생성된 시퀀스 key값을 다른 테이블의 FK로 넣어줘야 할 경우이다.

 

지금부터 서술할 방법 외에도 다른 여러가지 방법이 있겠지만, MyBatis xml내부에서 간단하게 사용가능한 방법을

이번 포스팅에 기술하려고 한다.

 

 

 

2. <selectKey> 태그

 

insert문 내부에 <selectKey>태그를 사용하여 key값을 얻어올 수 있다.

 

 

이번 예제에서는 insert태그의 parameterType을 hashmap으로 한 예제임을 하자.

<insert>태그 내부에 <selectKey>태그를 추가하여 사용가능하다.

  • keyProperty : insert 태그에서 사용한 parameter객체(여기에서는 hashmap)의 프로퍼티에 매핑할 변수명이 들어간다.
  • resultType : 결과값의 자료형
  • order : BEFORE, AFTER로 insert쿼리 이후에 실행할지 이전에 실행할지 시점을 결정할 수 있다.
    쉽게말해서, BEFORE는 selecKey가 insert문 이전에 실행되어 keyProperty변수에 담아주고, insert쿼리 내부에서 파라미터로 사용이 가능하다.
    AFTER는 insert문 이후에 실행되어 keyProperty변수에 담긴다.

이번 예제에는 keyProperty를 SQ라는 변수명으로 하여, BEFORE로 실행하였다.

selectKey태그 내의 쿼리는 시퀀스값의 max값을 구하여 + 1을 하는 로직이고, 사용하는 RDBMS가 오라클이고 시퀀스객체를 사용한다면  nextval로 다음 시퀀스를 불러와도 상관없다.

BEFORE로 실행하였기에 insert문 이전에 selectKey태그가 실행되었고, SQ변수에 담겨 insert문에서 파라미터로 활용한 것을 볼 수 있다.

 

DAO 클래스는 이미 생성되어있다는 가정하에

Service클래스를 살펴보면, 파라미터로 넘겨준 HashMap객체가 있다.

쿼리를 실행한 후 log를 찍어보면, selectKey태그의 keyProperty에서 선언해준 변수명이 키값으로 추가되어 밸류값에

원하는 시퀀스값이 매핑되어있는 것을 확인할 수 있다.

 

끝.

반응형

댓글