-
스프링 DB - JDBC 개발 - 조회Data Base/스프링 DB 2023. 11. 20. 15:54
JDBC 개발 - 조회
예시 - JDBC를 통해 이전에 저장한 데이터를 조회하는 기능을 개발
MemberRepositoryV0 - 회원 조회 추가
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); //DB에서 정보 조회시 rs = pstmt.executeQuery(); //DB로 반환받은 직후의 rs에서는 커서가 아무것도 가르키지 않는다. //rs.next를 해주어야 실제 데이터가 있는지 확인한뒤 //데이터가 실제 시작하는 곳 앞으로 커서가 이동한다. 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 memeberId="+memberId); } }catch (SQLException e){ log.info("error",e); throw e; }finally { close(con,pstmt,rs); } }
요청받은 member_id에 해당하는 select 결과가 없을 때를 대비해서 다음 exeption을 추가한다.
import java.util.NoSuchElementException;
findById() - 쿼리 실행
- sql : 데이터 조회를 위한 select SQL을 준비한다.
- rs = pstmt.executeQuery() 데이터를 변경할 때는 executeUpdate()를 사용하지만, 데이터를 조회할 때는 executeQuery()를 사용한다. executeQuery()는 결과를 ResultSet에 담아서 반환한다.
executeQuery()
ResultSet executeQuery() throws SQLException;
ResultSet
- 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 타입으로 반환한다.
ResultSet 결과 예시
위 그림은 ResultSet의 결과 회원이 2명 조회되는 경우이다.
- 1-1에서 rs.next()를 호출한다.
- 1-2의 결과로 cursor가 다음으로 이동한다. 이 경우 cursor가 가리키는 데이터가 있으므로 true를 반환한다.
- 2-1에서 rs.next()를 호출한다.
- 2-2의 결과로 cursor가 다음으로 이동한다. 이 경우 cursor가 가리미는 데이터가 있으므로 true를 반환한다.
- 3-1에서 rs.next()를 호출한다.
- 3-2의 결과로 cursor가 다음으로 이동한다. 이 경우 cursor가 가리키는 데이터가 없으므로 false를 반환한다.
findById()에서는 회원 하나를 조회하는 것이 목적이다. 따라서 조회 결과가 항상 1건이므로 while대신에 if를 사용한다. 다음 SQL을 보면 PK인 member_id를 항상 지정하는 것을 확인할 수 있다.
SQL : select * from member where member_id = ?
실행결과
MemberRepositoryV0Test - findMember=Member(memberId=memberV1, money=10000)
- 회원을 등록하고 그 결과를 바로 조회해서 확인해 보았다.
- 참고로 실행 결과 member객체의 참조 값이 아니라 실제 데이터가 보이는 이유는 롬복의 @Data가 toString()을 적절히 오버라이딩 해서 보여주기 때문이다.
- isEqualTo() : findMember.equals(member)를 비교한다. 결과가 참인 이유는 롬복의 @Data는 해당 객체의 모든 필드를 사용하도록 equals()를 오버라이딩 하기 때문이다.
[출저 - 스프링 DB 1편 - 데이터 접긎 핵심 원리, 김영한]
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1
'Data Base > 스프링 DB' 카테고리의 다른 글
스프링 DB 1 - 커넥션 풀 과 데이터 소스 이해 (0) 2023.11.21 스프링 DB 1 - JDBC개발 - 수정, 삭제 (1) 2023.11.20 스프링 DB - JDBC개발 - 등록 (1) 2023.11.20 스프링 DB - 데이터베이스 연결 (2) 2023.11.20 스프링 DB - JDBC와 최신 데이터 접근 기술 (1) 2023.11.20