Jdbc Template는 순수 Jdbc와 동일한 환경설정(properties)를 사용하면 된다.
Jdbc Template 라이브러리는, 직접 Jdbc를 작성했을 때, 반복적인 코드를 대부분 제거한다.
하지만 SQL은 직접 작성한다.
똑같이 클래스 생성자를 구현하되, 살짝 다르다. (Injection이 불가 => DataSource로 Injection)
private final JdbcTemplate jdbcTemplate;
public JdbcTemplateRepository(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
SQL 쿼리의 결과물을 원하는 형태의 결과값으로 반환할 수 있는 함수이다.
Spring 공식 문서
This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.
private RowMapper<Member> memberRowMapper(){
return new RowMapper<Member>() {
@Override
public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
}
}
}
이를 lambda expression으로 바꿀 수도 있다고 하므로, 바꾸면 (opt+enter/alt+enter)
private RowMapper<Member> memberRowMapper(){
return (rs, rowNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
}
};
SQL query를 날릴 때, 파라미터로 해당 함수를 건네주면 된다.
public Optional<Member> findById(Long id) {
List<Member> result = jdbcTemplate.query("select * from member where id = ?",memberRowMapper());
return result.stream().findAny();
}
public Member saveMember(Member member) {
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", member.getName());
Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
member.setId(key.longValue());
return member;
};
앞 코드는, Primary-key (id) 랑, 테이블 이름(member), 열 이름 (name)으로 쿼리를 짤 필요 없이 SimpleJdbcInsert에서 알아서 다 처리를 해준다.
당연히 해당 DB를 SpringConfig에서 바꿔치기 해야겠다.