[Spring] Mybatis selectKey 사용법

윤재열·2022년 7월 6일
0

Spring

목록 보기
63/72
  • 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">
/* order = "BEFORE" 삽입 전에 조회 */
/* selectKey 구문의 위치는 INSERT 쿼리 위, 아래 상관 없이 위치할 수 있습니다. */
<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">
/* user 테이블은 AUTO_INCREMENT 설정이 되어 있습니다. */
insert into user(user_name,column1,column2)
values(#{userName},#{column1},#{column2})

/* order = "AFTER" 삽입 후에 조회 */
/* insert 구문이 실행된 후 , 방금 넣은 데이터의 ID를 조회하면 자동으로 DTO객체에 설정 됩니다. */
<selectKey keyProperty="userId" resultType="int" order="AFTER" >
select LAST_INSERT_ID()
</selectKey>
</insert>
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글