오늘은 시퀀스를 먼저 뽑는 방법에 대해서 알아보도록 하자.
insert를 해야되고 시퀀스를 사용하는 값이 있을 때 우리는 보통
간단히 seq.nextval을 사용해서 뽑곤 한다.
그런데 예를들어 글쓰기 페이지가 있을 때
글을 쓰면 바로 글을 조회하는 페이지로 넘어가고 싶을때
미리 시퀀스를 뽑아야 하는 일이 생기곤 한다.
이제 그럴때 @SelectKey (before =true)를 통해서
미리 값을 구할 수 있다.
@SelectKey (before =true)는 한마디로
밑의 쿼리문이 시행되기 전에 먼저 내가 원하는 쿼리문을 사용한다는 것이다
코드로 살펴보자
@SelectKey(statement = "select content_seq.nextval from dual", keyProperty = "content_idx", before = true, resultType = int.class)
@Insert("insert into content_table(content_idx, content_subject, content_text, " +
"content_file, content_writer_idx, content_board_idx, content_date) " +
"values (#{content_idx}, #{content_subject}, #{content_text}, #{content_file, jdbcType=VARCHAR}, " +
"#{content_writer_idx}, #{content_board_idx}, sysdate)")
//위에보면 content_type에 jdbcType=VARCHAR 가 있는데 db상에서 null을 허용해도 마이바티스에서 거부가 되어
//꼭 저것을 추가해주어야지 null값을 정상적으로 처리할 수 있다.
void addContentInfo(ContentBean writeContentBean);
이렇게 코드가 있다고 할때
원래는 우리는 insert를 하려고 저 코드를 쓰는 것이지만
@SelectKey 의 before = true 덕에 @SelectKey의 쿼리문이 먼저 실행하게 된다.
keyProperty는 말그대로 밑에있는 content_idx에 지금 쿼리문의 결과를 넣어주겠다는 뜻이다
resulttype은 반환값으로 int값으로 지정했다.
내가 이것을 사용한 이유는
글을 쓰자마자
글이 읽는 페이지로 이동하기 위함이고
이 쿼리문의 결과를
JSP에서
<script>
alert('저장되었습니다')
location.href = '${root}board/read?board_info_idx=${writeContentBean.content_board_idx}&content_idx=${writeContentBean.content_idx}'
</script>
이렇게 사용해서 board_info_idx와 content_idx를 모두 구할수 있게 되었다.
요약하자면 원하는 값이 미리 필요할 때 (아마 대부분이 시퀀스값?)
그때는 @SelectKey 어노테이션을 활용해서 DB를 사용하자.
댓글 영역