mybatis
mybatis - insert 후 해당 객체의 바로 PrimaryKey 얻기
khds
2023. 4. 16. 18:36
mybatis를 진행하면서 객체를 데이터베이스에 저장하는 메서드를 실행 후 데이터베이스 상의 primaryKey가 바로 필요한 경우가 있다.
mybatis에서는 insert, delete, update 후 int 값을 리턴하는데 이 값은 얼마나 insert, delete, update 한 지를 알려주는 count 값이다.
insert 한 후 id를 얻기 위해서 select 메서드를 실행해야 하는가? 이는 데이터베이스에 한번 접근할 것을 두번이나 접근해야 하므로 좋지 않다.
그렇다면 어떻게 해야하는가?
방법은 xml파일을 활용하는 것이다.
아래의 예시를 보자.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="foot.footprint.domain.article.dao.CreateArticleRepository">
<insert id="saveArticle" parameterType="Article" useGeneratedKeys="true" keyProperty="id">
INSERT INTO article(
content, latitude, longitude, public_map, private_map, title, create_date, member_id
) VALUES (#{content}, #{latitude}, #{longitude}, #{public_map}, #{private_map}, #{title},
#{create_date}, #{member_id})
</insert>
</mapper>
insert 태그에 속성에에서 중요한 것은 useGenerateKeys와 keyProperty이다.
useGenerateKeys는 true로 설정하고 ketProperty는 어떤 값을 가져올지(PrimaryKey) 필드 명을 적으면 모두 끝난다.
정말 간단하지 않는가?
하지만 주의할 점이 있다.
해당 메서드의 리턴이 객체 그 자체 혹은, primaryKey라고 착각하는 것이다.
나도 리턴 값이 계속 primaryKey라고 믿어서 많이 헤맨 경험이 있다.
primaryKey를 얻는 방법은 insert 할 때 집어넣은 객체의 get함수를 사용하면 얻을 수 있다.
원래는 값이 없었는데 메서드를 실행함으로써 생긴 것이다.
아래는 예시코드이다.
@Test
public void saveArticle() {
//given
Long memberId = saveOne(); // member 객체를 만들고 memberId를 리턴하는 메서드
Article article = buildArticle(memberId);
//when & then
assertThat(article.getId()).isNull();
articleRepository.saveArticle(article);
//then
assertThat(article.getId()).isNotNull();
}