
Java 응용 프로그램에서 DBMS와 연동하기 위한 표준 API
JDBC API를 이용함으로써 DBMS의 종류에 상관없이 동일한 방법으로 데이터베이스 접속 및 질의 실행 가능함.
DBMS 접속 및 이용을 위한 interface와 class들을 제공함
- DBMS vendor에서 제공하는 JDBC Driver를 통해 구현됨.

위의 그림과 같이 자바 어플리케이션과 데이터 베이스를 연동하기 위해 JDBC API를 이용한다는 의미
Oracle , MySQL등 DB의 종류는 상관없음'
준비
1. JDBC관련 Package import
2. JDBC Driver 로딩 및 등록
3. DBMS와의 Connection 획득
사용
4. SQL문 수행을 위한 Statement 객체 생성
5. Statement 객체를 사용하여 SQL 문 수행(DBMS에 질의 전송 및 수행)
6. DBMS 응답 사용(ResultSet 또는 return 값 이용)
종료
7. 자원 반납(ResultSet, Statement, Connection 등)
- java 프로그램 내에서 java.sql package를 import
import java.sql.*;
Class.forName(DRIVER_CLASS_NAME)
Class.forName("oracle.jdbc.driver.OracleDriver");
DRIVER_CLASS_NAME에 해당하는 클래스를 runtime에 동적으로 로딩
메모리에 Driver 객체를 생성하고 DriverManager 객체에 등록
JDBC Driver 클래스 예
방법1: DriverManager 이용
Connection conn = DriverManager.getConnection(url, user, passwd);
데이터베이스 접속에 필요한 Connection 객체를 구한다.
url : JDBC를 사용하여 접속할 DBMS Server와 데이터베이스의 주소 표현
- 형식: jdbc:[DBMSServer주소:port번호]:[데이터베이스식별자]
user, passwd : 접속할 데이터베이스 사용자 계정의 이름과 비밀번호
방법2: javax.sql.DataSource Interface이용
Data source를 나타내며, 그것에 대한 연결을 생성하는 factory기능 제공
DriverManager의 대안으로 connection 객체를 구하기 위한 더 좋은 방법임
일반적으로 Application Server(ex. Tomcat)에서 클래스 구현 및 객체 생성
Database connection pooling(DBCP)기능 지원
Java Naming and Directory Interface(JNDI) 서비스를 통해 DataSource 객체에 대한 참조를 제공
Application에서는 JNDI서비스를 검색(lookup)하여 DataSource객체 획득 및 사용
import javax.naming.*;
import javax.sql.*;
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/OracleDS");
Connection conn = ds.getConnection();
정적인 SQL문을 실행하고 그 결과를 반환하기 위해 사용되는 객체
Connection#createStatement()
Statement st = conn.createStatement();
질의(Select문)실행
ResultSet rs = stmt.executeQuery(query);
query : 실행할 SQL문
ResultSet 타입의 객체를 반환
DML(INSERT, UPDATE, DELETE)실행
int recordCount = stmt.executeUpdate(dml);
dml: INSERT, UPDATE, DELETE 문
삽입/변경/삭제된 행의 개수를 반환
boolean execute(String sql)
질의, DML, DDL 모두 실행 가능
질의 실행 후 결과가 있으면 true반환 -> stmt.getResultSet()으로 ResultSet구함
DML실행 후 false반환-> stmt.getUpdateCount()로 행의 개수 구함
ResultSet
- Statement.executeQuery()의 실행 결과로 반환되는 행들의 집합을 저장
ResultSet.next()

ResultSet에서 현재 커서 위치의 컬럼 값 읽는 법
rs.getString(컬럼명)
컬럼명에 해당하는 필드를 문자열로 읽어 반환
rs.getString(n)
n이 숫자인 경우 질의의 SELECT절에 지정된 n번째 컬럼값을 반환
이 외에도 getCharacter(컬럼명) getInt(컬럼명) getLong(컬럼명) 등등 이 있음.
데이터베이스 작업이 끝나면 각 자원을 반드시 반환해야함
if(rs != null){ //ResultSet 객체 존재
try{rs.close();}
catch(SQLException ex){...}
}
if(stmt != null){ //Statement 객체 존재
try{stmt.close();}
catch(SQLException ex){...}
}
if(conn != null){ //Connection 객체 존재
try{conn.close();}
catch(SQLException ex){...}
}
package jdbc.examples;
import java.sql.*; // 1. JDBC 관련 package import
public class StmtEx {
public static void main(String args[])
{
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String url = "jdbc:oracle:thin:@dblab.dongduk.ac.kr:port번호/orclpdb";
String user = "사용자 계정 이름;
String passwd = "비밀번호";
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); // 2. JDBC Driver 로딩 및 등록
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
String query = "SELECT empno, ename, dname "
+ "FROM emp JOIN dept ON emp.deptno = dept.deptno";
try {
conn = DriverManager.getConnection(url, user, passwd); // 3. DBMS와의 연결 획득
stmt = conn.createStatement(); // 4. SQL문을 위한 Statement 객체 생성
rs = stmt.executeQuery(query); // 5. Statement 객체를 사용하여 SQL문 실행
System.out.println("EmpNo Name Dept");
System.out.println("--------------------------------");
while (rs.next()) { // 6. DBMS 응답 사용
int empNo = rs.getInt("empno");
String name = rs.getString("ename");
String dname = rs.getString("dname");
System.out.printf("%d %10s %15s\n", empNo, name, dname);
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally { // 7. 자원 반납
if (rs != null) {
try {
rs.close();
} catch (SQLException ex) { ex.printStackTrace(); }
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException ex) { ex.printStackTrace(); }
}
if (conn != null) {
try {
conn.close();
} catch (SQLException ex) { ex.printStackTrace(); }
}
}
}
}
Statement 객체는 정적 SQL문만 실행할 수 있어서 한계 존재
이를 극복하고자 PreparedStatement 객체가 나옴
이에 대한 자세한 설명은 다음 글에 작성함.