실무에서 자주 씀
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 |