1. JDBC Driver 로딩
- Class.forName( )을 이용해서 Driver Class를 로딩하면 객체가 생성되고, DriverManager에 등록된다.
- Driver 클래스를 찾지못하면 ClassNotFoundException이 발생한다.
Class.forName(driver);
1-1. DriverManager 클래스
- DriverManager 클래스는 JDBC 드라이버를 통하여 Connection을 만드는 역할.
- DriverManager는 Class.forName( ) 메소드를 통해서 생성된다.
2. Connection 생성
- Connection - 데이터베이스와 연결하는 객체
- DriverManager.getConnection( ) 으로 Connection 객체를 생성.
Connection conn = DriverManager.getConnection(jdbcUrl, user, pass);
2-1. Connection Pool 사용
- @Resource 어노테이션은 특정 프로퍼티를 자동으로 연결해주는 역할을 수행한다. 즉, context.xml 파일에 미리 기입된 JDBC 연결 정보를 통해 일일히 하드코딩 해줄 필요 없이 연결 가능하게끔 만들어준다.
@Resource(name="context.xml에 지정한 driverClassName 기입")
DataSource ds;
Connection conn = ds.getConnection();
3. PreparedStatement
- PreparedStatement는 데이터베이스의 연결로부터 SQL문을 실행할 수 있도록 해주는 클래스이다.
PreparedStatement pstmt = conn.prepareStatement(sql);
- PreparedStatement는 SQL문을 작성할 때 컬럼 값을 실제로 지정하지 않고, 변수 처리 함으로서 DBMS을 효율적으로 사용합니다.
- PreparedStatement의 SQL문은 SQL문의 구조는 같은데 조건문의 조건이 수시로 변할 때 조건의 변수처리를 "?" 문자로 처리하는데 이를 "바인딩 변수"라고 한다.
- 바인딩 변수의 순서는 "?" 의 개수에 의해 결정이 되는데 시작 번호는 1 부터 시작하게 됩니다.
pstmt.setString(1,"name");
3-1. executeUpdate( )
- SELECT 구문을 제외한 다른 구문을 수행할 때 사용되는 함수.
- 수행결과로 Int 타입의 값을 반환.
- INSERT / DELETE / UPDATE 관련 구문에서는 반영된 레코드의 건수를 반환
PreparedStatement pstmt = conn.prepareStatement(sql);
int affectLines = pstmt.executeUpdate();
3-2. executeQuery( )
- SELECT 구문을 수행할 때 사용되는 함수.
- 수행결과로 ResultSet 객체의 값을 반환.
- 데이터를 SELECT로 갖고 오는 경우에는 가져온 결과 데이터를 처리하기 위한 ResultSet 객체가 필요
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
....
}
4. ResultSet
- ResultSet은 조회한 결과 값에 순차적으로 접근할 수 있는 커서(위치표시자)를 다룰 수 있게 한다.
- SELECT의 결과를 저장하는 객체
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
String name = rs.getString("name");
int age = rs.getInt("email");
}
- getString()이나 getInt()와 같은 메서드에서 "컬럼이름"을 지정하는 방법 또는 1번부터 시작하는 컬럼의 인덱스 번호를 통해 해당 칼럼의 값을 가져온다.
5. 자원객체를 해제(닫기)
- JDBC에서는 아래의 3개 자원객체를 닫는 순서가 정해져 있다.
- 1) ResultSet.close( ) //1순위로 해제
- 2) PreparedStatement.close( ) //2순위
- 3) Connection.close( ) //가장 마지막 3순위로 해제
5-1. try-with-resources를 통해 자원 자동 해제
- try에 자원 객체를 전달하면, try 코드 블록이 끝나면 자동으로 자원을 종료해주는 기능을 수행 한다.
- 즉, 따로 finally 블록이나 모든 catch 블록에 종료 처리를 하지 않아도 된다.
try(conn; pstmt; rs;) {
....
}
- try-with-resources는 기입한 자원객체의 순서와 반대로 해제된다.
- 즉, try( ) 내부에 기입한 것처럼 conn → pstmt → rs 순서대로 자원객체가 해제되는 것이 아닌, 반대로 rs → pstmt → conn 자원객체가 해제된다.