web/SpringBoot
[Mybatis] Mybatis 에서 useGeneratedKeys 와 selectkey
뽀리님
2023. 11. 13. 13:57
MYSQL 에서 insert 시에 pk값을 auto_increment 설정해놓은 ID 를 등록과 동시에 반환을 하기위해, 쿼리를 짰다.
<insert id="insertTerms" parameterType="model" useGeneratedKeys="true" keyProperty="tmSeq">
<selectKey keyProperty="newVer" resultType="int" order="BEFORE">
SELECT IF(MAX(VER_NO)+1 >= 0, MAX(VER_NO)+1, 0 ) as newVer FROM table_name
<where>
<if test = 'uagCd != null and !uagCd.equals("")'>
UAG_CD=#{uagCd}
</if>
</where>
</selectKey>
INSERT INTO table_name
(
UAG_CD
, TITLE
, CONTENT
, VER_NO
, DISP_YN
, DEL_YN
, REG_USER_ID
, INS_DT
)
VALUES (
#{uagCd}
,#{title}
,#{content}
,#{newVer}
,#{dispYn}
,#{delYn}
,#{regUserId}
,CURRENT_TIMESTAMP()
)
</insert>
Integer rowCount = termsService.insertTerms(terms);
log.info("rowCount => "+rowCount); // 성공한 row 갯수
log.info("ID => "+terms.getTmSeq()); // 약관번호
나는 당연히 PK값이 넘어오리라 생각했지만
미친듯이 null만 나옴....
여러번의 검색끝에 혹시..selectKey 와 동시에 사용이 안되는거 아닌가? 하고 newVer값을 확인해봄
log.info("newVer =>"+terms.getNewVer());
그랬더니 역시나.. newVer에 값이세팅 되어있었고, 정작 가져오려는 generate PK값은 <SelectKey> 와 충돌하므로, 동시에 쓸 수없다는걸 알게됨
그래서 결국 newVer을 구하는 쿼리는 따로 빼서 썼다.
그랬더니 잘가져온다!!
2개 동시에쓰지말것.