JDBC로 이전에 저장한 데이터를 조회하는 기능을 개발
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 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()
에서는 회원 하나를 조회하는 것이 목적while
이 아닌 if
사용member_id
를 항상 지정String sql = "select * from member where member_id = ?";
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 중복 막기 위해)
테스트 코드 실행 결과