스프링 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를 사용하면 된다.
단일 데이터 조회시 사용한다.
@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;
}
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("둘이요");
}
}
🔖 참고내용 출처