반응형
스프링 JdbcTemplate
- 순수 Jdbc와 동일한 환경설정을 하면 된다.
2025.01.08 - [🍃 Spring/🍃 Spring Boot] - [SpringBoot]DB접근기술-순수JDBC - MyBatis와 비슷하게 반복 코드를 대부분 제거해준다.
- SQL은 직접 작성해야 한다.
사용법
- src-main-java-hello-hellospring패키지 안에 JdbcTemplateMemberRepository클래스를 만든다.
- JdcbTemplate 상수를 선언하고. 아래처럼 의존성 생성자 (DI) 를 하나 만든다.
- ResultSet을 반환하는 RowMapper를 반환하는 메서드를 만든다.
- ResultSet과 int rowNum을 파라미터로 받아 데이터를 반환하는 메서드를 만든다.
- VScode기준 단축키 Ctrl + , 를 누르면 아래와 같은 창이 열린다.
Convert to lambda expression을 클릭한다.
- 람다식으로 변경된다.
- ResultSet과 int rowNum을 파라미터로 받아 데이터를 반환하는 메서드를 만든다.
- 아이디 찾기 findById(id)
- List로 반환된다.
- jdbcTemplate의 query()함수를 이용해 쿼리를 실행한다.
- 인수로는 ("쿼리", rowMapper(), 넘길 데이터(?에 들어갈 값))
- List로 반환된다.
- 회원저장 save()
- SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
→ jdbcTemplate을 인수로 담아 SimpleJdbcInsert를 만들면 간단하게 insert쿼리를 만들 수 있다. - jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");
→ 영어 그대로 읽으면 된다. member테이블과 자동생성컬럼인 id를 이용해 insert쿼리를 만든다. - Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
→ 쿼리를 실행하고 키를 돌려받는데 인수로 MapSqlParameterSource() 를 이용한다.
- SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
- SpringConfig에서 위 jdbcTemplate으로 만든 리포지토리를 빈으로 만든다.
- 단위 테스트까지 무사히 통과완료.
↓ 리포지토리 전체코드
더보기
package hello.hellospring.repository;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import javax.sql.DataSource;
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 hello.hellospring.domain.Member;
public class JdbcTemplateMemberRepository implements MemberRepository {
private final JdbcTemplate jdbcTemplate;
public JdbcTemplateMemberRepository(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Member save(Member member) {
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 (rs, rowNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
};
}
}
반응형
'🍃 Spring > 🍃 Spring Boot' 카테고리의 다른 글
[SpringBoot][Gradle]스프링 데이터 JPA. 설정부터 사용까지 입문편. (0) | 2025.01.10 |
---|---|
[SpringBoot][Gradle][JPA]입문. 설정부터 사용까지. (1) | 2025.01.10 |
[SpringBoot]스프링 통합테스트 (0) | 2025.01.08 |
[SpringBoot][Gradle]DB접근기술-순수JDBC (0) | 2025.01.08 |
[SpringBoot][Thymeleaf]회원관리-웹 MVC개발 (0) | 2025.01.07 |