오늘이라도

[VI. 스프링 DB 접근 기술] 21. 스프링 JdbcTemplate 본문

인프런/스프링 입문 (김영한)

[VI. 스프링 DB 접근 기술] 21. 스프링 JdbcTemplate

upcake_ 2022. 1. 10. 21:47
반응형

https://github.com/upcake/hello-spring

강의 링크

 

* 오늘의 단축키 & 기능


1. 스프링 JdbcTemplate

- 순수 Jdbc와 동일한 환경설정을 하면 된다.

- 스프링 JdbcTemplate과 MyBatis 같ㅇ느 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해준다. 하지만 SQL은 직접 작성해야 한다.

- JdbcTemplateMemberRepository.java

public class JdbcTemplateMemberRepository implements MemberRepository {

    private final JdbcTemplate jdbcTemplate;

    //생성자가 딱 하나일 경우 자동으로 스프링 빈으로 등록되며, @Autowired를 생략할 수 있다.
    public JdbcTemplateMemberRepository(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public Member save(Member member) {
        //SimpleJdbcInsert 테이블 명, PK만으로 insert문을 만들 수 있다.
        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);
        return result.stream().findAny();
    }

    @Override
    public Optional<Member> findByName(String name) {
        List<Member> result = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), name);
        return result.stream().findAny();
    }

    @Override
    public List<Member> findAll() {
        return jdbcTemplate.query("select * from member", memberRowMapper());
    }

    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;
            }
        }
        */

        return (rs, rowNum) -> {
            Member member = new Member();
            member.setId(rs.getLong("id"));
            member.setName(rs.getString("name"));
            return member;
        };
    }
}

 

2. 스프링 설정

- SpringConfig.java

    @Bean
    public MemberRepository memberRepository() {
        //interface는 new가 안되므로 구현체를 return 해준다.
//        return new MemoryMemberRepository();
//        return new JdbcMemberRepository(dataSource);
        return new JdbcTemplateMemberRepository(dataSource);
    }

 

3. 통합 테스트

반응형