스프링 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);

    }

}