728x90
<selectKey>
FK 컬럼이 있는 테이블과, 참조의 대상이 되는 테이블을 한꺼번에 Insert해야 하는 상황에 사용한다.
예를 들어, 주문이 발생했을 때 주문 테이블과 결제 테이블의 Insert 작업은 동시에 진행되어야 한다. 이 때, selectKey를 사용한다.
- <insert> 태그 내부에 정의하는 태그
- INSERT 구문 실행 전, 실행 후 실행할 SQL문을 지정할 수 있다.
- <selectKey> 태그에서 실행하는 SQL 구문은 새로 발행되는 기본키값을 획득하는 쿼리
<selectKey> 태그의 주요 속성
- keyProperty: 결과 값을 저장할 객체의 프로퍼티 이름을 지정합니다.
- resultType: 결과 값의 데이터 타입을 지정합니다.
- order: 쿼리 실행 순서를 지정합니다. (BEFORE, AFTER)
- statementType: 사용할 SQL 문의 종류를 지정합니다. (STATEMENT, PREPARED, CALLABLE)
Oracle에서 <selectKey>를 사용하는 방법은 2가지가 있다.
아래 방법이 1번째 방법이고, 2번째 방법은 더 아래의 Oracle과 mysql 비교 부분 참고 ("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}로 사용 가능
Oracle과 mysql 비교
mysql은 애초에 시퀀스가 없기 때문에 insert구문에 no를 적지도 않음.
그럼 어떻게 no를 생성하냐?
다른 컬럼들만 가지고 insert를 하면 자동으로 no가 획득됨.
따라서, mysql은 <selectKey>를 작성하는 방법이 조금 다름
1. Oracle
<!--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>
2. mysql
<!--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>
mysql의 LAST_INSERT_ID() 함수는 테이블의 마지막 auto_increment 값을 리턴한다.
출처 : https://velog.io/@ryuneng2/Spring-selectKey-%EC%8B%9C%ED%80%80%EC%8A%A4%ED%9A%8D%EB%93%9D
728x90
'STUDY > DB SQL' 카테고리의 다른 글
[MySQL] 테이블 스키마 백업하기 (0) | 2024.10.11 |
---|---|
[MySQL][JAVA] 연동 시 Public key retrieval is not allowed 오류 (0) | 2024.10.11 |
[MyBatis] Oracle Clob Select String 마이바티스 오라클 clob 출력 (0) | 2024.08.12 |
[SQL] 오라클 삭제한 데이터 복구 (0) | 2024.07.30 |
[MyBatis] <trim> 사용법 (0) | 2024.04.29 |