들어가며
- 기본 Jdbc 만 가지고도 프로그램을 짤 수는 있지만 코드가 불 필요하게 길어지고 반복되는 코드가 많다.
- 따라서 "Jdbc Template" 을 이용한 DB 접근 부터 시작 하도록 하겠다.
- ps. "Id" 값을 따로 넣기 귀찮아서 GenerationType.IDENTITY 처리(값을 넣지 않으면 하나씩 증가 시키며 자동으로 삽입 해 줌) 하였다.
JDBC template
- 개발자가 Jdbc 를 직접 사용할때 발생하는 여러 반복 작업을 대신 처리 해 주는 class
DataSource 주입
. Jdbc Template 는 DataSource 를 필요로 한다.
. 마찬가지로 생성자를 통해 주입시켜 준다.
public class JdbcTemplateMemberRepository implements MemberRepository{
private final JdbcTemplate jdbcTemplate;
public JdbcTemplateMemberRepository(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
/...
}
쿼리문 작성(전체 코드)
- 코드 설명은 주석 참고
//JdbcTemplateMemberRepository.java
package com.example.springlearn.repository;
import com.example.springlearn.domain.Member;
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.*;
public class JdbcTemplateMemberRepository implements MemberRepository{
private final JdbcTemplate jdbcTemplate;
public JdbcTemplateMemberRepository(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Member save(Member member) {
//아래 처럼 하면 sql 쿼리 문을 따로 만들 필요는 없다.
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
//member 라는 table 에 id 를 이용해서 insert
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) {
//PK(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(){
//// rs 값을 member 객체에 저장
return (rs, rewNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
//해당 member 를 반환 해 줌
return member;
};
}
}
Config 파일 수정(Bean)
@Configuration
public class SpringConfig {
// JdbcTemplate 는 datasource 가 필요로 하기 때문에 Bean 에 등록
private DataSource dataSource;
public SpringConfig(DataSource dataSource){
this.dataSource = dataSource;
}
@Bean
public MemberService memberService(){
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
//기존의 MemoryMemberRepository 대신 JdbcTemplate 를 사용하는 repo 가 작동 하도록 수정
// return new MemoryMemberRepository();
return new JdbcTemplateMemberRepository(dataSource);
}
}
'백앤드 > SpringBoot + Java 간간한 백앤드 예제' 카테고리의 다른 글
[SpringBoot + Java] 간단한 백엔드(SpringData JPA) (0) | 2023.07.20 |
---|---|
[SpringBoot + Java] 간단한 백엔드(JPA) (0) | 2023.07.20 |
[SpringBoot + Java] 간단한 백엔드(MySql + Spring 설정) (0) | 2023.07.20 |
[SpringBoot + Java] 간단한 백엔드(MySql) (0) | 2023.07.20 |
[SpringBoot + Java] 간단한 백엔드(Spring Bean) (0) | 2023.07.18 |