JdbcTemplate SQL Mapper
- 스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API의 반복 코드를 제거해준다. (ResultSet, Connection 등등)
- SQL은 직접 작성 해야한다.
public class JdbcTemplateMemberRepository implements MemberRepository{
private final JdbcTemplate jdbcTemplate;
@Autowired
public JdbcTemplateMemberRepository(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Optional<Member> findByEmail(String email) {
List<Member> result = jdbcTemplate.query("select * from member where email = ?", memberRowMapper());
return result.stream().findAny();
}
@Override
public List<Member> findAll() {
return jdbcTemplate.query("select * from member", memberRowMapper());
}
private RowMapper<Member> memberRowMapper() {
return (rs, rowNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
};
- 생성자가 하나일 때는 @AutoWired 생략 가능
Template
- 디자인 패턴 - 템플릿 메서드 패턴
- 상속을 통해 슈퍼 클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법
- 변하지 않는 기능은 슈퍼 클래스에 만들어둔다.
- 자주 변경되며 확장할 기능은 서브 클래스에서 만들도록 한다.
SimpleJdbcInsert
@Override
public Member save(Member member) {
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("member").usingGenerateKeyColumns("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;
}