Mybatis 벌크 연산 쿼리를 작성 중 A테이블의 PK를 B테이블에 같이 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 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>
keyProperty: selectKey구문의 결과가 셋팅될 대상 프로퍼티.
keyColumn: 리턴되는 결과셋의 칼럼명은 프로퍼티에 일치한다. 여러개의 칼럼을 사용한다면 칼럼명의 목록은 콤마를 사용해서 구분한다.
resultType: 결과의 타입. 마이바티스는 이 기능을 제거할 수 있지만 추가하는게 문제가 되지는 않을것이다. 마이바티스는 String을 포함하여 키로 사용될 수 있는 간단한 타입을 허용한다.
order: BEFORE 또는 AFTER를 셋팅할 수 있다. BEFORE로 설정하면 키를 먼저 조회하고 그 값을 keyProperty 에 셋팅한 뒤 insert 구문을 실행한다. AFTER로 설정하면 insert 구문을 실행한 뒤 selectKey 구문을 실행한다.
statementType: STATEMENT, PREPARED 또는 CALLABLE중 하나를 선택할 수 있다. 마이바티스에게 Statement, PreparedStatement 또는 CallableStatement를 사용하게 한다. 디폴트는 PREPARED 이다.