개발자가 되고 싶은 1人

mysql, mybatis insert 성공시 저장된 pk 값 받아오기. 본문

프로그래밍/spring

mysql, mybatis insert 성공시 저장된 pk 값 받아오기.

인생을 노트하자 2021. 5. 27. 11:22

mybatis에서 특정 테이블에 값을 저장한 뒤 최근에 저장된 pk값을 가져와야 될 때가 간혹 존재한다.

 

다른 블로그들에서 보면 여러 말들이 많은데. 안되는게 많더라.

 

또한 pk값은 불러 오는데 항상 1만 받아오는 경우도 있더라... (간단히 해결 가능)


1안.

<insert id="insertMaster" parameterType="Hashmap" statementType="PREPARED" useGeneratedKeys="true" keyColumn="MASTER_SEQ" keyProperty="masterSeq" >

    INSERT INTO PRODUCT_MASTER (MEASURE_DATE, OD_SCORE) VALUES ( #{measureDate}, #{odScore} );

</insert>

 

2안.

<insert id="insertMaster" parameterType="Hashmap" statementType="PREPARED" useGeneratedKeys="true" keyColumn="MASTER_SEQ" keyProperty="masterSeq" >

    INSERT INTO PRODUCT_MASTER (MEASURE_DATE, OD_SCORE) VALUES ( #{measureDate}, #{odScore} );

<selectKey keyColumn="MASTER_SEQ" keyProperty="masterSeq" resultType="Integer" order="AFTER">

    SELECT LAST_INSERT_ID();

</selectKey>
</insert>

 

1안, 2안 각각 뭐가 정답이라기 보단 아무것이나 선택해도 된다.

 

단, 나같은 경우에는 2안보다는 1안이 간결하여 1안으로 진행을 하였음.

 


여기서 잘 알아야 되는 부분이 1안이든 2안이든 parameterType="Hashmap" 이곳이다. ( 밑줄 쫙 별이 다섯개★★★★★ )

 

많이들 실수 하는게 2안에서 <selectKey resultType="Integer"> </selectKey> 리턴 타입이 integer라서 아래와 같이 매퍼, 서비스의 리턴 타입을 int로 하는경우가 있는데 이때는 실제로 테이블에 저장된 키 값이 1이 아닌데도 자꾸 1만 리턴이 된다.

 

# 잘못된 예

<Mapper.java>
int insertMaster(Map<String, Object> map);


<Service.java>
int insertKey = productMapper.insertMaster(param1);

System.out.println("insertKey : ", insertKey);
==> insertKey : 1

↓↓↓↓↓

 

# 잘되는 예

<Mapper.java>
void insertMaster(Map<String, Object> map);


<Service.java>
productMapper.insertMaster(param1);

System.out.println("insertKey : ", param1.get("masterSeq"));
==> insertKey : 12

 

앞서 parameterType="Hashmap"  에서 해시맵을 파라미터로 받았을 경우 파라미터로 넘긴 맵에 저장되는 키 값이 들어간다.

mybatis 테이블 저장후 리턴 값 받아오기

추가로 parameterType에 맵이 아닌 VO를 넣을 경우 해당 vo에 키값의 변수가 존재하면 vo.getMasterSeq(); 이런 식으로도 저장된 키값을 가져올 수 있다.

 

 

끝.

Comments