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
- 테이블에 쉽게 데이터 insert 기능을 제공
- 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 |