Develop

[Mybatis] PK 를 count 혹은 max 쿼리로 생성 후 리턴받기

issuemaker99 2024. 9. 3. 16:45
728x90

insert 쿼리에서 pk 를 count 나 max 쿼리에 +1 을 하는 형태가 있을 수 있다.

이때 만들어진 pk 값을 다른 상세테이블이나 연계 테이블에 사용해야할 경우 리턴받아야 한다.

 

▶ selectKey 를 사용해서 pk 로 사용할 쿼리를 작성 한다.

 - resultType 은 데이터형태를 지정한다. 

 - keyProperty 는 받을 변수명이다 parameterType 의 model 파일에 존재해야 한다. 

 - order 는 쿼리 실행전인지 실행후인지를 결정한다. after 는 당연히 실행후겠죠

<insert id="insertOrderMst" parameterType="orderMstDto">
        <selectKey resultType="string" keyProperty="ordNo" order="BEFORE">
            SELECT F_COMMON_DOCNO('od_order_mst')
        </selectKey>
        INSERT INTO od_order_mst
        (ord_no, site_cd, ord_dt, ord_kind, ord_stat,
         member_no, prdamt_tot, prdqty_tot, dcamt_tot, promdcamt_tot,
         cpndcamt_tot, use_pt, deliveryamt_tot, ordamt_net, add_pt,
         remain_pt, grade_cd, age_cd, ord_user, ord_mobile,
         ord_zipcd, ord_addr1, ord_addr2, dlv_user, dlv_mobile,
         dlv_zipcd, dlv_addr1, dlv_addr2, dlv_reason, device_fl,
         active_yn, reg_dt, reg_usr)
        VALUES(#{ordNo}, #{userDto.siteCd}, now(), 'SAL', 'S00',
            #{userDto.memberNo}, #{prdamtTot}, #{prdqtyTot}, #{dcamtTot}, #{promdcamtTot},
            #{cpndcamtTot}, #{usePt}, #{deliveryamtTot}, #{ordamtNet}, #{addPt},
            #{remainPt}, #{userDto.gradeCd}, #{userDto.ageCd}, #{ordUser}, #{ordMobile},
            #{ordZipcd}, #{ordAddr1}, #{ordAddr2}, #{dlvUser}, #{dlvMobile},
            #{dlvZipcd}, #{dlvAddr1}, #{dlvAddr2}, #{dlvReason}, #{deviceFl},
            'N', now(), #{userDto.memberNo})
    </insert>

 

▶ parameterType 에서 정의된 model 에 orderNo 가 존재한다.

public class OrderMstDto extends CommonDto {
    private String ordNo;
    private String siteCd;
    private String ordDt;
    private String ordKind;
    ...
	...
}

 

▶ insert 쿼리 실행 후 orderNo 를 확인해 보면 값이 바인딩된 것을 알 수 있다.

orderMapper.insertOrderMst(orderMstDto);
log.debug(orderMstDto.getOrdNo());
LIST