<selectKey>
태그* 해당 내용은 Oracle 기준이며, 데이터베이스마다 약간의 차이가 있음
<insert>
태그 내부에 정의하는 태그<selectKey>
태그에서 실행하는 SQL 구문은 새로 발행되는 기본키값을 획득하는 쿼리<selectKey>
사용 목적<selectKey>
의 주요 속성<selectKey>
태그의 SQL 구문 실행 결과가 대입될 대상 프로퍼티명(멤버변수명)<selectKey>
태그의 SQL 구문 실행 결과로 획득되는 값의 타입을 지정<selectKey>
태그에 정의된 SQL 구문의 실행 시점을 지정<selectKey>
를 사용하는 방법은 2가지가 있다.("BEFORE"/"AFTER" 등이 다름)
<insert id="insertUser" parameterType="com.example.vo.User">
<selectKey keyProperty="no" resultType="int" order="BEFORE">
select
users_seq.nextval
from
dual
</selectKey>
insert into shop_users
(user_no, user_id, user_password, user_name, user_email, user_tel, user_birth)
values
(#{no}, #{id}, #{password}, #{name}, #{email}, #{tel}, #{birth})
</insert>
selectKey를 통해 insert문 실행 전에 시퀀스 조회해서 증가된 시퀀스 번호를 획득하고,
파라미터타입에 명시되어 있는 객체(vo.User)의 프로퍼티를 keyProperty="no"으로 받아와서 int 타입으로 반환
==> insert문에서 #{no}로 사용 가능
mysql은 애초에 시퀀스가 없기 때문에 insert구문에 no를 적지도 않음.
❓ 그럼 어떻게 no를 생성하냐?
다른 컬럼들만 가지고 insert를 하면 자동으로 no가 획득됨.
따라서, mysql은<selectKey>
를 작성하는 방법이 조금 다름
<!--oracle -->
<insert id="insertSelectSeq" parameterType="com.model.Test">
INSERT INTO seq_test(idx,title)
VALUES(idx_test_seq.nextval,#{title})
<selectKey keyProperty="idx" resultType="Integer" order="AFTER">
SELECT idx_test_seq.currval FROM dual
</selectKey>
</insert>
mysql의 last_insert_id 함수는 테이블의 마지막 auto_increment 값을 리턴한다.
<!--mysql-->
<insert id="insertSelectSeq" parameterType="com.model.Test">
INSERT INTO seq_test(title)
VALUES(#{title})
<selectKey keyProperty="idx" resultType="Integer" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
* 데이터베이스 종류 참고
Oracle - Oracle
mysql - Oracle
mssql Server - MS
References