스프링/5. 스프링 DB-1

6. 조회

sdafdq 2023. 9. 27. 22:52
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