본문 바로가기

Spring/Mybatis

[Mybatis]Spring쇼핑몰 프로젝트 - selectKey 태그로 auto increment / currval 값 가져오기

판매자 기능 중 상품을 업로드할 때 아래와 같은 순서로 데이터를 입력해야한다.

1. goods테이블에 상품정보 데이터 insert

2. option테이블에 상품 옵션정보 데이터 insert

 

여기서 option테이블은 goods테이블의 gds_num(AI, PK)를 fk로 참조하고있다.

gds_num은 pk이기 때문에 insert가 끝난 뒤 select를 통해 값을 받아오기가 힘들다.

그렇기 때문에 하나의 요청에서 1번 insert가 끝난 직후 auto increment / currval 값을 돌려받고,

그 값을 setter메소드로 값을 설정하여 2번insert를 수행해야 한다.

 

insert의 경우 retrun값은 1 또는 0이기 때문에,

selectKey 태그를 활용하여 auto increment / currval 값을 가져와야 한다.

1-1. MySQL - goodsMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<insert id="goods_insert" parameterType="goods">
    insert into goods
    (lcate_code, mcate_code, scate_code, gds_seller, gds_name, gds_thumbnail, gds_date,
    gds_price, gds_detail, deltem_num,
    gds_ears, gds_readcount, gds_sellcount, gds_viewyn)
    values
    (#{lcate_code}, #{mcate_code}, #{scate_code}, #{gds_seller}, #{gds_name}, #{gds_thumbnail}, now(),
    #{gds_price}, #{gds_detail}, #{deltem_num},
    #{gds_ears}, 0, 0, 'Y')
    <selectKey keyProperty="gds_num" resultType="int" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
</insert>
cs

1-2. Oracle - goodsMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<insert id="goods_insert" parameterType="goods">
    insert into goods
    (gds_num, lcate_code, mcate_code, scate_code, gds_seller, gds_name, gds_thumbnail, gds_date,
    gds_price, gds_detail, deltem_num,
    gds_ears, gds_readcount, gds_sellcount, gds_viewyn)
    values
    (sq_gds_num.NEXTVAL, #{lcate_code}, #{mcate_code}, #{scate_code}, #{gds_seller}, #{gds_name}, #{gds_thumbnail}, sysdate,
    #{gds_price}, #{gds_detail}, #{deltem_num},
    #{gds_ears}, 0, 0, 'Y')
    <selectKey keyProperty="gds_num" resultType="number" order="AFTER">
        SELECT sq_gds_num.CURRVAL FROM DUAL
    </selectKey>
</insert>
cs

selectkey태그의 속성

  • keyProperty : 결과값이 저장될 컬럼명
  • resultType : 결과값의 데이터타입
  • order : 해당 쿼리의 실행순서, After로 설정하면 insert 구문을 실행한 뒤에 selectKey 구문을 실행한다.

2. GoodsController.java

1
2
3
4
5
6
7
8
9
10
11
// 1. goods insert
GoodsVO goods = request.getParameter("goods");     // 입력한 상품정보 받아오기
goodsService.goods_insert(goods);                  // 저장 메소드 호출
int gds_num = goods.getGds_num();                  // selectKey 결과값 받아오기
 
// 2. option insert
OptionVO option = new OptionVO();
String opt_count = request.getParameter("opt_count"); // 옵션 수량 받아오기
option.setGds_num(gds_num);                         // setter 메소드로 selectKey 결과값 넣기
option.setOpt_count(Integer.parseInt(opt_count));
optionService.option_insert(option);
cs

selectkey의 결과값은 controller에서 위와 같이 받아올 수 있다.