[初心-Spring Boot] Spring JDBC template

0

초심-spring boot

목록 보기
10/16
post-thumbnail

1. JDBC란?


Java Database Connectivity
자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다.
데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.

2. JDBC Template란?


스프링에서 제공하는 SQL 연산들을 수행 할 수 있도록 해주는 JDBC 코드용 기본 템플릿을 말한다.
스프링은 JDBC를 이용하는 DAO에서 사용할 수 있도록 다양한 템플릿과 콜백을 제공한다.

3. JDBC Template 사용


3-1. JdbcTemplateMemberRepository 생성


3-2. findById 구현


JdbcTemplateMemberRepository.java
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;
    }
}

3-3. save 구현


JdbcTemplateMemberRepository.java
@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;
    }

SimpleJdbcInsert

sql intest 문을 알아서 만들어주는 클래스

3-4. findAll 구현


@Override
    public List<MemberDTO> findAll() {
        return jdbcTemplate.query("select * from member", memberDTORowMapper());
    }

3-5. findByName 구현


    @Override
   public Optional<MemberDTO> findByName(String name) {
       List<MemberDTO> result = jdbcTemplate.query("select * from member where name = ?", memberDTORowMapper(), name);
       return result.stream().findAny();
   }

기존에 제작한 JdbcMemberRepository보다 훨씬 간결하게 짠 것을 볼 수 있다.

3-6. 실행


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

0개의 댓글