selectKey란?
간혹 insert 작업하기전에 select한 값이 필요하거나, insert한 후에 생성값이 필요한 경우가 있다.
이런 경우 java에서
쿼리를 여러번 실행시키면 해결 할 수 있다
.
하지만 이 방법의 경우 불필요하게 여러번 db입출력하여 속도가 약간 느려지기도 하고 작성하기 복잡하기도 하다.
이경우 selectKey를 사용하면 한번에 실행시킬수 있다.
selectKey 사용법
selectKey는 옵션에 따라 2가지 방식으로 사용할 수 있다.
- order="BEFORE" : 삽입 쿼리 실행 전에 selectKey 쿼리가 실행된다.
- order="AFTER" : 삽입 쿼리 실행 후에 selectKey 쿼리가 실행된다.
selectKey에는 order 속성이외에 keyProperty, resultType가 있다.
- keyProperty : selectKey 쿼리에서 반환된 값을 매퍼 객체의 특정 프로퍼티에 매핑할때 사용한다. 이후 insert에서 이 값을 사용할 수 있다.
- resultType : selectKey 쿼리의 반환 타입을 지정한다.
order="BEFORE"
insert할때 특정 값이 필요한 경우가 있다.
아주아주 간단하게 예를 들면 오라클-"Sequence", MYSQL- "AUTO_INCREMENT" 같이 자동으로 값이 증가하는 기능을 대신 해서 아래와 같이 작성할 수 있다.
<insert id="insertProduct" parameterType="Product">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
SELECT COALESCE(MAX(PROD_ID), 0) + 1 FROM PRODUCT
</selectKey>
INSERT INTO PRODUCT (
PROD_ID,
NAME,
PRICE
)
VALUES (
#{id}, //selectKey에서 찾은 id값을 넣음
#{name},
#{price}
)
</insert>
order="AFTER"
insert를 한 이후에 id가 필요한 경우가 있다
이 경우 아래와 같이 사용할 수 있다.
<insert id="insertProduct" parameterType="Product">
INSERT INTO PRODUCT (
NAME,
PRICE
)
VALUES (
#{name},
#{price}
)
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>
이후 자바에서 Product 객체에서 반환된 ID값을 사용할수 있다
예를 들어 Spring boot에서는 아래와 같이 사용할 수 있다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@Autowired
private ProductMapper productMapper;
public void addProduct(Product product) {
// 삽입 메서드 호출
productMapper.insertProduct(product);
// 삽입된 제품의 ID를 사용할 수 있음
Integer productId = product.getId();
}
}
mapper는 생략헀다.
'궁금하다' 카테고리의 다른 글
@RequestParam와 @PathVariable의 차이점 (0) | 2024.08.13 |
---|---|
[JAVA] Call by Reference는 존재하지 않는 이유 (0) | 2024.05.30 |
[JAVA] 왜 String 타입은 해시코드를 출력하지 않을까? (0) | 2024.05.20 |