JdbcTemplate을 쓰는 이유
중복 되는 부분을 줄여서 엄청나게 길었던 코드를 단 2줄로 줄일 수 있는 것을 확인할 수 있다!
save
템플릿 엔진을 이용해서 Jdbc 리포지토리를 만든다.
SimpleJdbcInsert를 이용하면 쿼리문을 작성하지 않아도 DB에 데이터를 저장할 수 있다! 테이블(member)와 id, name 값만 있다면 insert 쿼리문을 작성할 수 있기 때문이다.
@Override
public Member save(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.executeAndReeturnKey(new MapSqlParameterSource(parameters));
member.setId(key.longValue());
return member;
}
findById
@Override
public Optional<Member> findByName(Long id) {
List<Member> result = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), id);
return result.stream().findAny();
}
findByName
@Override
public Optional<Member> findByName(String name) {
List<Member> result = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), name);
return result.stream().findAny();
}
findAll
@Override
public List<Member> findAll() {
//sql 결과를 리스트로 반환. resultset결과를 memberRowMapper()에서 객체로 맵핑.
return jdbcTemplate.query("select * from member", memberRowMapper());//객체 생성에 대한 것은 밑에서 콜백으로 정의.
}
RowMapper : 쿼리문을 작성해서 그 결과를 받아올 때 RowMapper로 객체를 맵핑시켜서 받는다!
private RowMapper<Member> memberRowMapper(){
//람다로 바꿀 수 있음!옵션 + 엔터
//jdbc
return (rs, rowNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
};
}