JDBC는 자바에서 데이터베이스에 접근할 수 있도록 해주는 API로 자바의 java.sql 패키지를 활용하여 데이터베이스와의 연동을 가능하게 한다. 여기서는 Oracle DBMS와의 연동을 주로 다루도록 한다.
JDBC에서 주로 사용하게 될 객체들은 다음과 같다.
데이터 원본에 JDBC 드라이버를 통해 커넥션을 만드는 역할을 담당한다. Class.forName() 메소드를 통해 생성할 수 있으며 클래스 생성시 반드시 예외처리를 해줘야 한다. 또한 직접 객체를 생성할 수 없으며 getConnection() 메소드를 사용해야 객체 생성이 가능하다.
특정 데이터의 원본과 직접적으로 연결된 커넥션을 나타내며, 후술할 Statement 객체를 생성할 경우에도 Connection 객체를 사용하여 createStatement() 메소드를 호출하여 생성하는 방식을 따른다. 따라서 SQL 명령문을 실행시킬 경우 반드시 Connection 객체가 존재해야 한다.
Connection 객체에 의해 프로그램에 리턴되는 객체에 의해 구현되는 메소드들의 집합을 정의한다. Connection클래스의 createStatement() 메소드를 호출하여 얻어지며, 생성된 Statement 객체로 원하는 SQL 명령문을 String 형태로 객체에 담아 인자로 전달하여 executeQuery() 메소드를 통해 SQL 명령문을 실행하게 된다.
try{
String query = "SELECT * FROM EMP";
stmt = conn.createStatemet(); //Statement 객체
rset = stmt.executeQuery(query); //ResultSet 객체
} catch(SQLException e){
e.printStackTrace();
}
Connection 객체의 preparedStatement() 메소드를 통해 객체를 생성한다. SQL 문장이 미리 컴파일되고 실행 시간 동안 인수 값을 위한 공간을 확보한다는 점에서 위의 Statement와 차이가 있다. 쉽게 말해 SQL 문장을 미리 작성해두고 변수부에 대해서는 ?로 남겨둔 후 .setString() 메소드를 통해 별도로 대입하는 방식으로 SQL 문장을 정의한다.
try{
String query = "INSERT INTO MEMBER VALAUES(?,?)";
pstmt = conn.preparedStatement(query); //PreparedStatement 객체
pstmt.setString(1,id);
pstmt.setString(2,password);
} catch(SQLException e){
e.printStackTrace();
}
SELECT문을 사용한 질의가 성공하면 Result Set을 반환하게 된다. SQL 질의에 의해 생성된 테이블을 담고 있는 객체로 커서(cursor)로 특정 행에 대한 참조를 조작하는 방식을 취한다.
일반적인 JDBC 코딩 절차는 아래의 순서를 따른다.
DriverManager에 해당 DBMS Driver을 등록하는 절차이다. 여기서는 오라클을 주로 다루기 때문에 오라클 드라이버 설치 예시를 살펴보도록 하자. 드라이버를 등록할 때 ClassNotFoundException 예외처리를 반드시 해야 하는 점을 잊지 말자.
Class.forName("oracle.jdbc.driver.OracleDriver");
드라이버 등록이 완료되었다면 해당 드라이버로부터 Connection Instance를 획득하는 절차이다. Connection 객체를 생성하거나 Connection 객체를 반환하는 별도의 메소드(주로 정적 메소드로 만듦) 호출을 통해 연결한다. 여기도 SQLException 예외처리를 반드시 해주어야 한다.
public static Connectino getConnection(String url, String user, String password) throws SQLException{
//메소드 생성 후 Connection 객체 반환
}
//Connectino 객체 생성
Connectino conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe","sccot","tiger");
Statement 생성
Connection Instance로 부터 Statement Instance를 획득하는 절차이다. 여기도 SQLException을 처리하도록 한다.
Statement stmt = conn.createStatement();
SQL 전송, 결과 받기
Statement method를 통해 SQL 명령문을 실행하고 그 결과를 ResultSet 혹은 int형 변수(DML)로 받아서 처리하는 절차이다. SQL 명령문이 Select 쿼리문이라면 ResultSet에 executeQuery() 메소드를 호출하여 결과를 바로 담도록 하고, UPDATE와 같은 명령문일 경우에는 수정된 쿼리의 수만큼 int형 변수에 담도록 한다.
String query = "SELECT ID,LAST_NAME FROM EMP";
ResultSet rset = stmt.executeQuery(query);
while(rset.next()){
//결과 확인용 출력
System.out.println(rset.getString("ID")+"\t"+rset.getString(2)));
}
//UPDATE 명령문일 경우
String query = "UPDATE EMP SET LAST_NAME = 'KIM'" + "WHERE ID = '10000'";
int result = stmt.executeUpdate(query);
닫기, 객체 반환
앞에서 획득한 모든 인스턴스들을 획득한 순서 반대로 .close()를 통해 닫아주도록 한다.
rset.close(); //ResultSet을 사용한 경우
stmt.close();
con.close();