JDBC 이해

born_a·2022년 8월 18일
0

데이터베이스 연결

public abstract class ConnectionConst {
public static final String URL = "jdbc:h2:tcp://localhost/~/test";
public static final String USERNAME = "sa";
public static final String PASSWORD = "";
}

상수를 모아두었기 때문에 이 클래스는 객체를 생성해서는 안된다.
따라서 abstract로!

이 클래스 안에서만 쓸게 아니라 외부에서도 쓸 것이기 때문에 public으로 해둔다

completion code : shift + command + enter
introduce variable : option + command + V

이 Driver를 통해 구현체를 찾아서 Connection을 가져오게 된다.
DriverManager.getConnection(URL, USERNAME, PASSWORD);

커넥션 요청 흐름 : URL,아이디나 비밀번호 같은 커넥션 요청을 받으면 라이브러리에 등록된 드라이버에게 던진다.

JDBC 개발 - 등록

extract method : option + command + M

@Slf4j
public class MemberRepositoryV0 {

public Member save(Member member) throws SQLException {
    String sql = "insert into member(member_id,money) values (?,?)";

    Connection con = null; //커넥션이 있어야 연결을 하지
    PreparedStatement pstmt = null;


    try{
        con = getConnection();
        pstmt = con.prepareStatement(sql);
        //sql에 대한 파라미터 바인딩
        pstmt.setString(1, member.getMemberId());
        pstmt.setString(2, member.getMoney());
        return member;
    } catch(SQLException e) {
        log.error("db error", e);
        throw e;
    } finally{
        close(con, pstmt, null);
    }

}

pstmt와 con은 외부 리소스를 쓰는것.
실제 TCP/IP 커넥션에 걸려서 쓰는것이다. 따라서 close()로 꼭 닫아줘야함

Statement는 sql을 그대로 넣는거고, PreparedStatement는 파라미터를 바인딩 할 수 있어서 기능이 더 많다. Statement를 상속 받았으므로 넣어줄 수 있다.

JDBC 개발 - 조회

select는 executeQuery를 통해. -> ResultSet 반환
ResultSet : Select Query를 통한 결과를 담고있는 통

public Member findById(String memberId) {
String sql = "select * from member where member_id = ?";
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

    try{
        con = getConnection();
        //커넥션을 통해 prepareStatement 얻고 여기에 sql을 넣어줘야
        pstmt = con.prepareStatement(sql);
        pstmt.setString(1, memberId);

        rs = pstmt.executeQuery();
        if (rs.next()) {//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);
        } finally{
            close(con, pstmt, rs);
        }
    } catch (SQLException e) {
        log.error("db error", e);
        throw e;
    }
}

con, pstmt,rs 순으로 얻었으므로 해제할때는 rs, pstmt, con순으로 해제해야한다.

@Data를 쓰면 equals hashcode를 자동으로 넣어줌.

JDBC 개발 - 수정, 삭제

엇 이거 코드 똑같은데? 그래서 SqlMapper가 나온것.
쿼리도 비슷한데? 그래서 JPA도 나온것.

0개의 댓글

관련 채용 정보