상세 컨텐츠

본문 제목

마이바티스 @SelectKey 시퀀스 미리뽑기

카테고리 없음

by shika 2022. 4. 10. 16:17

본문

오늘은 시퀀스를 먼저 뽑는 방법에 대해서 알아보도록 하자.

 

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를 사용하자.

댓글 영역