[mybatis] insert 후 key값 반환

2020. 9. 7. 12:07 Java 관련/MyBatis, iBatis

mybatis를 사용해 개발 하다가 insert한 데이터에 대한 key를 얻어야하는 경우가 생겼다. 고민 해봤지만 insert 후 다시 select를 해서 key를 얻어 와야겠다고 생각했다.

하지만 이 방법은 몇가지 문제가 있다고 생각이 들었다.

- key값 하나를 얻기 위해 쿼리를 2번 수행해야 하는 문제.

- unique한 값을 알지 못했을 경우 정확한 key를 얻기 힘들다.(조건절 사용)



1. 흐름

1) insert를 하기 위해 mapper에 parameter로 dto객체를 넘긴다.

2) dto객체를 받은 mapper는 insert 쿼리를 수행한다.

3) insert쿼리 완료 후 parameter로 받은 dto객체에 key값을 set(입력)한다.

4) dto객체에서 key값을 사용한다.

2. dto

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.woniper.spring.dto;
 
import java.io.Serializable;
 
public class UserDto implements Serializable {
 
    private static final long serialVersionUID = -7948360071399248554L;
     
    private long key;
    private String id;  //사용자 아이디
    private String name;  // 사용자 이름
    public long getKey() {
        return key;
    }
    public void setKey(long key) {
        this.key = key;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
     
}

3. mapper

1
2
3
4
5
6
7
8
<!--?xml version="1.0" encoding="UTF-8"?-->
 
 
<mapper namespace="user">
    <insert id="memberSign" parametertype="com.woniper.spring.dto.UserDto" usegeneratedkeys="true" keyproperty="key" keycolumn="key">
       insert into USER(id, name) values(#{id}, #{name})
    </insert>
</mapper>

useGeneratedKeys="true" : insert 후 key 생성 여부

keyProperty="key" : key 저장 property

keyColumn="key"  : key 저장 column

출처 : https://blog.woniper.net/192?category=531455