티스토리 뷰

게시판을 만들면서 DB에 시퀀스 사용이 필요해졌다.

먼저 시퀀스란 자동 증가 컬럼으로, 게시판에 글을 등록하게 되면 자동으로 게시글 번호가 만들어질 때 사용하게 된다.

 

시퀀스를 사용하면 VALUES 값 안에 아래와 같은 형식으로 코드를 작성 할 수 있다.

select rep_rnum.NEXTVAL from ntb_reply

하지만 value 값 안에 넣어서 코드를 작성하게 되면 중간에 값이 변형 될 수 있다는 단점이 있다.

 

 

차장님이 시퀀스보다 selectKey를 이용해서 구현하는 방법을 알려주셨다.

mybatis에서 제공하는 selectKey를 이용하면 별도의 쿼리 로직을 등록할 필요 없이 해당 메소드에서 일괄처리 할 수 있다.

 

 

 

ntb_reply라는 테이블 안에있는 rep_rnum이라는 컬럼 값을

1씩 증가시키고자 할 때 아래와 같이 코드를 작성하였다.

SELECT COALESCE(max(rep_rnum),0)+1 from ntb_reply

 

 

 

COALESCE 함수

 

먼저 COALESCE 함수를 살펴보자.

사전적으로는 합치다 라는 의미를 가지고 있고, NULL이 아닌 값을 만나면 리턴하는 함수이다.

ex) COALESCE(a, b)

a의 필드 값이 있을 경우에 a 데이터 값을 리턴하고 a의 값이 NULL이면 b의 데이터를 리턴한다.

 

따라서 위의 예제에서는 rep_rnum의 값이 있으면 max(rep_rnum)의 값을 리턴, rep_rnum의 값이 NULL이면 0을 리턴한다.

 

 

 

 

selelctKey 태그

 

selectKey 태그를 살펴보자

<selectKey resultType = "int" keyProperty="rep_rnum" order="BEFORE">
    SELECT COALESCE(max(rep_rnum),0)+1 from ntb_reply
</selectKey>

resultType는 리턴될 값을 형

keyProperty는 리턴받을 변수명

order은 순서로, before 또는 after를 셋팅할 수 있다. before로 설정하면 키를 먼저 조회하고 그 값을 keyProperty에 셋팅한 뒤 insert 구문을 실행한다. after로 설정하면 insert 구문을 실행한 뒤 selectKey 구문을 실행한다.

 

<!-- 댓글 정보 DB에 추가		-->
<insert id="insertBoardReply" parameterType="boardVO" > 
    <selectKey resultType = "int" keyProperty="rep_rnum" order="BEFORE">
        SELECT COALESCE(max(rep_rnum),0)+1 from ntb_reply
    </selectKey>

    INSERT INTO ntb_reply 
        (
        rep_rnum 
        , rep_regdate
        , rep_contents
        , post_pnum
        , user_id
        )

    VALUES 
        (
        #{rep_rnum} 
        , NOW()
        , #{rep_contents}
        , #{post_pnum}
        , #{rep_user_id}
        )
</insert>

 

 

 

 


Ref.

https://yookeun.github.io/java/2014/07/11/mybatis-selectkey/

 

mybatis에서 selectKey 사용법

DB작업을 하다보면 먼저 사전에 어떤 키값을 가져와서 증가시켜서 입력하거나 혹은 입력후에 증가된 키값을 가져올 필요가 있다. 이럴때 mybatis에서 제공하는 selectKey를 이용하면 별도의 쿼리로

yookeun.github.io

https://kimsg.tistory.com/256

 

마이바티스 selectkey 사용법

SQL 수행작업 중 insert된 이후에 알 수 있는 값 또는, 생성된 값을 바로 가져와서 select 쿼리를 보내야 하는 경우가 있다. 주로 생성하고 난 후의 인덱스(번호)를 가져와 작업해야 하는 상황에서 많

kimsg.tistory.com

 

댓글