Spring

[JDBC] Insert 쿼리 실행 시 KeyHolder를 이용해서 자동 생성 키 값 구하기

ID 값이 AUTO_INCREMENT 인 경우, Insert 쿼리 실행 시 ID 값을 value로 직접 지정해주지 않는다. (왜냐하면? 자동 생성되기 때문!)

그런데, 어떠한 엔티티를 테이블에 삽입하고 나서 그 엔티티에게 할당된 아이디 값을 전달받고 싶은 경우에는 어떻게 해야할까?

JDBCTemplate은 자동으로 생성된 키 값을 구할 수 있는 방법을 제공하는데, 그것은 바로 KeyHolder이다.

public void insert(final Member member) {
    KeyHolder keyHolder = new GeneratedKeyHolder();
    jdbcTemplate.update((Connection con) -> {
        PreparedStatement pstmt = con.prepareStatement(
            "insert into MEMBER (..)" + "values (?, ?, ?, ?)",
            new String[]{"ID"});
        pstmt.setString(1, ..);
        // setString 을 통해 ? 에 값을 할당한다.
        return pstmt;
    }, keyHolder);

코드에 대한 설명을 추가하자면

1. GeneratedKeyHolder 객체를 생성한다. 이 클래스는 자동 생성된 키 값을 구해주는 KeyHolder 구현 클래스이다.

2. update() 메서드는 PreparedStatementCreator 객체와 KeyHolder 객체를 파라미터로 갖는다.

3. PreparedStatement 객체를 생성하는데 두 번째 파라미터로 String 배열인 ["ID"]를 주었다. 이 두번째 파라미터는 자동 생성되는 키 칼럼 목록을 지정할 때 사용한다. MEMBER 테이블은 ID 칼럼이 auto_increment 칼럼이므로 두번째 파라미터 값으로 ID를 준다.

4. JdbcTemplate.update() 메서드의 두번째 파라미터로 KeyHolder 객체를 전달한다.

5. KeyHolder에 보관된 값은 getKey() 메서드를 이용해 구할 수 있다.

Number keyValue = keyHolder.getKey();

 

위 insert 메서드를 실행할 때 커넥션과 pstmt를 닫아줘야하는지 의문이 생겨서 찾아봤는데, 여기에서 체크된 답변에 의하면 닫아주지 않아도 된다는 것 같은데 다시 리뷰어분께 여쭤봐야겠다!
 stackoverflow.com/questions/20419785/does-springs-jdbctemplate-close-the-connection-after-query-timeout

 

Does Spring's JdbcTemplate close the connection after query timeout?

I have set query timeout (getJdbcTemplate().setQueryTimeout(5)) in method with insert statement. What will happen after query timeout, does jdbc template close my connection?

stackoverflow.com