DB작업을 하다보면 먼저 사전에 어떤 키값을 가져와서 증가시켜서 입력하거나 혹은 입력후에 증가된 키값을 가져올 필요가 있다.
이럴때 mybatis에서 제공하는 selectKey를 이용하면 별도의 쿼리로직을 등록할 필요없이 해당 메소드에서 일괄처리할 수가 있다.
입력하기전에 특정키값을 가져온 다음 그 값을 이용해서 처리하고 싶다.
게시판 테이블인 MP_BOARD에 기본키인 bno가 1씩 증가하는 시퀸스이다.
(MP_BOARD_SEQ.NEXTVAL는 기본키 최대값에서 +1)
//게시글 작성
<insert id="insert" parameterType="kr.co.vo.BoardVO">
<selectKey keyProperty="bno" resultType="int" order="BEFORE">
SELECT MP_BOARD_SEQ.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO MP_BOARD( BNO
, TITLE
, CONTENT
, WRITER )
VALUES( #{bno}
, #{title}
, #{content}
, #{writer} )
</insert>
//첨부파일 작성
<insert id="insertFile" parameterType="hashMap">
INSERT INTO MP_FILE(
FILE_NO,
BNO,
ORG_FILE_NAME,
STORED_FILE_NAME,
FILE_SIZE
)VALUES(
SEQ_MP_FILE_NO.NEXTVAL,
#{BNO},
#{ORG_FILE_NAME},
#{STORED_FILE_NAME},
#{FILE_SIZE}
)
</insert>
게시글의 작성 부분에서 첨부파일 기능을 추가할때 첨부파일 기능은 게시글 작성과 함께 처리되야하고,
게시글작성 PR인 bno가 필요하다
하지만 select key를 넣지 않고, 바로 게시글 insert에 시퀸스를 넣으면
게시글 등록과 함께 데이터베이스에 bno가 등록되어
첨부파일테이블에선 시퀸스값(게시글 작성마다 bno+1) 을 가져올 수가 없다. 존재하지 않기 때문에.
그렇기때문에 먼저 selectKey의 쿼리를 실행하게되면 번호는 1이 증가기 된다.
이렇게 되면 게시글의 번호는 selectKey에서 실행한 쿼리의 값이 들어가지고 첨부파일의 게시글번호도 넣을수 있게 된다.
1) insert쿼리를 실행기전에 SELECT MP_BOARD_SEQ.NEXTVAL FROM DUAL을 실행
2) 실행한 쿼리에서 가져올값 (keyProperty="bno") bno를 int형으로 가져옴
3) bno값을 BoardVO(gettersetter)에 파라미터로 넣어줌.
<selectKey>아래에 있는 쿼리가 먼저 실행되고, 결과 값(resultType)을 bno라는 변수(keyProperty)로 parameterType인 BoardVO의 bno 변수에 대입된다
만약 게시글 작성 시 첨부파일 기능을 넣었는데 selectkey를 사용하지않고 바로 insert에 시퀸스를 넣으면
첨부파일 bno엔 값이 들어가지 못해서 데이터입력은 되지만 조회기능 수행불가!!라는걸 기억하자
selectkey 사용이유는 생성된 값을 다음에 활용하기 위하여 저장한다는 것에 있다.
개발을 하다보면 위와같이 MP_BOARD 테이블에 데이터를 insert한 후
자식테이블(MP_FILE)에 연속으로 데이터를 insert해야하는 경우, 이때 생성된 시퀸스값이 필요할 때에
사용한다.
결론적으로 결국 부모테이블의 insert 처리 후의 데이터값을 기준으로, 그 데이터 값을 참조하는 자식테이블에서 부모테이블의 데이터값을 insert해야 하는 부분을 간략화해준다고 생각하면 되겠다.
//다음값으로 증가값만큼의 처리 SELECT MP_BOARD_NEXTVAL FROM DUAL; ,
만약 2씩 증가시키고 싶으면 SELECT MAX(bno) +2 FROM DUAL; 이런식으로 만들 수도 있겠다.//
아래는 select key 정보
key 프로퍼티로 구문의 결과가 셋팅될 대상을 bno(게시판 기본키)로 정해주고,
resultType은 기본키의 설정타입 int
order은 구문이 실행되기전에 실행되도록 before을 해준다.
- AFTER : insert 구문 실행 후 selectKey 구문 실행
- BEFORE : selectKey 구문 실행 후 리턴 값을 keyProperty에 셋팅한 뒤 insert 구문 실행
select key 엘리먼트 속성
keyProperty: selectKey:구문의 결과가 셋팅될 대상 프로퍼티.
keyColumn: 리턴되는 결과셋의 칼럼명은 프로퍼티에 일치한다. 여러개의 칼럼을 사용한다면 칼럼명의 목록은 콤마를 사용해서 구분한다.
resultType: 결과의 타입. 마이바티스는 이 기능을 제거할 수 있지만 추가하는게 문제가 되지는 않을것이다. 마이바티스는 String을 포함하여 키로 사용될 수 있는 간단한 타입을 허용한다.
order: BEFORE 또는 AFTER를 셋팅할 수 있다. BEFORE로 설정하면 키를 먼저 조회하고 그 값을 keyProperty 에 셋팅한 뒤 insert 구문을 실행한다. AFTER로 설정하면 insert 구문을 실행한 뒤 selectKey 구문을 실행한다. 오라클과 같은 데이터베이스에서는 insert구문 내부에서 일관된 호출형태로 처리한다.
statementType: STATEMENT, PREPARED 또는 CALLABLE중 하나를 선택할 수 있다. 마이바티스에게 Statement, PreparedStatement 또는 CallableStatement를 사용하게 한다. 디폴트는 PREPARED 이다
'DB > MYBATIS' 카테고리의 다른 글
Mybatis에서 null값 허용하기 (0) | 2021.10.14 |
---|---|
MYBATIS에서 include문 사용법 (0) | 2021.07.31 |
[MYBATIS]selectList와 selectOne (0) | 2021.07.27 |