부스트코스 강의를 듣고 정리한 내용.
Spring JDBC
JDBC 프로그래밍을 하다보면 반복되는 개발 요소가 있다. 스프링 프레임워크는 이러한 JDBC의 모든 저수준 세부사항을 처리해준다.
동작 | 스프링 | 애플리케이션 개발자 |
---|---|---|
연결 파라미터 정의 (어떤 DB에 접속할 것인지 등등) | O | |
연결 오픈 | O | |
SQL문 지정 | O | |
파라미터 선언과 파라미터 값 제공 | O | |
statement 준비와 실행 | O | |
(존재한다면) 결과를 반복하는 루프 설정 | O | |
각 이터레이션에 대한 작업 수행 | O | |
모든 예외 처리 | O | |
트랜잭션 제어 | O | |
연결, statement, resultset 닫기 | O |
Spring JDBC 패키지
- org.springframework.jdbc.core: JDBC 템플릿 및 관련 helper 객체 제공 (JDBC 템플릿의 콜백 인터페이스 등등)
- org.springframework.jdbc.datasource: DataSource를 쉽게 접근하기 위한 util 클래스, 트랙잭션 매니저 및 다양한 DataSource 구현 제공
- org.springframework.jdbc.object: RDBMS 조회, 갱신, 저장 등을 thread-safe하고 재사용 가능한 객체 제공
- org.springframework.jdbc.support: jdbc.core 및 jdbc.object를 사용하는 JDBC 프레임워크를 지원
JDBC Template
- org.springframework.jdbc.core에서 가장 중요한 클래스
- 리소스 생성, 해지를 처리함으로써 연결을 닫는 것을 잊어 발생하는 문제 등을 피할 수 있도록 함
- statement의 생성과 실행 처리
- SQL 조회, 업데이트, 저장 프로시저 호출, ResultSet 반복 호출 등을 실행
- JDBC 예외가 발생할 경우 org.springframework.dao 패키지에 정의돼 있는 일반적인 예외로 변환시킴
jdbcTemplate SELECT 예제
열의 수 구하기
int rowCount = this.jdbcTemplate.queryForInt("select count(*) from t_acor");
변수 바인딩 사용하기
int countOfActorsNamedJoe = this.jdbcTemplate.queryForInt("select count(*) from t_actor where first_name=?", "Joe");
String 값으로 결과 받기
String lastName = this.jdbcTemplate.queryForObject("select last_name from t_actor where id=?", new Object[]{1212L}, String.class);
한 건 조회하기
Actor actor = this.jdbcTemplate.queryForObject(
"select first_name, last_name from t_actor where id=?",
new Object[]{1212L},
new RowMapper<Actor>() {
public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
Actor actor = new Actor();
actor.setFirstName(rs.getString("first_name");
actor.setLastName(rs.getString("last_name");
return actor;
}
}
);
여러 건 조회하기
List<Actor> actor = this.jdbcTemplate.query(
"select first_name, last_name from t_actor where id=?",
new RowMapper<Actor>() {
public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
Actor actor = new Actor();
actor.setFirstName(rs.getString("first_name");
actor.setLastName(rs.getString("last_name");
return actor;
}
}
);
중복 코드 제거 (1건 구하기와 여러 건 구하기가 같은 코드에 있을 경우)
public List<Actor> findAllActors() {
return this.jdbcTemplate.query("select first_name, last_name from t_actor", new ActorMapper());
}
private static final class ActorMapper implements RowMapper<Actor> {
public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
Actor actor = new Actor();
actor.setFirstName(rs.getString("first_name");
actor.setFirstName(rs.getString("last_name");
return actor;
}
}
jdbcTemplate INSERT 예제
INSERT, UPDATE, DELETE는 모두 update()
메소드를 이용해 실행한다.
this.jdbcTemplate.update("insert into t_actor(first_name, last_name) values (?, ?)", "Leonor", "Watling");
jdbcTemplate UPDATE 예제
this.jdbcTemplate.update("update t_actor set=? where id=?", "Banjo", 5276L);
jdbcTemplate DELETE 예제
this.jdbcTemplate.update("delete from t_actor where id=?", Long.valueOf(actorId);
JdbcTemplate 이외의 접근 방법
NamedParameterJdbcTemplate
- JdbcTemplate에서 JDBC statement 인자를 ?를 사용하는 대신 파라미터명을 사용하여 작성하는 것을 지원
SimpleJdbcTemplate
- JdbcTemplate과 NamedParameterJdbcTemplate 합쳐 놓은 템플릿 클래스
- 이제 JdbcTemplate과 NamedParameterJdbcTemplate에 모든 기능을 제공하기 때문에 삭제 예정될 예정(deprecated)
SimpleJdbcInsert
- 테이블에 쉽게 데이터 insert 기능을 제공