상세 컨텐츠

본문 제목

Mybatis selectKey 사용법

DataBase/Mybatis

by Chan.94 2023. 10. 14. 19:33

본문

반응형

selectKey 사용

- INSERT전 Key값을 증가시켜서 입력하는 경우 (order:BEFORE)

- INSERT후 생성된 Key값을 반환해야 하는 경우 (order:AFTER)

- KEY로 사용되는 여러 개의 칼럼을 조회한 후 사용해야 하는 경우

selectKey Element 속성

  • keyProperty : selectKey의 구문 결과가 세팅될 대상의 프로퍼티 명
  • resultType: 결과의 자료형 (String, Long, Integer...)
    여러 개의 Key를 조회하는 경우라면 별도의 객체 또는 hashmap를 사용하여야 한다.
  • keyColumn: <selectKey></selectKey> 내부에 작성한 SELECT 문의 조회 결과 칼럼과 일치시킨다.
    여러 개의 칼럼을 사용한다면 칼럼명의 목록은 콤마를 사용해서 구분한다. (띄어쓰기 X)
  • order: BEFORE or AFTER
    BEFORE로 설정하면 키를 먼저 조회하고 그 값을 keyProperty에 세팅한 뒤 insert 구문을 실행한다.
    AFTER로 설정하면 insert 구문을 실행한 뒤 selectKey 구문을 실행한다.

selectKey Example

USER_NO가 PK인 USER테이블이 존재하고 USER_NO는 DB 시퀀스로 관리한다고 가정하자.

BEFORE

<insert id="insertUser" parameterType="userDto" >
    <selectKey order="BEFORE" keyProperty="newUserNo" resultType="Long">
        SELECT USER_NO_SEQ.CURRVAL FROM DUAL
    </selectKey>
    INSERT INTO USERS
    (
      USER_NO
      ,CODE
      ,NAME
      ,PWD
      ...
    )
    VALUES
    (
      (SELECT USER_NO_SEQ.NEXTVAL FROM DUAL) AS USER_NO
      ,#{code}
      ,#{name}
      ,#{pwd}
      ...
    )
</insert>

 

AFTER

<insert id="insertUser" parameterType="userDto" >
    <selectKey order="AFTER" keyProperty="userNo" resultType="Long">
        SELECT USER_NO_SEQ.NEXTVAL FROM DUAL
    </selectKey>
    INSERT INTO USERS
    (
      USER_NO
      ,CODE
      ,NAME
      ,PWD
      ...
    )
    VALUES
    (
      #{userNo}
      ,#{code}
      ,#{name}
      ,#{pwd}
      ...
    )
</insert>
<insert id="insertIssue" parameterType="devlog.dto.IssueDto">
    <selectKey keyColumn="ISSUE_ID,ISSUE_NO" keyProperty="issueId,issueNo" resultType="devlog.dto.IssueDto" order="BEFORE" >
        SELECT 
            (SELECT MAX(ISSUE_ID) + 1 FROM ISSUE) AS ISSUE_ID
            ,(SELECT MAX(ISSUE_NO) + 1 FROM ISSUE) AS ISSUE_NO
        FROM DUAL
    </selectKey>
        INSERT INTO ISSUE (
            ISSUE_ID
            ,ISSUE_NO
                ...
        ) VALUES (
            #{issueId}
            ,#{issueNo}
                ...
        )
</insert>

 

반응형

댓글 영역

>