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){
throw e;
}finally {
close(con, pstmt, rs);
}
}
리포지토리 클래스에 추가하였다.
비슷하다.
그런데 이번에는 결과를 받아와야 하기 때문에 ResultSet을 쓴다.
먼저 쿼리문인
select * from member where member_id = ?
조회한다 모든것을 member테이블로부터 어디냐면 member_id가 ? 인 것들을
커넥션 얻어오고,
커넥션으로 부터 PreparedStatement 얻어오고
?에 바인딩 잘 해주고,
참고로, preparedStatement.excuteUpdate()는 뭔가 DB에 값을 변경하거나 등 값을 업데이트 하는 거고,
preparedStatement.excuteQuery()는 값을 조회하는 것이다. 직역은 그냥 쿼리를 실행한다. 이다.
그래서 저것이 ResultSet을 반환한다.
참고로, ResultSet의 모양은 이렇게 생겼다.
뭔가 좀 엑셀같은 느낌으로,
처음에는 열 그 자체를 가리킨다. 그래서 처음 한번은 resultSet.next() 해야 그 다음부터 진짜 값이다.
next() 후 와서 그곳에 값이 있으면 true, 값이 없으면 false를 반환한다.
만약 값이 있으면, (참고로 member_id는 Primary key라 하나만 존재하기에, if문을 썼다. 여러 개 시 while문 등으로 돌리면서 처리 해야 한다.)
그걸 토대로 멤버 객체를 만들어 반환한다.
어쩐지 멤버가 데이터를 담는 통 같다. 하긴 뭐 그게 맞기는 하다.
resultSet으로 부터 값을 얻는 것은 resultSet.getInt(열이름) 이다.
마찬가지로 get자료형(열이름)이며, 오브젝트도 가져올 수 있다.
public class MemberRepositoryV0Test {
MemberRepositoryV0 repository = new MemberRepositoryV0();
@Test
public void crud() throws SQLException {
Member member = new Member("asdf",14000);
repository.save(member);
Member resultMember = repository.findById(member.getMemberId());
assertThat(member).isEqualTo(resultMember);
}
}
테스트 코드이다.
멤버를 만들어 리포지토리에 저장시키고,
다시 같은 id로 조회에서 불러와 맞는 지 확인한다.
참고로, isEqualTo는 객체의 equals()를 확인해주는 테스트용 함수인데,
롬복이 제공해주는 @Data를 쓰면 여기에 객체의 equals()를 각 필드끼리 서로 같는지 확인하는 걸로 자동으로 override 해 준다.
그래서 isEqualTo() 해도 제대로 나온다.
문제 없다.
'스프링 > 5. 스프링 DB-1' 카테고리의 다른 글
8. 커넥션 풀 (0) | 2023.09.28 |
---|---|
7. 수정, 삭제 (0) | 2023.09.28 |
5. JDBC 등록 (0) | 2023.09.27 |
4. DB에 연결 (0) | 2023.09.26 |
3. JDBC 최신기술 (0) | 2023.09.26 |