글의 목적>
이번 글은 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;
}
'BackEnd > JDBC' 카테고리의 다른 글
[JDBC] DAO 리팩토링 2 - 하나의 Template 으로 이동 (0) | 2022.03.13 |
---|---|
[JDBC] DAO 리팩토링 1 - 개별 Template 만들기 (0) | 2022.03.12 |
[JDBC] 순수 JDBC CRUD 코드 (0) | 2022.03.12 |
[JDBC] PrepareStatement에서 TimeStamp, LocalDateTime 사용하기 (0) | 2022.03.06 |
[oracle] oracle 19c scott 계정 활성화 (13) | 2022.02.07 |
댓글