새소식

반응형
Java/Spring

@SelectKey, <selectKey>

  • -
반응형

@SelectKey 어노테이션 사용

mysql 에서 @INSERT 어노테이션을 사용하여 insert를 했을경우 입력된 primary key가 필요할떄가 있다

그때 입력후에 바로 리턴받는 방법이 @SelectKey 어노테이션을 사용한다.

@SelectKey
(
statementType=statementType.PREPARED,
statement="SELECT LAST_INSERT_ID()",
keyProperty="seq",
before=false,
resultType=int.class
)
public int testSelectKey(Test test);

// Test Model
public Class Test {
    int seq;
    String name;
    String number;
}

 

keyProperty

selectKey 구문의 결과가 셋팅될 대상 프로퍼티

​보통 Model의 seq 값으로 설정한다.

 

예를 들어 Java Model Object에 int seq, String name, String number 로 설정되어 있다고 가정하자

그러면 보통 insert 후에 입력된 데이터의 seq를 조회하기 위해 seq로 많이 설정한다.

 

위 testSelectKey(Test test) 를 예로 들면 before=false로 인해 insert 구문이 실행된 후 SelectKey 가 실행된다.

insert 후의 seq 값을 Test Model의 seq로 담겨 return 된다.

 

resultType

리턴 될 결과의 타입을 설정한다.

order

before, after 설정 가능

- before : 키를 먼저 조회하고 keyProperty에 키를 셋팅한 후 insert 구문을 실행한다.

  before=false 일경우 after에 해당한다.

 

- after : insert 구문을 먼저 실행하고 selectKey 구문을 실행한다.

  before=true 일경우 after에 해당한다.

statementType

마이바티스는 Statement, PreparedStatement 그리고 CallableStatement을 매핑하기 위해

STATEMENT, PREPARED 그리고 CALLABLE 구문타입을 지원한다.

 

- default는 StatementType.PREPARED

 

<selectKey></selectKey> 태그 사용

<insert id="testBoard" parameterType="com.test.model.Test">
    <selectKey resultType="java.lang.Integer" keyProperty="seq" order="BEFORE">
        SELECT MAX(seq)+1 FROM test
    </selectKey>
    INSERT INTO test(seq, name, number)
    VALUES(#{seq}, #{name}, #{number})
</insert>

// Test
@Getter
@Setter
public Class Test {
    int seq;
    String name;
    String number;
}

 

resultType

selectKey 태그 안의 구문을 실행하고 리턴될 데이터 타입

 

keyProperty

selectKey 구문의 결과가 셋팅될 대상 프로퍼티

​보통 Model의 seq 값으로 설정한다.

 

예를 들어 Java Model Object에 int seq, String name, String number 로 설정되어 있다고 가정하자

그러면 보통 insert 후에 입력된 데이터의 seq를 조회하기 위해 seq로 많이 설정한다.

 

위 testSelectKey(Test test) 를 예로 들면 before=false로 인해 insert 구문이 실행된 후 SelectKey 가 실행된다.

insert 후의 seq 값을 Test Model의 seq로 담겨 return 된다.

 

order

BEFORE, AFTER 두가지 설정이 가능하다.

 

BEFORE

INSERT 구문을 실행하기 전에 SelectKey 태그가 실행된다.

보통 테이블의 Primary Key인 seq 값을 자동입력을 안했을 경우 사용한다.

seq 값을 +1 하고 난 후 keyProperty에 설정된 변수로 데이터가 저장하도록 사용한다.

<insert id="testBoard" parameterType="com.test.model.Test">
    <selectKey resultType="java.lang.Integer" keyProperty="seq" order="BEFORE">
        SELECT MAX(seq)+1 FROM test
    </selectKey>
    INSERT INTO test(name, number)
    VALUES(#{name}, #{number})
</insert

// Test
@Getter
@Setter
public Class Test {
    int seq;
    String name;
    String number;
}

위 코드를 보면 test 테이블의 seq 값의 최대치를 구하고 +1 후에 keyProperty 설정에 따라

insert 태그 parameterType에 설정된 java Object Test model의 seq에 자동 설정된다.

 

AFTER

INSERT 구문을 실행한 후 SelectKey 태그가 실행된다.

보통 INSERT 구문에 의해 입력된 데이터의 seq를 리턴할 때 사용한다.

<insert id="testBoard" parameterType="com.test.model.Test">
    INSERT INTO test(name, number)
    VALUES(#{name}, #{number})
    <selectKey resultType="java.lang.Integer" keyProperty="seq" order="AFTER">
        SELECT MAX(seq)+1 FROM test
    </selectKey>
</insert>

// Test
@Getter
@Setter
public Class Test {
    int seq;
    String name;
    String number;
}

위 코드를 살펴보자

보통 테이블의 Primary key 설정에 auto_increment 를 설정하게 되면 자동으로 +1을 해주면서 입력된다.

그래서 INSERT 할 때 Primary key를 입력해줄 필요가 없다.

order 를 AFTER 옵션을 설정하게 되면 입력된 데이터의 seq를 보낸 Test Object에 자동으로 설정하게 된다.

반응형

'Java > Spring' 카테고리의 다른 글

HashSet<T>  (0) 2021.08.25
JWT(Json Web Token)  (0) 2021.08.25
Spring - Dynamic Web Project 설정  (0) 2021.08.25
JVM, JRE, JDK 차이  (0) 2021.08.25
C언어와 Java 언어의 차이점  (0) 2021.08.25
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.