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,아이디나 비밀번호 같은 커넥션 요청을 받으면 라이브러리에 등록된 드라이버에게 던진다.
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를 상속 받았으므로 넣어줄 수 있다.
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를 자동으로 넣어줌.
엇 이거 코드 똑같은데? 그래서 SqlMapper가 나온것.
쿼리도 비슷한데? 그래서 JPA도 나온것.