JDBC 1
JDBC(Java DataBase Connectivity)란?
자바에서 데이터베이스에 접근할 수 있게 해주는 Programming API
JDBC 사용 클래스
- DriverManager
데이터 원본에 JDBC드라이버를 통하여 커넥션을 만드는 역할
Class.forName() 메소드를 통해 싱성되며 반드시 예외처리를 해야 함
직접 인스턴스 생성이 불가능하고 getConnection() 메소드를 사용하여 인스턴스 생성 가능
- Connection
특정 데이터 원본과 연결 된 커넥션을 나타냄
Statement 인스턴스를 생성할 때도 Connection 인스턴스를 사용하여 createStatement() 메소드를 호출하여 생성
SQL 문장을 실행시키기 전에 우선 Connecton 인스턴스가 있어야 함
- Statement
Connection 클래스의 createStatement() 메소드를 호출하여 얻어짐
생성된 Statement 인스턴스로 SQL 질의문을 String에 담에 인자로 전달하여 executeQuery() 메소드를 호출하여 SQL 질의 수행
try {
String query = "SELECT ID, LAST_NAME FROM EMP";
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
} catch (SQLException e) {
e.printStackTrace();
}
- preparedStatement
Connection 클래스의 preparedStatement() 메소드를 사용하여 인스턴스 생성
SQL 질의문을 위치홀더 (placeholder)인 ?로 표현되는 String으로 정의
PreparedStatement는 위치홀더라는 개념에 해당되는 인수가 많아서 특정 값만 바꾸어 여러 번 실행해야 할 때 유용
(Statement는 SQL문장을 매번 컴파일 하지만 PreparedStatement는 한번만 컴파일하므로 실행 속도가 빠름)
try {
String query = "INSERT INTO MEMBER VALUES(?,?)";
pstmt = conn.preparedStatement(query);
pstmt.setString(1, id);
pstmt.setString(2, password);
} catch (SQLException e) {
e.printStackTrace();
}
- ResultSet
SELECT 문을 사용한 질의 성공 시 ResultSet을 반환
SQL 질의문에 의해 생성된 테이블을 담고 있으며 커서(cursor)로 특정 행에 대한 참조 조작
JDBC 코딩 절차
- DriverManager에 해당 DBMS Driver 등록
public static void main(String[] args) {
/* DB 접속을 위한 Connection 인스턴스 생성
* 나중에 finally 블럭에서 사용하기 위해 try 블럭 밖에 미리 레퍼런스 변수를 선언함 */
Connection conn = null;
try {
/* 1. 사용할 드라이버 등록 */
Class.forName("oracle.jdbc.driver.OracleDriver");
- 해당 Driver로부터 Connection instance획득
/* 2. DriverManager를 이용해 Connection 객체 생성 */
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "C##EMPLOYEE", "EMPLOYEE");
System.out.println(conn);
} catch (ClassNotFoundException e) {
// 드라이버 클래스명에 오타가 있거나 라이브러리가 추가 되지 않았을 경우
// 해당 클래스를 찾지 못했다는 exception 발생 가능
e.printStackTrace();
} catch (SQLException e) {
// url, user, password 등이 올바르게 입력되지 않아서 연결 할 수 없으면
// exception 발생 가능
e.printStackTrace();
} finally {
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 해당 Driver로부터 Connection instance 획득
/* 1. Connection 생성 */
Connection conn = getConnection();
Statement stmt = null;
ResultSet rset = null;
try {
/* 2. Statement 생성 */
stmt = conn.createStatement();
String empId = "207";
String query = "SELECT EMP_ID, EMP_NAME FROM EMPLOYEE WHERE EMP_ID = '" + empId + "'";
System.out.println(query);
/* 3. executeQuery()로 쿼리문 실행하고 결과를 ResultSet으로 반환 */
rset = stmt.executeQuery(query);
/* 4. ResultSet에 담긴 결과 값을 컬럼 이름을 이용해서 꺼내오기 */
if(rset.next()) {
System.out.println(rset.getString(1) + ", " + rset.getString(2));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
/* 5. 사용한 자원 반납 */
close(rset);
close(stmt);
close(conn);
}
- Statement에서 제공하는 메소드를 사용하여 SQL문 실행
Connection conn = getConnection();
PreparedStatement pstmt = null;
ResultSet rset = null;
try {
/* PreparedStatement 객체는 생성 시에 sql 구문을 미리 전달한다. */
pstmt = conn.prepareStatement("SELECT EMP_ID, EMP_NAME FROM EMPLOYEE");
/* 쿼리 실행을 요청할 때는 sql 구문을 전달하지 않는다. */
rset = pstmt.executeQuery();
while(rset.next()) {
System.out.println(rset.getString("EMP_ID") + ", " + rset.getString("EMP_NAME"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(rset);
close(pstmt);
close(conn);
}