- Spring 과 Mybatis를 이용하여 개발 할 때는 쿼리를 직접 작성하기 때문에 장단점이 있습니다.
- 쿼리를 직접 작성하면 쿼리를 튜닝하기도 좋고, 데이터를 원하는 형태로 조회하기가 쉬워집니다.
- 파일업로드를 하던 도중 게시판에 파일업로드를 해야하는데 board 의 PK를 가져오기 위해서 selectKey를 공부해 보았습니다.
selectKey 속성
- keyProperty : selectKey 구문의 결과가 세팅될 대상 프로퍼티
- keyColumn : 리턴되는 결과셋의 칼럼명은 프로퍼티에 일치한다. 여러개의 칼럼을 사용한다면 콤마를 사용하여 구분합니다.
- resultType : 결과의 타입
- order : BEFORE 또는 AFTER를 세팅할 수 있습니다.
- BEFORE - 키를 먼저 조회하고 그 값을 keyProperty에 세팅한 뒤에 insert 문을 실행한다.
- AFTER - insert 구문을 실행한 뒤 selectKey 구문을 실행합니다.
- statementType : Statement, PreparedStatement 또는 CallableStatement를 사용하며 , 디폴트 값은 Prepared 입니다.
샘플 데이터 및 DTO
- 테이블은 user와 hobby 테이블을 샘플로 생성했습니다.
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)
)comment '유저 테이블';
CREATE TABLE hobby(
hobby_id INT(11) NOT NULL DEFAULT 0,
hobby_name VARCHAR(20) NOT NULL DEFAULT '',
user_id INT(11) NOT NULL DEFAULT 0
PRIMARY KEY(hobby_id)
)comment '취미 테이블' ;
class User(
int userId;
String userName;
String column1;
String column2;
)
class Hobby(
int hobbyId;
String hobbyName;
int userId;
)
selectKey가 사용되는 사례
- AUTO_INCREMENT가 적용되지 않은 테이블에 id를 계산해서 넣고 싶은 경우
- AUTO_INCREMENT가 적용된 테이블에 삽입된 데이터의 id를 바로 조회하여 바로 다른 테이블에 삽입하고 싶은 경우(ex) 파일 업로드, 삽입된 데이터의 id를 log찍고 싶을 때)
AUTO_INCREMENT가 적용되지 않은 테이블에 id를 계산하여 삽입
<insert id="insertHobby" parameterType="hobby">
<selectKey keyProperty="hobbyId" resultType="int" order="BEFORE" >
select max(hobby_id) +1 from hobby
</selectKey>
insert into hobby(hobby_id,hobby_name,user_id)
values(#{hobbyId},#{hobbyName},#{userId})
</insert>
- 위 코드는 hobby 테이블에 데이터를 삽입하기 전에, hobby_id 값을 hobby_id의 (최대값+1)을 조회해서 삽입하는 예제입니다.
AUTO_INCREMENT가 적용된 테이블에 id를 계산하여 삽입
- 예를 들어 사용자에 대한 데이터와 해당 사용자의 취미를 저장하고 싶은 경우, 다음과 같은 형태로
selectKey
를 사용할 수 있습니다.
<insert id="inserUser" parameterType="user">
insert into user(user_name,column1,column2)
values(
<selectKey keyProperty="userId" resultType="int" order="AFTER" >
select LAST_INSERT_ID()
</selectKey>
</insert>