JdbcTemplate query method

Heeeoh·2024년 2월 27일
0

실습 및 테스트

목록 보기
1/1
post-thumbnail

스프링 DB 학습중 궁금한 것이 있어서 테스트해보고 찾아보고 학습한 내용을 정리한다.


queryForObject(String sql, RowMapper<T> , @Nullable Object... args)

queryForObject 메서드는 여러가지가 있는데 그중 스프링 DB에서 썼던 것을 살펴보자

@Override
@Nullable
public <T> T queryForObject(String sql, RowMapper<T> rowMapper, @Nullable Object... args) throws DataAccessException 

sql : sql 문
RowMapper<T> : ResultSet 데이터를 매핑하는데 사용
arg : sql 파라미터

rs = pstmt.executeQuery()
DB에서 조회한 값은 ResultSet 타입으로 반환된다.
이때 객체로 반환받고 싶다면 RowMapper를 사용하면 된다.

단일 데이터 조회시 사용한다.


RowMapper

@FunctionalInterface
public interface RowMapper<T> {

	@Nullable
	T mapRow(ResultSet rs, int rowNum) throws SQLException;

}

인터페이스를 구현해서 사용한다면
mapRow 메서드를 override 해서 사용


@Override
public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
    Member member = new Member();
    member.setMemberId(rs.getString("member_id"));
    member.setMoney(rs.getInt("money"));
    return member;
}

람다식으로 적용


public Member findById(String memberId) {
    String sql = "select  * from member where member_id = ?";
    return template.queryForObject(sql, memberRowMapper(), memberId);
}
    
    
private RowMapper<Member> memberRowMapper() {
    return (rs, rowNum) -> {
        Member member = new Member();
        member.setMemberId(rs.getString("member_id"));
        member.setMoney(rs.getInt("money"));
        return member;
    };
}

구현해서 사용할려면 ResultSet이 필요하다.
그러면 커넥터, PreparedStatement 등이 필요하고 직접 코드로 짜줘야하기에 JdbcTemplate로 간단하게 할 수 있는 람다식이 더 편한 것 같다.

멤버 전체 조회

public List<Member> findAll() {
    String sql = "select  * from member";

    List<Member> members = template.query(sql, (rs, rowNum) -> {
        Member member = new Member();
        member.setMemberId(rs.getString("member_id"));
        member.setMoney(rs.getInt("money"));
        return member;
    });
     return members;
}

test

package hello.jdbc.repository;

import hello.jdbc.domain.Member;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

@Slf4j
@SpringBootTest
public class MemberRepositoryfindAllTest {


    private final MemberRepositoryV5 repository;

    @Autowired
    public MemberRepositoryfindAllTest(MemberRepositoryV5 repository) {
        this.repository = repository;
    }


    @TestConfiguration
    static class TestConfig {

        private final DataSource dataSource;

        public TestConfig(DataSource dataSource) {
            this.dataSource = dataSource;
        }

        @Bean
        MemberRepositoryV5 memberRepository() {
            return new MemberRepositoryV5(dataSource);
        }


    }

    @Test
    void findAllMember() {
        repository.save(new Member("하나요", 11111));
        repository.save(new Member("둘이요", 22222));

        log.info("list={}", repository.findAll());

        repository.delete("하나요");
        repository.delete("둘이요");
    }
}

결과


🔖 참고내용 출처

스프링 DB 1편 - 데이터 접근 핵심 원리

profile
열심히 살자

0개의 댓글