티스토리 뷰

반응형

★관련 링크

Spring과 DB이야기 - 1. DataSource와 JdbcTemplate

Spring과 DB이야기 - 3. Transaction 처리



 지난 포스팅에서 DataSource의 개념과 Spring에서 DataSource를 활용한 JdbcTemplate으로 간단한 SELECT 쿼리를 작성해봤다. 이번 포스팅에서는 UPDATE와 INSERT에 대해 짚어보겠다.



 


 JdbcTemplate을 활용하여 INSERT, UPDATE, DELETE 쿼리를 실행할 때는, update() 메소드를 사용하면 된다. update() 메소드는 아래와 같다.


- int update(String sql)


- int update(String sql, Object... args)


 int 형태의 리턴을 하는데, 쿼리 실행 결과로 변경된 행의 개수를 리턴한다. 아래와 같이 사용하는 것이 대표적이다.


public class StudentDao {

    private JdbcTemplate jdbcTemplate;

    public StudentDao (DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    public void update (Student student) {
        jdbcTemplate.update("UPDATE STUDENT SET NAME = ? WHERE EMAIL = ?",
                student.getName(), 
                student.getStudentNum(), 
                student.getEmail());
    }
}



 그런데 PreparedStatement를 활용하여 SQL을 실행하고 싶을 수 있다. 그럴 경우, PreparedStatementCreator로 SQL을 따로 처리해주어야한다. 


 한편, MySQL에서 AUTO_INCREMENT컬럼을 지정하여 PK로 활용하는 경우가 있다. update() 메소드는 변경된 행의 개수만 리턴하므로 자동 생성 된 키 값을 알아낼 수 없다. 이럴 땐 KeyHolder를 사용해야 한다. 위의 두가지 상황을 처리한 예제를 살펴보자.


public void update (Student student) {

    KeyHolder keyHolder = new GeneratedKeyHolder();
    jdbcTemplate.update(new PreparedStatementCreator() {

        @Override
        public PreparedStatement createPreparedStatement(Connection con)
                throws SQLException{

            PreparedStatement pstmt = con.prepareStatement(
                    "INSERT INTO STUDENT(STUDENT_NUM, EMAIL, NAME)" +
                            "VALUES (?, ?, ?, ?)",
                    new String[]{"ID"}
                    // 두번째 파라미터에 자동생성되는 컬럼의 이름을 넣음.
            );
            pstmt.setString(student.getStudentNum);
            pstmt.setString(student.getEmail);
            pstmt.setString(student.getName);

            return pstmt;
    }
        }, keyHolder); // update() 메소드의 두번째 파라미터로 keyHolder 전달

        int KeyValue = keyHolder.getKey().intValue();
}

 먼저, PreparedStatement를 사용했다. SQL을 파라미터로 하는 대신, PreparedStatementCreator를 익명 클래스로 생성하여 PreparedStatement를 생성하는 메소드를 오버라이드 한 후 이를 적절하게 구현했다.


 한편, KeyHolder라는 것을 활용해서 자동 생성되는 컬럼의 값을 가져왔다. KeyHolder활용 시, 일반적인 PreparedStatement 활용과 update() 메소드 활용에서 파라미터가 하나씩 더 필요함에 유의하자.






-끝-



★관련 링크

Spring과 DB이야기 - 1. DataSource와 JdbcTemplate

Spring과 DB이야기 - 3. Transaction 처리





출처 및 참고 최범균, 

『스프링4 프로그래밍 입문』, 가메출판사(2015) 

https://docs.spring.io/ 

https://www.journaldev.com/





«   2022/05   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
글 보관함
Total
800,128
Today
22
Yesterday
127