Web/Java+Spring

Spring JDBC

WakaraNai 2021. 6. 2. 14:39
728x90
반응형

Spring JDBC

  • JDBC를 사용하면 반복적인 코드가 많기에 저수준의 세부사항을 Spring이 처리해줌
  • 개발자는 필요한 부분만 개발하면 됨
    • (연결 파라미터 정의) : 이 사용자가 어떤 DB에 접속하게 할 건지
    • (SQL문 지정) : 어떤 테이블에 query문을 보낼지 등을 정함

Spring JDBC 패키지

org.springframework.jdbc.core

  • JdbcTemplate 및 관련 Helper 객체 제공

org.springframework.jdbc.datasource

  • DataSource를 쉽게 접근하기 위한 유틸 클래스, 트랜젝션매니져 및 다양한 DataSource 구현을 제공

org.springframework.jdbc.object

  • RDBMS 조회, 갱신, 저장등을 안전하고 재사용 가능한 객제 제공

org.springframework.jdbc.support

  • jdbc.core 및 jdbc.object를 사용하는 JDBC 프레임워크를 지원
  • SQL Exception 변환 기능 제공

 

JDBC Template

  • org.springframework.jdbc.core에서 가장 중요한 클래스
  • 리소스 생성, 해지를 처리해서 연결을 닫는 것을 잊어 발생하는 문제 등을 피할 수 있도록 합니다.
  • 스테이먼트(Statement)의 생성과 실행을 처리
  • SQL 조회, 업데이트, 저장 프로시저 호출, ResultSet 반복호출 등을 실행
  • JDBC 예외가 발생할 경우 org.springframework.dao패키지에 정의되어 있는 일반적인 예외로 변환시킴

 

JDBC Template - select

열의 수 구하기

몇 건의 데이터가 들어있는지 확인

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 값으로 결과 받기

queryForInt가 아닌 queryForObject 사용

세번째 파라미터로 반환값의 타입을 지정할 수 있음

이곳에 String.class를 사용하면 된다 

String lastName = this.jdbcTemplate.queryForObject("select last_name from t_actor where id = ?"
	, new Object[]{1212L}
    , String.class
 ); 

 

한 행(ROW) 조회하기

한 행에도 여러 개의 컬럼이 존재하는데 해당 컬럼을 원하는 객체에 맵핑해줘야 함

이를 위해 RowMapper 객체를 상속받은 이름 없는 객체를 이용하여

mapRow() 메소드를 오버라이딩

한 건의 결과가 ResultSet에 담겨 있기 때문에 그 안의 값을 Actor에 담아서 반환

결국, 한 행의 데이터를 조회에서 객체에 담아서 반환하는 일을 하게 됨

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;
    }
});

 

여러 행 조회하기

이번에는 query() 메소드를 이용

여러 건이기에 List로 반환

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;
    }
  });

 

중복 코드 제거

(1건 구하기와 여러 건 구하기와 같은 코드에 있을 경우!)

query() 메소드 실행을 별도의 메소드로 추출하여 그 안에서 호출함으로써

코드의 중복을 방지

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;
  }
}

 

 

JDBC Template - insert

query가 아닌 update() 메소드 사용

this.jdbcTemplate.update("insert into t_actor (first_name, last_name) values (?, ?)"
,  "Leonor", "Watling");

 

JDBC Template - update

query가 아닌 update() 메소드 사용

this.jdbcTemplate.update("update t_actor set = ? where id = ?",  "Banjo", 5276L);

 

JDBC Template - delete

query가 아닌 update() 메소드 사용

this.jdbcTemplate.update("delete from actor where id = ?", Long.valueOf(actorId));

 

 

JDBC Template 외의 접근방법

NamedParameterJdbcTemplate

  • JdbcTemplate에서 JDBC statement 인자를 ?를 사용하는 대신 파라미터명을 사용하여 작성하는 것을 지원
    • ?가 여러개 나오면 문자열로된 이름보다 이렇게 적는 게 나음
  • NamedParameterJdbcTemplate 예제

SimpleJdbcTemplate

  • JdbcTemplate과 NamedParameterJdbcTemplate 합쳐 놓은 템플릿 클래스
  • insert 작업을 쉽게 할 수 있도록 도와줌
  • 이제 JdbcTemplate과 NamedParameterJdbcTemplate에 모든 기능을 제공하기 때문에 삭제 예정될 예정(deprecated)
  • SimpleJdbcTemplate 예제

SimpleJdbcInsert

728x90
반응형

'Web > Java+Spring' 카테고리의 다른 글

Spring MVC  (0) 2021.06.04
Spring JDBC - DTO/DAO  (0) 2021.06.02
JAVA Config  (0) 2021.06.02
Spring IoC/DI 컨테이너  (0) 2021.06.01
Spring Framework  (0) 2021.05.31