BackEnd/RDBMS

[SQL_MyBatis] Insert문 실행하고 추가된 행의 원하는 컬럼 값 리턴받기 (selectKey사용)

Cune 2022. 4. 7. 14:35

저는 MyBatis과 Oracle를 사용했습니다.

 

 

<Xml파일-변경 전/후>

<insert id="writeBbsApp" parameterType="com.proj.test.dto.BbsDto">
    INSERT INTO EATAEWONBBS
        (SEQ, ID, NICKNAME, TITLE, CONTENT,PICTURE, HASHTAG, WDATE, SHOPNAME,
        ADDRESS, LATITUDE, LONGITUDE, READCNT,LIKECNT,shopphnum,shopurl, testurl)
    VALUES
        (bbsseq.NEXTVAL, #{id}, #{nickname}, #{title}, #{content}, 0, #{hashtag}, SYSDATE,
         #{shopname}, #{address}, #{latitude},#{longitude}, 0, 0,#{shopphnum},#{shopurl},#{testurl})
</insert>

원래 SEQ값을 만들어둔 bbsseq라는 시퀀스로 자동증가하게 해둔 상태인데 글을 쓸고나서 자동증가하는 seq값을 알고싶을때 select문을 한번 더 써야되는 번거로움을 줄이고자 알아봤다.

그러다가 selectKey로 insert,update,delete문에서 컬럼값을 얻어올 수 있다는걸 알고 적용해봤다.

 

 

<insert id="writeBbsApp" parameterType="com.proj.test.dto.BbsDto">
    INSERT INTO EATAEWONBBS
        (SEQ, ID, NICKNAME, TITLE, CONTENT,PICTURE, HASHTAG, WDATE, SHOPNAME,
        ADDRESS, LATITUDE, LONGITUDE, READCNT,LIKECNT,shopphnum,shopurl, testurl)
    VALUES
        (#{seq}, #{id}, #{nickname}, #{title}, #{content}, 0, #{hashtag}, SYSDATE,
         #{shopname}, #{address}, #{latitude},#{longitude}, 0, 0,#{shopphnum},#{shopurl},#{testurl})
    <selectKey resultType="java.lang.Integer" keyProperty="seq" order="BEFORE">
        SELECT bbsseq.nextval
        FROM DUAL
    </selectKey>
</insert>

resultType에는 select로 조회해서 리턴받을 값의 타입을 쓰는 곳으로 seq값은 Integer기때문에 저렇게 작성했다.

그리고 keyProperty에는 select로 조회해서 받을 변수명으로 작성했다.

order에는 insert문 전/후에 실행한건지 정하는 곳으로 먼저 시퀀스값 증가를 해야하니까 before로 했다.

테이블명 자리에는 dual로 임시테이블을 넣었다.

 

<Service파일-변경 전/후>

public int writeBbsApp(BbsDto dto) {
   int n = dao.writeBbsApp(dto);
   return seq;
}
public int writeBbsApp(BbsDto dto) {
   int n = dao.writeBbsApp(dto);
   int seq= dto.getSeq();
   System.out.println("seq 확인: " + seq);
   System.out.println("글저장 성공여부 "+n);
   return seq;
}

그리고 service부분에서 dto.getSeq를 통해서 selectKey로 조회한 seq값을 리턴받으면 된다!

이렇게하면 새로 작성한 글을 db에 저장하고 방금 저장된 그 글의 seq값을 한번에 알아올 수 있다 기억하자!!