<selectKey>는 MyBatis에서 사용되는 XML 매퍼 파일에서 자동 생성된 (primary key) 값을 가져오는 데 사용되는 태그입니다. 일반적으로 자동으로 생성되는 키를 처리하기 위해 사용되며, 대표적으로 데이터베이스의 auto-incrementedl 컬럼에 해당하는 값을 얻어오는 데 활용됩니다.
보통 INSERT 쿼리문을 실행할 때, 데이터베이스에 의해 생성된 자동 증가(primary key)키 값을 얻고자 할 때 사용됩니다.
예를 들어, mysql에서는 AUTO_INCREMENT 컬럼을 사용하고, oracle에서는 SEQUENCE를 사용하는 경우가 있습니다.
<selectKey>는 이러한 상황에서 MyBatis가 자동으로 생성된 키 값을 어떻게 가져올지를 설정하는데 사용됩니다.
✍🏻 예시
저는 프라이머리 키를 사용자가 직접 입력을 안 해도 자동으로 + 1씩 증가된 숫자를 넣어주고 싶었습니다.
이렇게 하는 방법도 있지만 이미 테이블을 생성한 후라 다른 방법으로 시도해보았습니다.
예시
<selectKey keyProperty="carCode" order="BEFORE" resultType="java.lang.String">
SELECT LPAD(NVL(MAX(CAST(CAR_CODE AS UNSIGNED)) + 1,1) ,4, 0) FROM ZB_CAR_SALES
</selectKey>
이렇게 insert 쿼리문을 바꾸면 완성입니다!!
여기서 잠깐❗️
LPAD 함수가 낯설어서 찾아보았는데
LPAD( "값", "총 문자길이", "채움문자" )
LPAD 함수는 지정한 길이만큼 왼쪽부터 채움문자로 채워줍니다.
채움문자를 지정하지 않으면 공백으로 해당 길이만큼 문자를 채워줍니다. (ex) LPAD(deptno, 5) )
반대로 RPAD 함수는
RPAD( "값", "총 문자길이", "채움문자" )
RPAD 함수는 지정한 길이만큼 오른쪽부터 채움문자로 채워줍니다.
여기서 잠깐 ❗️CAST란 ?
CAST는 한 칼럼의 데이터 타입을 다른 형식으로 변환시켜 보여주도록 도와주는 타입 변환 함수입니다.
CAST( 칼럼명 AS 변환하고자 하는 타입)
여기서 잠깐 ❗️UNSIGNED란 ?
int형을 사용할 때 좀 더 큰 범위로 활용하고 싶다면 unsigned를 사용하면 됩니다.
상황에 맞도록 설정하여 사용하는 게 리소스 낭비를 줄일 수 있는 방법입니다.
쉽게 이해해보자면, UNSIGNED이면 컬럼의 range는 UNSIGNED이 없을 때와 같지만 엔드포인트가
-2147483648 부터 2147483647 에서 --> 0 부터 4294967295로 늘어나게 됩니다.
해당 컬럼이 음수가 될 일이 아예 없다면 유용한 방법입니다!
'데이터융합 JAVA 응용 SW개발자 취업과정 > MySQL' 카테고리의 다른 글
[MyBatis] <sql>, <include> (1) | 2024.02.07 |
---|