본문 바로가기
web/SpringBoot

[Mybatis] Mybatis 에서 useGeneratedKeys 와 selectkey

by 뽀리님 2023. 11. 13.

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개 동시에쓰지말것.