티스토리 뷰



SQL 수행작업 중 insert된 이후에 알 수 있는 값 또는, 


생성된 값을 바로 가져와서 select 쿼리를 보내야 하는 경우가 있다.


주로 생성하고 난 후의 인덱스(번호)를 가져와 작업해야 하는 상황에서 많이 사용한다.



이런경우 java에서 insert 쿼리를 실행하고 값을 받은 후 


값을 가지고 다시 쿼리를 DB에 전송하는 방법이 있다.


하지만, 불필요한 여러번의 DB 입출력은 시간이 느려진다는 단점이 있다.


그때, selectKey를 사용하여 바로 적용할 수 있다.


마이바티스, 아이바티스 두개 다 적용이 가능하다.


selectKey는 DB에 명령을 한번만 보내며, 우선 입력한 값의 결과값을 다음 쿼리로 바로 return 시켜주는 것이다.




1
2
3
<selectKey resultType="integer" keyProperty="rsrvIdx" order="AFTER">
    SELECT LAST_INSERT_ID()
</selectKey>
cs


위 사용 예제는 selectKey의 기본 사용법이다.



마이바티스 한글 번영 문서 : http://www.mybatis.org/mybatis-3/ko/


마이바티스 :  http://blog.mybatis.org/


아래는 공식 문서에 적힌 내용이다.



마이바티스는 자동생성키 칼럼을 지원하지 않는 다른 데이터베이스를 위해 다른 방법 또한 제공한다.

이 예제는 랜덤 ID 를 생성하고 있다.

<insert id="insertAuthor">
  <selectKey keyProperty="id" resultType="int" order="BEFORE">
    select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
  </selectKey>
  insert into Author
    (id, username, password, email,bio, favourite_section)
  values
    (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
</insert>

위 예제에서 selectKey구문이 먼저 실행되고 Author id프로퍼티에 셋팅된다. 그리고 나서 insert 구문이 실행된다. 이건 복잡한 자바코드 없이도 데이터베이스에 자동생성키의 행위와 비슷한 효과를 가지도록 해준다.

selectKey 엘리먼트는 다음처럼 설정가능하다.

<selectKey
  keyProperty="id"
  resultType="int"
  order="BEFORE"
  statementType="PREPARED">

사용할 때 selectkey의 엘리먼트를 잘 설정을 해서 사용하면 된다.

속성설명
keyPropertyselectKey구문의 결과가 셋팅될 대상 프로퍼티.
keyColumn리턴되는 결과셋의 칼럼명은 프로퍼티에 일치한다. 여러개의 칼럼을 사용한다면 칼럼명의 목록은 콤마를 사용해서 구분한다.
resultType결과의 타입. 마이바티스는 이 기능을 제거할 수 있지만 추가하는게 문제가 되지는 않을것이다.
마이바티스는 String을 포함하여 키로 사용될 수 있는 간단한 타입을 허용한다.
orderBEFORE 또는 AFTER를 셋팅할 수 있다. BEFORE로 설정하면 키를 먼저 조회하고
그 값을 keyProperty 에 셋팅한 뒤 insert 구문을 실행한다. AFTER로 설정하면
insert 구문을 실행한 뒤 selectKey 구문을 실행한다. 오라클과 같은 데이터베이스에서는
insert구문 내부에서 일관된 호출형태로 처리한다.
statementType위 내용과 같다. 마이바티스는 Statement, PreparedStatement 그리고 CallableStatement을
매핑하기 위해 STATEMENT, PREPARED 그리고 CALLABLE 구문타입을 지원한다.


1
  SELECT IFNULL(MAX(FILE_NO+1),1FROM TB_ATTACH_FILE
cs

위의 쿼리 해설은 TB_ATTACH_FILE  의 보드에서 FILE_NO의 가장 높은값의 다음값을 찾는 쿼리이다.

만약 입력을 원하는 컬럼의 index가 자동 증가가 아닐 경우 사용할 수 있다.

위의 쿼리대로 실행하면 가장 높은 index값을 구할 수 있는데 이때 구한 값을 bbsNo   에 자동으로 대입해준다.


resultType : 결과값의 type.
keyProperty : 다음 쿼리에 대입될 변수명.
order : 실행시점.

1
2
3
<selectKey resultType="integer" keyProperty="bbsNo" order="AFTER">
    SELECT IFNULL(MAX(FILE_NO+1),1) FROM TB_ATTACH_FILE
</selectKey>
cs


위를 적용한 전체 쿼리문이다.


전체 쿼리문.


selectkey를 실행시켜 나온 값인 bbsNo의 값을 바로 아래의 bbsNo에 넣어서 INSERT 문을 실행시킨다.


아래의 예제는 selectkey를 보여주기 위하여 따로 bbsNo를 찾도록 바꾼 쿼리이다.


하지만, 저정도의 쿼리는 insert문에 바로 적용을 할 수 있다.


두가지의 방법중에서 어떤 방법이 더 속도가 빠른지에 대해서는 잘 모르겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 <insert id="InsertBoard" parameterType="egovframework.BoardContentVO" >
     <selectKey resultType="integer" keyProperty="bbsNo" order="AFTER">
          SELECT IFNULL(MAX(FILE_NO+1),1) FROM TB_ATTACH_FILE
     </selectKey>
           INSERT INTO
                TB_BBS_CONTENT(
                     BBS_NO
                     ,TITLE
                     ,CONTENT
                     ,FILE_NO
                     ,USE_YN
                     ,REG_USER
                     ,REG_DT
                )
                VALUES (
                     #{bbsNo}
                     ,#{title}
                     ,#{content}
                     ,#{fileNo}
                     ,#{useYn}
                     ,'Master'
                     ,NOW()
                )
     </insert>
cs



MyBatis 3.2.6 버전부터는 multiple select key 가 지원이 된다.


1
2
3
<selectKey keyProperty="userId,userName" resultType="hashmap" order="BEFORE">
    SELECT 'key1' as userId, 'key2' as userName FROM DUAL
</selectKey>
cs



multiple select key 를 사용하면 이제 2개의 값을 받아올 수 있게 된다.



출처 : http://lng1982.tistory.com/228





반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함