스프링 마이바티스에서 Insert 시 AUTO_INCREMENT 항목에 대한 id 값을 가져올 수 있습니다
혹인 Insert 작업 후 특정 키 값을 가져올 수 있습니다.
우선 테이블은 다음과 같이 생성합니다. 저는 Mysql 입니다.
CREATE TABLE user(
user_id INT(11) NOT NULL AUTO_INCREMENT,
user_name VARCHAR(20) NOT NULL DEFAULT '',
column1 VARCHAR(20) NOT NULL DEFAULT '',
column2 VARCHAR(20) NOT NULL DEFAULT '',
PRIMARY KEY(user_id)
);
VO(DTO)에는 다음과 같이 작성하였습니다.
getter, setter는 생략하겠습니다.
private Integer userId;
private String userName;
private String column1;
private String column2;
우선 selectKey가 사용되는 경우는 다음과 같이 있습니다.
1. AUTO_INCREMENT가 적용된 테이블에 삽입된 데이터의 id를 바로 조회하여 바로 다른 테이블에 삽입하고 싶은 경우
2. AUTO_INCREMENT가 적용되지 않은 테이블에 id를 계산해서 넣고 싶은 경우
1번의 경우 Insert 진행 후 id를 가져와 보도록 하겠습니다.
다음과 같이 Insert 쿼리 밑에 selectKey를 추가합니다.
<insert id="UserDAO.testInsert" parameterType="userVO">
INSERT INTO USER
(USER_NAME, column1, column2)
VALUES
('test', 'col1', 'col1');
<selectKey keyProperty="userId" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
그럼 Insert 구문을 실행 후 insert 한 사용자의 user_id가 VO의 user_id에 맵핑이 됩니다.
다음은 AUTO_INCREMENT가 적용되지 않은 컬럼의 id를 계산하는 방법입니다.
테스트를 하기 위해 기능을 없애고 테스트를 진행해 보겠습니다.
<insert id="UserDAO.testInsert" parameterType="userVO">
<selectKey keyProperty="userId" resultType="int" order="BEFORE">
SELECT MAX(USER_ID)+1 FROM USER
</selectKey>
INSERT INTO USER
(USER_ID, USER_NAME, column1, column2)
VALUES
(#{userId},'test', 'col1', 'col1');
</insert>
실행하면 USER_ID의 최댓값 +1의 값을 USER_ID에 INSERT 합니다.
다음은 order 속성의 BEFORE, AFTER의 차이입니다.
//BEFORE
<selectKey keyProperty="userId" resultType="int" order="BEFORE"></selectKey>
//AFTER
<selectKey keyProperty="userId" resultType="int" order="AFTER"></selectKey>
BEFORE는 말 그대로 삽입 전에 값을 가져오는 것이고 AFTER는 구문 실행 후 값을 가져옵니다.
따라서 BEFORE로 실행하면 삽입 전 값을 조회하면 다음과 같습니다.
AFTER는 삽입 후에 조회하여 값을 그대로 가져옵니다.
Mybatis 3.2.6 버전부터는 selectKey에 여러 개 컬럼의 데이터를 조회할 수 있습니다.
여러 개의 컬럼을 가져오기 위해서는 keyColumn이라는 속성을 설정해주어야 합니다.
keyColumn, keyProperty에 입력 시 띄어쓰기를 주의하시기 바랍니다. 공백으로 에러가 발생할 수 있습니다.
<insert id="UserDAO.testInsert" parameterType="userVO">
INSERT INTO USER
(USER_ID, USER_NAME, column1, column2)
VALUES
('111','test name', 'test1', 'test2');
<selectKey keyColumn= "USER_ID,USER_NAME" keyProperty="userId,userName" resultType="map" order="AFTER">
SELECT USER_ID, USER_NAME
FROM USER
WHERE COLUMN1 = 'test1' AND COLUMN2 = 'test2'
</selectKey>
</insert>
위 코드처럼 데이터가 삽입이 된 이후에 특정한 조건에 맞는 컬럼들의 데이터를 조회합니다.
주의할 점은 selectKey를 통해서 나오는 데이터의 row 수는 무조건 1개여야 합니다.
insert 후 VO에 담깁니다.
이상으로 마치도록 하겠습니다.
감사합니다.
'프로그래밍 > 스프링[Spring]' 카테고리의 다른 글
[소셜 로그인] 네이버, 카카오, 구글 버튼 가이드 링크 (0) | 2023.02.03 |
---|---|
이클립스(Eclipse) 허용 메모리(Heap size) 간단 설정 (2) | 2023.01.28 |
[JQuery] closest, parent, children, find 차이 (0) | 2022.12.15 |
[JQuery] 태그 속성 값 가져오기 (0) | 2022.12.15 |
[Spring] Datepicker 사용시 Mybatis 에서 날짜 기간 검색(Mysql) (0) | 2022.12.14 |