MapleStory Cookie With Halo

🍃 Spring/🍃 Spring Boot

[SpringBoot]DB접근기술-JdbcTemplate

뉴이 NUEY 2025. 1. 9. 01:45
반응형

 

스프링 JdbcTemplate

 

 


 

사용법

 

  1. src-main-java-hello-hellospring패키지 안에 JdbcTemplateMemberRepository클래스를 만든다.
  2. JdcbTemplate 상수를 선언하고. 아래처럼 의존성 생성자 (DI) 를 하나 만든다.
    🌟 생성자가 딱 하나일 경우 @Autowired 생략 가능.
  3. ResultSet을 반환하는 RowMapper를 반환하는 메서드를 만든다.
    1. ResultSet과 int rowNum을 파라미터로 받아 데이터를 반환하는 메서드를 만든다.
    2. VScode기준 단축키 Ctrl + , 를 누르면 아래와 같은 창이 열린다.
      Convert to lambda expression을 클릭한다.
    3. 람다식으로 변경된다.
  4. 아이디 찾기 findById(id)

    1. List로 반환된다.

    2. jdbcTemplate의 query()함수를 이용해 쿼리를 실행한다.

    3. 인수로는 ("쿼리", rowMapper(), 넘길 데이터(?에 들어갈 값))

  5. 회원저장 save()

    1. SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
      → jdbcTemplate을 인수로 담아 SimpleJdbcInsert를 만들면 간단하게 insert쿼리를 만들 수 있다.

    2. jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");
      영어 그대로 읽으면 된다. member테이블과 자동생성컬럼인 id를 이용해 insert쿼리를 만든다.

    3. Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
      → 쿼리를 실행하고 키를 돌려받는데 인수로 MapSqlParameterSource() 를 이용한다.
       
  6. SpringConfig에서 위 jdbcTemplate으로 만든 리포지토리를 빈으로 만든다.
  7. 단위 테스트까지 무사히 통과완료.

 

 

↓ 리포지토리 전체코드

더보기
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;
        };
    }
}

 


※ 참조 : https://www.inflearn.com/roadmaps/373

반응형