스프링/0. 입문, 전체방향

18강. Jdbc 템플릿

sdafdq 2023. 7. 9. 21:00

실무에서 자주 씀

public class JdbcTemplateMemberRepository implements MemberRepository{

    private JdbcTemplate jdbcTemplate;

    @Autowired
    public JdbcTemplateMemberRepository(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
    }


    @Override
    public Member save(Member member) {
        SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);   //간단 jdbc인서트. 인서트용 객체
        jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");  //generated key 를 id로 지정
                                                                                         //jdbcInsert로 열 지정
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("name", member.getName());   //Map을 만들어 member.name의 키와 값 지정

        Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters)); //키를 만들어 excute(쿼리)를 날리고 key를 return 받음.
                                                                                            //insert기능을 하는 SimpleJdbcInsert에 excute하고 key를 return받는 함수.
                                                                                            //거기에 인자는 parameter인 "name":member.getName() Map<>을 넣음
        member.setId(key.longValue());
        return member;
    }
    /*
    1. 인서트용 객체 생성 SimpleJdbcInsert            //insert
    2. "id"를 generated key로 지정 + 테이블 member로 지정  //insert into member
    3. DB에 넣어줄 값, key와 value를 Map<>으로 만듦.
        parameters.put("name", member.getName());
    4. jdbc 인서트하는 객체로 쿼리를 날리면서(execute) key를 받아옴 (ReturnKey)
        인자로는 sql을 날리기 위한 값, parameters를 넣음.
    */

    @Override
    public Optional<Member> findById(Long id) {
        List<Member> result = jdbcTemplate
                .query("select * from member where id = ?", memberRowMapper(), id);  //query는 조회. 
        return result.stream().findAny();   //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(){    //이 부분은 솔직히 잘 모르겠다. 아, query 했을 때 return 해 주는 List의 개별 요소들은 memberRowMapper 형태란 뜻인가?
        return (RowMapper<Member>) (rs, rowNum) -> {
            Member member = new Member();
            member.setId(rs.getLong("id"));
            member.setName(rs.getString("name"));
            return member;
        };
    }
}

 

save 부분은 잘 모르겠음. 아마 DB에 좀더 익숙해 져야 할 듯.

insert기에 따로 지정하는 건 필요 없을 듯. 아마 table만 지정하는거고, 

usingGeneratedKeyColumns는 여기 자동으로 +1 하라고 값을 주는 의미인 듯

dataSource는 말 그대로 데이터 경로같고.

 

 

@Configuration
public class SpringConfig {
    private DataSource dataSource;

    @Autowired
    public SpringConfig(DataSource dataSource){
        this.dataSource = dataSource;
    }
    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }

//    @Bean
//    public MemberRepository memberRepository(){
//        return new MemoryMemberRepository();
//    }

//    @Bean
//    public MemberRepository memberRepository(){
//        return new JdbcMemberRepository(dataSource);
//    }

    @Bean
    public JdbcTemplateMemberRepository memberRepository(){
        return new JdbcTemplateMemberRepository(dataSource);
    }
}

테스트 확실하게 해야 함.

'스프링 > 0. 입문, 전체방향' 카테고리의 다른 글

20강. 스프링 JPA  (0) 2023.07.12
19강. JPA  (0) 2023.07.10
17강. spring 종합 테스트  (0) 2023.07.09
16강. 순수 JDBC  (0) 2023.07.09
15강. H2 DB  (0) 2023.07.08