BackEnd/JDBC

[JDBC] INSERT에 대한 자동 생성 키 값 검색하기

샤아이인 2022. 3. 4.

 

글의 목적>

이번 글은 JDBC 를 통해 직접 SQL문을 연습하면서 데이터를 삽입하던 중, DBMS에서 auto_increment로 인해 데이터를 삽입할 때 자동으로 할당해주는 id값을 어떤 방식으로 반환받을지? 이에 대하여 작성한 글 입니다.

 

1. 자동 증가 특성

자동 증가 특성(auto_increment)은 JDBC 프로그램에서 자동 생성된 키를 말한다.

이 키값을 검색하여 사용하려면, 자동 생성된 키 값을 검색할 SQL을 삽입할 시기를 명시적으로 표시해야 한다.

 

이를 수행하기 위하여 Connection.prepareStatement, Statement.executeUpdate 또는 Statement.execute 메소드를 호출하여 플래그값을 추가로 전달해야만 합니다! 예를 들어 다음과 같이 말이죠!

pstmt = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);

두번째 인자로 Flag 값을 전달하였습니다.

 

이때, 실행된 명령문은 INSERT or INSERT within SELECT 문이어야 하며, 다른 명령문의 경우 JDBC 드라이버가 플래그를 설정하는 매개변수를 무시해버립니다.

 

2. 사용 방법

  • PreparedStatement.executeUpdate 메소드를 사용하여 행을 삽입하려는 경우
    Connection.prepareStatement(sql statement, Statement.RETURN_GENERATED_KEYS);
  • Statement.executeUpdate 메소드를 사용하여 행을 삽입할 경우
    Statement.executeUpdate(sql statement, Statement.RETURN_GENERATED_KEYS);
  • Statement.execute 메소드를 사용하여 행을 삽입할 경우
    Statement.execute(sql statement, Statement.RETURN_GENERATED_KEYS);

이후 얻어온 statement 의 getGeneratedKeys() 메서드를 통해 자동 삽입된 id가 담긴 resultset을 반환받을 수 있습니다.

 

3. 예시 코드

public Long save(User user) {
    String SQL = "INSERT INTO user_info (user_id, password, name, email) VALUES (?, ?, ?, ?)";
    Connection connection = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    
    try {
        connection = getConnection();
        pstmt = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
        pstmt.setString(1, user.getUserId());
        pstmt.setString(2, user.getPassword());
        pstmt.setString(3, user.getName());
        pstmt.setString(4, user.getEmail());
        pstmt.executeUpdate();

        rs = pstmt.getGeneratedKeys(); // getGenenrateKeys를 사용하여 값을 얻어옴
        if (rs.next()) {
            user.setId(rs.getLong(1));
            return user.getId();
        }
        return -1L;
    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        close(connection, pstmt, rs);
    }
    return -1L;
}

댓글