Gradle의 경우 아래와 같이 build.gradle에 라이브러리를 추가한다.
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
DB와의 연결을 위한 DB Server에 관한 정보(Property)를 설정한다.
DataSource는 Bean으로 등록되어 있어야 한다.
private final JdbcTemplate jdbcTemplate;
public JdbcTemplateItemRepository(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html
<T> T queryForObject(String sql, RowMapper<T> rowMapper, Object... args) throws DataAccessException;
queryForObject()를 이용한 단건 조회는 아래와 같다. 이때 조회 대상이 객체가 아닌 단순 데이터라면 타입을 아래와 같이 지정해줄 수 있다.
int rowCount = jdbcTemplate.queryForObject("select count(*) from t_actor",Integer.class);
preparedStatement ("?")를 이용해 파라미터 바인딩이 가능하다. ?
에 순서대로 파라미터가 들어가게 된다.
int countOfActorsNamedJoe = jdbcTemplate.queryForObject(
"select count(*) from t_actor where first_name = ?", Integer.class, "Joe");
public interface RowMapper<T> {
T mapRow(ResultSet rs, int rowNum) throws SQLException;
}
RowMapper는 데이터베이스의 반환 결과인 ResultSet을 객체로 변환해주는 클래스이다.
단순 데이터 타입 조회가 아닌 객체를 조회할 수 있다.
T mapRow(ResultSet rs, int rowNum) throws SQLException;
ResultSet rs에 결괏값을 담아와 사용자가 원하는 객체에 담는다. rowNum은 반복되는 루프 중 현재 행의 번호를 나타낸다.
public class MemberDao {
private JdbcTemplate jdbcTemplate;
public MemberDao(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public Member selectByEmail(String email) {
List<Member> results = jdbcTemplate.query(
"select * from MEMBER where EMAIL = ?",
new RowMapper<Member>() {
@Override
public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
Member member = new Member(
rs.getString("EMAIL"),
rs.getString("PASSWORD"),
rs.getString("NAME"),
rs.getTimestamp("REGDATE").toLocalDateTime());
member.setId(rs.getLong("ID"));
return member;
}
}, email);
return results.isEmpty() ? null : results.get(0);
}
...생략
}
JdbcTemplate 클래스는 SELECT 쿼리 실행을 위한 query() 메서드를 제공한다. query() 메서드는 sql 파라미터로 전달받은 쿼리를 실행하고 RowMapper를 이용해서 ResultSet의 결과를 자바 객체로 변환한다.
List<T> query(String sql, RowMapper<T> rowMapper)
List<T> query(String sql, Object[] args, RowMapper<T> rowMapper)
List<T> query(String sql, RowMapper<T> rowMapper, Object... args)
update() 메서드는 쿼리 실행 결과로 변경된 행의 개수를 INT로 리턴한다.
jdbcTemplate.update("insert into t_actor (first_name, last_name) values (?, ?)","Leonor", "Watling");
jdbcTemplate.update("update t_actor set last_name = ? where id = ?", "Banjo", 5276L);
jdbcTemplate.update("delete from t_actor where id = ?", Long.valueOf(actorId));
public class MemberDao {
private JdbcTemplate jdbcTemplate;
public MemberDao(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public void update(Member member) {
jdbcTemplate.update(
"update MEMBER set NAME = ?, PASSWORD = ? where EMAIL = ?",
member.getName(), member.getPassword(), member.getEmail());
}
// ...생략
}
이외에 임의의 SQL을 실행할 때는 execute() 메서드를 사용할 수 있다. 테이블을 생성하는 DDL 등에 사용할 수 있다.
jdbcTemplate.execute("create table mytable (id integer, name varchar(100))");
참고