스프링 JdbcTemplate

구름코딩·2020년 10월 18일
1
  • 순수 Jdbc와 동일한 환경설정을 한다
  • 스프링 JdbcTemplate, Mybatis 등의 라이브러리는 JDBC API에서 반복적인 코드를 대부분 제거해준다
  • sql문은 직접 작성해줘야한다

사용

  • JdbcTemplateMemberRepository 클래스를 생성해서 인터페이스를 구현한다
  • JdbcTemplate 라는것이 이미 존재한다
  • 생성자를 통해서 Datasource의 datasource를 jdbctemplate에 spring이 DI를 해준다

DataSource란?

A factory for connections to the physical data source that this DataSource object represents.

  • 이 DataSource 개체가 나타내는 물리적 데이터 소스에 연결하기 위한 공장

Basic implementation -- produces a standard Connection object
Connection pooling implementation -- produces a Connection object that will automatically participate in connection pooling. This implementation works with a middle-tier connection pooling manager.
Distributed transaction implementation -- produces a Connection object that may be used for distributed transactions and almost always participates in connection pooling. This implementation works with a middle-tier transaction manager and almost always with a connection pooling manager.

  • 기본 구현 - 표준 연결 개체 생성
  • 연결 풀링 구현 - 연결 풀링에 자동으로 참여하는 연결 개체를 생성한다. 이 구현은 중간 계층 연결 풀링 매니저와 함께 작동한다.
  • 분산 트랜잭션 구현 - 분산 트랜잭션에 사용할 수 있는 연결 개체를 생성하고 거의 항상 연결 풀링에 참여한다. 이 구현은 중간-계층 트랜잭션 관리자와 함께 작동하며 거의 항상 연결 풀링 관리자와 함께 작동한다.
    참고

JdbcTemplate활용

JdbcTemplate를 활용하여 조회 쿼리를 실행해보자, jdbc를 활용하기 위해서는 아래와 같이 선언을 한다

private final JdbcTemplate jdbcTemplate;

@Autowired // 생성자 선언 - datasource를 spring이 넣어준다 (현재 h2 DB의 위치url이다)
public JdbcTemplateMemberRepository(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}

JdbcTemplate는 SELECT 쿼리문을 위한 query()메소드를 제공한다

  • List<\T> query(String sql, RowMapper<\T> rowMapper)
  • List<\T> query(String sql, Object [] args, RowMapper<\T> rowMapper)
  • List<\T> query(String sql, RowMapper<\T> rowMapper, Object... args)
    참고

query() 메소드는 파라미터의 sql을 실행하고, 결과로 나온 ResultSet을 RowMapper가 JAVA의 객체로 변환한다. 그리고 sql 파라미터가 인덱스 기반 파라미터를 가진 쿼리(preparedStatement의 물음)인 경우, 각 파라미터의 값을 args로 지정한다

RowMapper 클래스
private RowMapper<Member> memberRowMapper() {
    //람다식 표현
    return (resultSet, rowNum) -> {
        Member member = new Member();
        member.setId(resultSet.getLong("id"));
        member.setName(resultSet.getString("name"));
        return member;
    };
    
    //내부 익명 클래스
    return new RowMapper<Member>() {
            @Override
            public Member mapRow(ResultSet resultSet, int rowNum) throws SQLException {
                Member member = new Member();
                member.setId(resultSet.getLong("id"));
                member.setName(resultSet.getString("name"));
                return member;
            }
        };
}
완성된 Jdbctemplate코드
public class JdbcTemplateMemberRepository implements MemberRepository{

    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public JdbcTemplateMemberRepository(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public Member save(Member member) {
        SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
        jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");

        Map<String, String> 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("slect * 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 (resultSet, rowNum) -> {
            Member member = new Member();
            member.setId(resultSet.getLong("id"));
            member.setName(resultSet.getString("name"));
            return member;
        };
    }
}

이제 @Configuration에서 이 JdbcTemplate를 사용하도록 변경하면 된다

@Bean
public MemberRepository memberRepository()
{
    //return new MemoryMemberRepository();
    //return new JdbcMemberRepository(dataSource);
    return new JdbcTemplateMemberRepository(dataSource);
}
profile
내꿈은 숲속의잠자는공주

0개의 댓글