스프링 입문

Ch06. 스프링 DB 접근 기술 - 스프링 JdbcTemplate

webmaster 2021. 12. 1. 22:02
728x90
  • 순수 jdbc와 동일한 환경설정을 하면 된다.
  • JDBC API에서 본 반복 코드 대부분을 제거해 준다
    • 단, SQL 같은 경우 똑같이 작성해 주어야 한다.
public class JdbcTemplateMemberRepository implements MemberRepository{

    private final JdbcTemplate jdbcTemplate;

    //생성자가 딱 하나만 있을경우 @Autowire 를 생략할 수 있다.
    public JdbcTemplateMemberRepository(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @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.executeAndReturnKey(new
                MapSqlParameterSource(parameters));
        member.setId(key.longValue());
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        List<Member> result = jdbcTemplate.query("select * from member where id = ?",memberRowMapper(),id);
        //코드가 순수 jdbc보다 훨씬 줄었다.
        return result.stream().findAny();
    }

    @Override
    public Optional<Member> findByName(String name) {
        List<Member> result = jdbcTemplate.query("select * from member where name = ?",memberRowMapper(),name);
        //코드가 순수 jdbc보다 훨씬 줄었다.
        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;
        };
    }
}

memberRepository만 교체해준다.

  • 코드를 수정할 필요 없이 이전 Test를 수행해도 성공한다.
728x90