2023-11-22 작성

[Mybatis] 오라클 DB insert 이후 idx 값 가져오기 (nextVal, currVal)

오라클 DB에서 데이터 insert할 때 시퀀스로 idx를 생성하곤 한다. 만약 insert한 idx값을 바로 가져와야 할 경우 selectKey를 사용하면 된다.

예시를 들어보자. 아래 같이 테이블, 시퀀스가 만들어졌다고 가정한다.

-- 테이블 생성
CREATE TABLE board (
    board_id NUMBER NOT NULL,
    title VARCHAR2(50),
    wirter VARCHAR2(50)
)

-- 시퀀스 생성
CREATE SEQUENCE sq_board_id START WITH 1 INCREMENT BY 1 MANVALUE 1 MAXVALUE 999999999 CYCLE CACHE 50;


xml 쿼리에서 insert 태그 안에 selectKey 옵션을 사용해서 생성한 idx값을 바로 리턴할 수 있다.

<insert id="insertBoard" parameterType="Board">
   INSERT INTO BOARD (
      board_id,
      title,
      writer
   ) VALUES (
      sq_board_id.NEXTVAL,
      #{title, jdbcType=VARCHAR},
      #{writer, jdbcType=VARCHAR}
   )
  <selectKey keyProperty="boardId" resultType="int" order="AFTER">
       SELECT sq_board_id.CURRVAL FROM DUAL
  </selectKey>
</insert>


그러면 서비스 단에서 insert 처리한 데이터를 다시 get해보면 생성한 idx를 바로 가져올 수 있다.

boardMapper.insertBoard(board);
int idx = board.getBoardId(); // insert한 idx값을 가져온다


이때 주의할 점이 있다. 아래처럼 insert한 값을 가져오면 결과값이 0 또는 1만 나올 것이다. insert한 리턴 값은 처리 결과 여부이기 때문이다. 이 부분을 주의하자.

int idx = boardMapper.insertBoard(board); // 처리 결과를 가져온다