Java Database Connectivity
자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다.
데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.
스프링에서 제공하는 SQL 연산들을 수행 할 수 있도록 해주는 JDBC 코드용 기본 템플릿을 말한다.
스프링은 JDBC를 이용하는 DAO에서 사용할 수 있도록 다양한 템플릿과 콜백을 제공한다.
package com.rptp.rptpSpringBoot.repository.impliment;
import com.rptp.rptpSpringBoot.model.MemberDTO;
import com.rptp.rptpSpringBoot.repository.MemberRepository;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Optional;
@Repository
public class JdbcTemplateMemberRepository implements MemberRepository {
private final JdbcTemplate jdbcTemplate;
// 생성자가 단 한 개인 경우 Autowired 생략 가능
public JdbcTemplateMemberRepository(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public MemberDTO save(MemberDTO memberDTO) {
return null;
}
@Override
public Optional<MemberDTO> findById(Long id) {
List<MemberDTO> result = jdbcTemplate.query("select * from member where id = ?", memberDTORowMapper(), id);
return result.stream().findAny();
}
private RowMapper<MemberDTO> memberDTORowMapper() {
return (rs, rowNum) -> {
MemberDTO memberDTO = new MemberDTO();
memberDTO.setId(rs.getLong("id"));
memberDTO.setName(rs.getString("name"));
return memberDTO;
};
}
@Override
public Optional<MemberDTO> findByName(String name) {
return Optional.empty();
}
@Override
public List<MemberDTO> findAll() {
return null;
}
}
@Repository
public class JdbcTemplateMemberRepository implements MemberRepository {
private final JdbcTemplate jdbcTemplate;
// 생성자가 단 한 개인 경우 Autowired 생략 가능
public JdbcTemplateMemberRepository(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public MemberDTO save(MemberDTO memberDTO) {
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", memberDTO.getName());
Number key = jdbcInsert.executeAndReturnKey(new
MapSqlParameterSource(parameters));
memberDTO.setId(key.longValue());
return memberDTO;
}
sql intest 문을 알아서 만들어주는 클래스
@Override
public List<MemberDTO> findAll() {
return jdbcTemplate.query("select * from member", memberDTORowMapper());
}
@Override
public Optional<MemberDTO> findByName(String name) {
List<MemberDTO> result = jdbcTemplate.query("select * from member where name = ?", memberDTORowMapper(), name);
return result.stream().findAny();
}
기존에 제작한 JdbcMemberRepository보다 훨씬 간결하게 짠 것을 볼 수 있다.
Repository에 충돌이 일어나니 기존에 Repository 애너테이션을 설정한 것을 해제해야한다.
실행해보면 DB에 잘 입력되는 것을 볼 수 있다.
기존에 제작한 테스트도 통과하는 것을 볼 수 있다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/lecture/49596
JDBC https://ko.wikipedia.org/wiki/JDBC
JDBC 템플릿이란 https://withseungryu.tistory.com/91, https://velog.io/@seculoper235/JDBC-5%ED%8E%B8-jdbcTemplate