본문 바로가기
Spring

[Spring] MyBatis에서 selectkey 사용

by jane.dev 2021. 9. 18.
반응형

2021.08.22 - [SQL] - [SQL, JSP] 방금 INSERT 한 데이터의 PK 값을 받아오기

 

[SQL, JSP] 방금 INSERT 한 데이터의 PK 값을 받아오기

프로젝트를 하는 도중 추가할 기능이 생김 ( 기존 영화 정보를 입력하는 Form에 영화 티저 동영상 주소를 입력하는 Form을 추가 ) 1. 기존 테이블에서 컬럼을 추가하지 않고 새로 테이블을 생성해

wheneveryouwantsz.tistory.com

 

(JSP 프로젝트 진행시 정말 쓰고싶던 기능인데 벌써 시간이 지나 MyBatis도 배우고 포스팅을 작성한다.. 감개무량..)

 

테이블 구성

CREATE SEQUENCE spe_num;

CREATE TABLE spe_tbl(
    bno NUMBER(10, 0) PRIMARY KEY,	/* 글번호 */
    title VARCHAR2(200) NOT NULL,	/* 글제목 */
    content VARCHAR2(2000) NOT NULL,	/* 글본문 */
    writer VARCHAR2(50) NOT NULL,	/* 글쓴이 */
    regdate DATE default SYSDATE,	/* 작성일 */
    updatedate DATE default SYSDATE	/* 수정일 */
);

 

글번호에 해당하는 bno 컬럼은 아래와 같이 생성한 시퀀스에 '시퀀스명.nextval' 로 데이터를 삽입해 어떠한 숫자가 입력되는지 알 수 없음

INSERT INTO spe_tbl (bno, title, content, writer) 
	VALUES (spe_num.nextval, 'testtitle', 'testcontent', 'testwriter');

 

이렇게 INSERT 구문을 실행해 데이터가 입력될 때, 어떠한 컬럼에 들어갈 값을 미리 확인할 수 있게 하는 것이 selectKey


mapper 관련해서는 게시물 참고 →  2021.09.14 - [Spring] - [Spring] Mapper 인터페이스와 Mapper.xml


mapper.xml

<insert id="insertSelectKey">
    <selectKey keyProperty="bno" resultType="long" order="BEFORE">
        SELECT spe_num.nextval FROM DUAL
    </selectKey>
    INSERT INTO spe_tbl (bno, title, content, writer) VALUES (#{bno}, #{title}, #{content}, #{writer})
</insert>

<insert> 태그의 id 속성에는 mapper 인터페이스에서 선언한 메서드명 작성

<selectKey> 태그의

  • keyProperty 속성에는 컬럼명,
  • resultType 속성에는 해당 컬럼의 타입,
  • order 속성에는 INSERT 문 수행전에 SELECT 문을 실행하기 때문에 BEFORE 작성

 

mapper.java

public interface Mapper{
    public void insertSelectKey(BoardVO vo);
}

 

MapperTest.java

테스트 코드 작성

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class MapperTest {
    @Autowired
    private Mapper mapper;
    
    @Test
    public void testInsertSelectKey(){
        BoardVO vo = new BoardVO();
        vo.setTitle("testSelectKey");
        vo.setContent("testSelectKey");
        vo.setWriter("testSelectKey");
        mapper.insertSelectKey(vo);
    }
}

 

테스트 실행 결과

selectKey로 조회된 값

 

insert 구문 실행되어 삽입된 값