티스토리 뷰

728x90

mybatis의 selectKey를 사용하면 insert나 update구문을 실행시키기 전이나(order="BEFORE"), 후에(order="AFTER")

원하는 특정 값을 받을 수 있다.

아래는 ID값을 1 증가 시킨 후 증가 된 아이디를 select 하는 구문이다.

 

여기서 주의 할 것은 parameterType이다. 실제로 쓰이는 값은 name하나이지만, nextId라는 값을 받기 위해서는 이 값을 받아 줄 수 있는 무언가가 필요하다. name 만 사용한다고 생각하여 parameterType을 String으로 쓰면 아래 에러를 볼 수 있다.

 

"nested exception is org.apache.ibatis.executor.executorexception: no setter found for the keyproperty 'nextId' in java.lang.string"

    <update id="updateKey" parameterType="InfoRequest">
        UPDATE
            TB_KEY_GENERATE T1
            INNER JOIN TB_KEY_GENERATE T2
                ON T1.NAME = T2.NAME
        SET
            T1.ID = T2.ID + 1
        WHERE T1.NAME = #{name}
        <selectKey resultType="java.lang.Integer" keyProperty="nextId" order="AFTER">
            SELECT ID as nextId FROM TB_KEY_GENERATE WHERE NAME = #{name}
        </selectKey>
    </update>

그래서 나는 InfoRequest라는 vo를 하나 만들어서 name이라는 변수에 값을 셋팅해주고 updateKey의 파라미터타입으로 넘겨주었다.

@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class InfoRequest {
    private String name;
    private int nextId;
}

쿼리가 실행이 되고 나면 아래처럼 infoRequest에 nextId 값이 담긴 걸 확인 할 수 있다.

String name = "injeong"
InfoRequest infoRequest = InfoRequest.builder().name(name).build();

mapper.updateRcpKey(infoRequest); //UPDATE 후 NEXT_ID 가져오기
int seq = infoRequest.getNextId();
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함