Spring JDBC 개념

oyeon·2021년 1월 18일
0
post-custom-banner
  • JDBC 프로그래밍의 반복적 요소를 Spring이 처리해준다.

Spring vs 개발자

동작Spring개발자
connection 파라미터 정의O
connection 오픈O
SQL문 지정O
파라미터 선언과 파라미터 값 제공O
statement 준비, 실행O
(존재시) resultset을 반복하는 루프 설정O
각 iteration에 대한 작업 수행O
모든 예외 처리O
트랜잭션 제어O
connection, statment, resultset 닫기O

Spring JDBC 패키지

Spring JDBC 패키지설명
org.springframework.jdbc.coreJdbcTemplate 및 관련 Helper 객체 제공
org.springframework.jdbc.datasourceDataSource를 쉽게 접근하기 위한 유틸 클래스, 트랜젝션매니저 및 다양한 DataSource 구현을 제공
org.springframework.jdbc.objectRDBMS 조회, 갱신, 저장등을 안전하고 재사용 가능한 객제 제공
org.springframework.jdbc.supportjdbc.core 및 jdbc.object를 사용하는 JDBC 프레임워크를 지원

JDBC Template 클래스

  • org.springframework.jdbc.core에서 가장 중요한 클래스
  • 리소스 생성, 해지를 처리해 connection을 close하는 것을 잊어 발생하는 문제 등을 피할 수 있게 함
  • Statement의 생성과 실행 처리
  • SQL 조회, 업데이트, 저장 프로시저 호출, resultset 반복 호출 등을 실행
  • JDBC 예외가 발생할 경우 org.springframework.dao 패키지에 정의되어 있는 일반적인 예외로 변환

JDBC Template 예제

  • 열의 수 구하기
int rowCount = this.jdbcTemplate.queryForInt("select count(*) from t_actor");
  • 변수 바인딩 사용
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);
  • 한 건 조회하기
    RowMapper - 한 행에 여러 개의 컬럼이 존재하는데, 해당 컬럼들을 원하는 객체에 Mapping 할 때 사용
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> actors = this.jdbcTemplate.query(
  "select first_name, last_name from t_actor",
  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;
    }
  });
  • 중복 코드 제거(한 건 조회, 여러 건 조회가 같은 코드에 있을 경우)
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.setLastName(rs.getString("last_name"));
    return actor;
  }
}
  • INSERT
this.jdbcTemplate.update(
"insert into t_actor (first_name, last_name) values (?, ?)",  "Leonor", "Watling");
  • UPDATE
this.jdbcTemplate.update(
"update t_actor set = ? where id = ?",  "Banjo", 5276L);
  • DELETE
this.jdbcTemplate.update(
"delete from actor where id = ?", Long.valueOf(actorId));

JDBC Template 외의 접근 방법

  • NamedParameterJdbcTemplate - ? 을 사용하는 대신 파라미터명을 사용하여 바인딩.
  • SimpleJdbcTemplate
  • SimpleJdbcInsert
profile
Enjoy to study
post-custom-banner

0개의 댓글