스프링 JdbcTemplate
2023. 5. 2. 13:38ㆍ카테고리 없음
package com.example.demo.Repository;
import com.example.demo.domain.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
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 jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id"); // 이 기능을 사용하면 query를 사용하지 않아도 됨.
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);
//jdbcTemplate에 query(질문) 데이터베이스에 정보를 요청해서 result 변수명으로 참조할수있도록 지정해준다.
return result.stream().findAny(); //result의 리스트를 스트림 형식으로 만들어주고, 그 값을 찾은것을 반환시켜주는 역할.
}
@Override
public List<Member> findAll() {
return jdbcTemplate.query("select * from member", memberRowMapper());
}
@Override
public Optional<Member> findByName(String name) {
List<Member> result = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), name);
return result.stream().findAny();
}
private RowMapper<Member> memberRowMapper() {
return (rs, rowNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));//위에있는 rs대신 가져오는것
member.setName(rs.getString("name"));
return member;
};
}
}
package com.example.demo;
import com.example.demo.Repository.*;
import com.example.demo.aop.TimeTraceAop;
import com.example.demo.service.MemberService;
import jakarta.persistence.EntityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
private final DataSource dataSource;
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource;
}
@Bean// 스프링 빈에 내가 직접 입력해주어서 컨테이너에 넣는 방식.
public MemberService memberService() { //spring bean에 저장되어서 memberService에 넣어주고
return new MemberService(memberRepository); // 그 MemberService는 memberRespository를 사용할수있게끔하고
}
@Bean
public MemberRepository memberRepository() { // 똑같이 빈에 올려주고
// return new MemoryMemberRepository(); // 레퍼지토리에 빈을 넣어준다.
// return new JdbcMemberRepository(dataSource);
return new JdbcTemplateMemberRepository(dataSource);
}
}