본문 바로가기

프로그래밍/스프링[Spring]

[Spring] Mybatis selectKey 사용 방법(Insert 후 특정 키 받기)



스프링 마이바티스에서 Insert 시 AUTO_INCREMENT 항목에 대한 id 값을 가져올 수 있습니다

 

혹인 Insert 작업 후 특정 키 값을 가져올 수 있습니다.

 

 

우선 테이블은 다음과 같이 생성합니다. 저는 Mysql 입니다.

CREATE TABLE user(
    user_id INT(11) NOT NULL AUTO_INCREMENT,
    user_name VARCHAR(20) NOT NULL DEFAULT '',
    column1 VARCHAR(20) NOT NULL DEFAULT '',
    column2 VARCHAR(20) NOT NULL DEFAULT '',
    PRIMARY KEY(user_id)
);

 

 

VO(DTO)에는 다음과 같이 작성하였습니다.

 

getter, setter는 생략하겠습니다.

    private Integer userId;
    private String userName;
    private String column1;
    private String column2;

 

 

우선 selectKey가 사용되는 경우는 다음과 같이 있습니다.

 

1. AUTO_INCREMENT가 적용된 테이블에 삽입된 데이터의 id를 바로 조회하여 바로 다른 테이블에 삽입하고 싶은 경우

2. AUTO_INCREMENT가 적용되지 않은 테이블에 id를 계산해서 넣고 싶은 경우

 

1번의 경우 Insert 진행 후 id를 가져와 보도록 하겠습니다.

 

다음과 같이 Insert 쿼리 밑에 selectKey를 추가합니다.

<insert id="UserDAO.testInsert" parameterType="userVO">
   INSERT INTO USER
          (USER_NAME, column1, column2)
   VALUES
          ('test', 'col1', 'col1');
    <selectKey keyProperty="userId" resultType="int" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
</insert>

 

그럼 Insert 구문을 실행 후 insert 한 사용자의 user_id가 VO의 user_id에 맵핑이 됩니다.

 

다음은 AUTO_INCREMENT가 적용되지 않은 컬럼의 id를 계산하는 방법입니다.

 

테스트를 하기 위해 기능을 없애고 테스트를 진행해 보겠습니다.

 

    <insert id="UserDAO.testInsert" parameterType="userVO">
       <selectKey keyProperty="userId" resultType="int" order="BEFORE">
           SELECT MAX(USER_ID)+1 FROM USER
       </selectKey>
       INSERT INTO USER
              (USER_ID, USER_NAME, column1, column2)
       VALUES
              (#{userId},'test', 'col1', 'col1');
    </insert>

 

실행하면 USER_ID의 최댓값 +1의 값을 USER_ID에 INSERT 합니다.

 

다음은 order 속성의 BEFORE, AFTER의 차이입니다.

//BEFORE
<selectKey keyProperty="userId" resultType="int" order="BEFORE"></selectKey>

//AFTER
<selectKey keyProperty="userId" resultType="int" order="AFTER"></selectKey>

BEFORE는 말 그대로 삽입 전에 값을 가져오는 것이고 AFTER는 구문 실행 후 값을 가져옵니다.

 

따라서 BEFORE로 실행하면 삽입 전 값을 조회하면 다음과 같습니다.

 

AFTER는 삽입 후에 조회하여 값을 그대로 가져옵니다.

 

 

Mybatis 3.2.6 버전부터는 selectKey에 여러 개 컬럼의 데이터를 조회할 수 있습니다. 

 

여러 개의 컬럼을 가져오기 위해서는 keyColumn이라는 속성을 설정해주어야 합니다.

 

keyColumn, keyProperty에 입력 시 띄어쓰기를 주의하시기 바랍니다. 공백으로 에러가 발생할 수 있습니다.

<insert id="UserDAO.testInsert" parameterType="userVO">
    INSERT INTO USER
          (USER_ID, USER_NAME, column1, column2)
    VALUES
          ('111','test name', 'test1', 'test2');
     <selectKey keyColumn= "USER_ID,USER_NAME" keyProperty="userId,userName" resultType="map" order="AFTER">
          SELECT USER_ID, USER_NAME
           FROM USER
          WHERE COLUMN1 = 'test1' AND COLUMN2 = 'test2'
    </selectKey>
</insert>

위 코드처럼 데이터가 삽입이 된 이후에 특정한 조건에 맞는 컬럼들의 데이터를 조회합니다. 

 

주의할 점은 selectKey를 통해서 나오는 데이터의 row 수는 무조건 1개여야 합니다.

 

insert 후 VO에 담깁니다.

 

 

이상으로 마치도록 하겠습니다.

 

감사합니다.