Mybatis <selectKey> 사용법

박재민·2022년 12월 19일
1

Mybatis 벌크 연산 쿼리를 작성 중 A테이블의 PK를 B테이블에 같이 INSERT를 진행하는 상황이 생겼다.

INSERT 이전 사용

그래서 <selectKey> 를 사용하여 wm_dep_m테이블 INSERT이전에 키 값을 조회해서 INSERT를 하도록 쿼리를 작성했다.

  <insert id="insExp" parameterType="map">

  <selectKey order="BEFORE" keyProperty="exp_no" resultType="int">
          select INS_EXP_NO() FROM 테이블명
  </selectKey>

	insert into wm_exp_m(no,exp_nm,exp_ct,start_dt,end_dt,reg_id)
	values(#{exp_no},#{exp_nm},#{exp_ct},#{start_dt},#{end_dt},#{reg_id}) 
    </insert>

여기서 INS_EXP_NO() MYSQL에서 사용자 함수를 만들어 AUTO_INCREMENT의 역할을 하는 것으로 생각하면 된다.

INSERT 이후 사용

  <insert id="insExp" parameterType="map">
	insert into wm_exp_m(no,exp_nm,exp_ct,start_dt,end_dt,reg_id)
	values(#{exp_no},#{exp_nm},#{exp_ct},#{start_dt},#{end_dt},#{reg_id}) 
    
    <selectKey order="AFTER" keyProperty="exp_no"  keyColumn="exp_no" resultType="int">
		select INS_EXP_NO() FROM dual
</selectKey>
    </insert>

select key 엘리먼트 속성

  • keyProperty: selectKey구문의 결과가 셋팅될 대상 프로퍼티.

  • keyColumn: 리턴되는 결과셋의 칼럼명은 프로퍼티에 일치한다. 여러개의 칼럼을 사용한다면 칼럼명의 목록은 콤마를 사용해서 구분한다.

  • resultType: 결과의 타입. 마이바티스는 이 기능을 제거할 수 있지만 추가하는게 문제가 되지는 않을것이다. 마이바티스는 String을 포함하여 키로 사용될 수 있는 간단한 타입을 허용한다.

  • order: BEFORE 또는 AFTER를 셋팅할 수 있다. BEFORE로 설정하면 키를 먼저 조회하고 그 값을 keyProperty 에 셋팅한 뒤 insert 구문을 실행한다. AFTER로 설정하면 insert 구문을 실행한 뒤 selectKey 구문을 실행한다.

  • statementType: STATEMENT, PREPARED 또는 CALLABLE중 하나를 선택할 수 있다. 마이바티스에게 Statement, PreparedStatement 또는 CallableStatement를 사용하게 한다. 디폴트는 PREPARED 이다.

[참조링크] : https://deeplify.dev/back-end/spring/select-key

profile
동료를 소중히 생각하는 개발자입니다.

0개의 댓글