JDBC 개발 - 조회

Minseo Kang·2023년 3월 18일
0
post-thumbnail

JDBC로 이전에 저장한 데이터를 조회하는 기능을 개발




01. MemberRepositoryV0 클래스에 findById 메소드 작성 - repository 패키지


  • 회원을 조회하는 메소드
public Member findById(String memberId) throws SQLException {

        String sql = "select * from member where member_id = ?";

        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            con = getConnection();
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, memberId);

            rs = pstmt.executeQuery();
            if(rs.next()) { 
                Member member = new Member();
                member.setMemberId(rs.getString("member_id"));
                member.setMoney(rs.getInt("money"));
                return member;
            }
            else { 
                throw new NoSuchElementException("member not found memberId = " + memberId);
            }

        } catch (SQLException e) {
            log.error("db error", e);
            throw e;
        } finally {
            close(con, pstmt, rs);
        }
    }

findById() - 쿼리 실행

  • sql : 데이터 조회를 위한 select SQL을 준비
  • rs = pstmt.executeQuery : 데이터 조회
  • rs = pstmt.executeUpdate : 데이터 변경
  • executeQuery()는 결과를 ResultSet에 담아서 반환

executeQuery()

ResultSet executeQuery() throws SQLException;

ResultSet

  • select 쿼리의 결과가 순서대로 들어감
    - select member_id, money라고 지정 시 member_id, money 이름으로 데이터 저장됨
    • select * 사용 시 테이블의 모든 칼럼을 다 지정
  • ResultSet 내부의 커서(cursor)를 이동해 다음 데이터 조회 가능
  • rs.next() : 커서가 다음으로 이동
    - 최초의 커서는 데이터를 가리키고 있지 않아서 rs.next()를 최초 한번은 호출해야 데이터를 조회할 수 있음
    • rs.next()의 결과가 true이면 커서의 이동 결과 데이터가 존재함을 의미
    • rs.next()의 결과과 false이면 커서의 이동 결과 데이터가 존재하지 않음을 의미
  • rs.getString("member_id") : 현재 커서가 가리키고 있는 위치의 위치의 member_id 데이터를 String 타입으로 반환
  • rs.getInt("money") : 현재 커서가 가리키고 있는 위치의 money 데이터를 int 타입으로 반환


주의

  • findById()에서는 회원 하나를 조회하는 것이 목적
  • 조회 결과가 항상 1건이므로 while이 아닌 if 사용
  • SQL을 보면 Primay Key인 member_id를 항상 지정
String sql = "select * from member where member_id = ?";



02. MemberRepositoryV0Test(테스트 코드) 작성


  • JDBC로 회원을 조회
package hello.jdbc.repository;

import hello.jdbc.domain.Member;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import java.sql.SQLException;
import java.util.NoSuchElementException;

@Slf4j
class MemberRepositoryV0Test {

    MemberRepositoryV0 repository = new MemberRepositoryV0();

    @Test
    void crud() throws SQLException {

        // save
        Member member = new Member("memberV100", 10000);
        repository.save(member);

        // findById
        Member findMember = repository.findById(member.getMemberId());
        log.info("findMember={}", findMember);
        Assertions.assertThat(findMember).isEqualTo(member);
	}
    
}

테스트 전에 테이블의 내용을 삭제해야 함 (PK 중복 막기 위해)


테스트 코드 실행 결과

0개의 댓글

관련 채용 정보