이용이유
Connection
획득
Statement
를 이용한 질의
ResultSet
을 이용한 질의결과 사용
Statement
, Connection
반납
- 위의 과정이 Jdbc API를 이용해서 data에 접근하기 위해서는 반복이 계속 되게 됨→ JDBC Template을 이용하여 반복 제거
- 어떠한 쿼리를 이용하게 될 지에 대한 부분이 매번 바뀌는 부분임 → template callback 패턴(토비의 스프링에 나옴) → 변경이 필요한 부분만 제공해서 간결한 코드를 작성하게 해주는 것이 JDBC Template!
- 그러나 JdbcTemplate을 이용하면 쿼리문과 코드가 섞이게 됨 → 유지보수가 힘들어짐 → 쿼리와 코드를 구분하기 위해 사용하는 것이 MyBatis
JDBC Template 이용
// config
@Configuration
public class JdbcTemplateConfig {
@Bean
public DataSource dataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUsername("root");
dataSource.setPassword("geunomysql!@#$");
dataSource.setUrl("jdbc:mysql://localhost:3306/book_manager?serverTimezone=UTC");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(){
return new JdbcTemplate(dataSource());
}
}
// repository
@Repository
public class StudentRepository {
private final JdbcTemplate jdbcTemplate;
public StudentRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void insert(Student... students){
for(Student student : students){
this.jdbcTemplate.update("insert into student (`name`, `id`, `age`) values (?, ?, ?)", student.getName(), student.getId(), student.getAge());
}
}
public List<Student> select(){
List<Student> result = this.jdbcTemplate.query("select id, name, age from student", (resultSet, rowNum) -> {
Student stu = new Student();
stu.setName(resultSet.getString(2));
stu.setAge(Integer.parseInt(resultSet.getString(3)));
stu.setId(Integer.parseInt(resultSet.getString(1)));
return stu;
});
return result;
}
}
- 메서드
- query → List 반환
- queryForObject → 한개 반환
- update — insert, delete, update query 실행
NamedParameterJdbcTemplate
- 내부적으로는 JdbcTemplate을 이용하고 sql에 파라미터 넣을 때
?
로 파라미터를 넘기던 것을 변수명으로 넘길 수 있도록 구현 해놓은 클래스임
return jdbcTemplate.queryForObject("SELECT * FROM customers WHERE customer_id = UUID_TO_BIN(:customerId);",
Map.of("customerId", customerId.toString()),
(rs, i) -> Optional.of(this.mapperToCustomer(rs, i)));