JDBC(Java Database Connectivity) Driver
- JDBC: 자바에서 데이터베이스에 접속할 수 있도록 해주는 자바 API
- 자바 프로그램에서 오라클 데이터베이스를 이용하려면 오라클에서 제공하고 있는 드라이버가 필요하다.
- 드라이버(Driver): 오라클에서는 자신들의 데이터베이스 시스템을 사용할 수 있도록 자바 코드로 미리 오라클을 사용할 수 있는 개념을 만들어놨는데, 이것을 드라이버라고 부른다.
- 드라이버는 서로 다른 시스템간의 인터페이스 역할을 한다.
ex) 컴퓨터 - 프린터: 컴퓨터와 프린터를 연결하기 위해서는 컴퓨터에 프린터 드라이버를 깔아야 한다.
JDBC 연동 방법
1. ojdbc6.jar 파일 연동
ojdbc6.jar 파일을 다운로드하여 자바가 설치되어 있는 폴더에 넣어야 한다.
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib에 jar 파일을 저장했다.
jar 파일(jar archive file)이란?
- 일종의 자바 프로젝트 압축 파일
- jar 파일은 웹브라우저에서 빠르게 다운로드할 수 있도록 자바 클래스, 이미지, 사운드 등의 파일들을 하나의 파일에 압축하여 담고 있는 파일
- 오라클 공식 홈페이지에서는 자바와 오라클을 연동할 수 있는 드라이버를 포함한 ojdbc6.jar 파일을 무료로 배포하고 있다.
2. 이클립스에 ojdbc6.jar 파일 넣기
3. 드라이버 클래스 로딩
- 자바 프로그램에서 데이터베이스 연동을 하기 위해서 jdbc 드라이버를 라이브러리에 저장했는데, 그 안에 있는 코드를 활용하기 위해서 드라이버 클래스를 로딩해줘야 한다.
- ojdbc6.jar파일 안에 oracle.jdbc.driver 패키지 안에 OracleDriver라는 클래스가 있다. 이 클래스를 로딩해야 한다.
package day01;
public class ExamDriverLoad {
public static void main(String[] args) {
//1. 자바와 DB 사이의 통역사 역할을 하는 driver 클래스를 로딩한다.
try{Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("클래스 로딩 성공!"); //클래스가 있을 때
} catch (ClassNotFoundException e) {
e.printStackTrace(); //클래스가 없을 때
}
}
}
4. 데이터베이스 연동을 위한 커넥션
- url = "jdbc:oracle:thin:@localhost:1521:xe"
- 프로토콜(jdbc):dbms유형(oracle):드라이브타입(thin):@host:port(포트번호 1521):전역데이터베이스
- @localhost: 자기 자신에 접속 / 다른 컴퓨터에 접속하려면 해당하는 곳의 아이피 입력
- oracle listener가 동작하면 1521번 포트가 열려 있다.
- DriverManager 클래스의 getConnection() 메서드 호출 => url과 계정, 계정의 비밀번호를 입력
- getConnection()은 데이터베이스에 접속해서 접속 정보를 담고 있는 객체인 Connection을 반환한다.
- Connection이 성공하면 "데이터베이스 접속 성공!" 출력
- 접속이 안되는 경우는 SQLException이 발생한다. 오라클에 쿼리를 전송했는데 오라클 쪽에서 에러가 발생했다면 그 에러를 Exception으로 반환한다. catch문을 통해 어떤 에러가 났는지 확인해 볼 수 있다.
package day01;
import java.sql.*;
public class ExamDriverLoad {
public static void main(String[] args) {
try{
//1. 자바와 DB 사이의 통역사 역할을 하는 driver 클래스를 로딩한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("클래스 로딩 성공!");
//2. DB 연동을 위한 커넥션
String user = "scott";
String password = "tiger";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
//프로토콜:dbms유형:드라이브타입:@host:port:전역데이터베이스
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("데이터베이스 접속 성공!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
5. SQL문 작성
package day01;
import java.sql.*;
public class ExamDriverLoad {
public static void main(String[] args) {
try{
//1. 자바와 DB 사이의 통역사 역할을 하는 driver 클래스를 로딩한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("클래스 로딩 성공!");
//2. DB 연동을 위한 커넥션
String user = "scott";
String password = "tiger";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
//프로토콜:dbms유형:드라이브타입:@host:port:전역데이터베이스
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("데이터베이스 접속 성공!");
//3. SQL문 작성
String sql = "SELECT empno, ename, job, hiredate, sal, deptno "
+ "FROM emp WHERE JOB = 'MANAGER'";
System.out.println(sql);
System.out.println("-------------------------------------------------------");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
6. Statement 객체 얻어오기
- Statement 객체: 데이터베이스에 SQL을 전송하고, 그 결과물을 얻어오는 역할을 한다.
package day01;
import java.sql.*;
public class ExamDriverLoad {
public static void main(String[] args) {
try{
//1. 자바와 DB 사이의 통역사 역할을 하는 driver 클래스를 로딩한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("클래스 로딩 성공!");
//2. DB 연동을 위한 커넥션
String user = "scott";
String password = "tiger";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
//프로토콜:dbms유형:드라이브타입:@host:port:전역데이터베이스
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("데이터베이스 접속 성공!");
//3. SQL문 작성
String sql = "SELECT empno, ename, job, hiredate, sal, deptno "
+ "FROM emp WHERE JOB = 'MANAGER'";
System.out.println(sql);
System.out.println("-------------------------------------------------------");
//4. Statement객체 얻어오기
//Statement객체: 데이터베이스에 SQL을 전송하고, 그 결과물을 얻어오는 역할
Statement stmt= con.createStatement();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
7. ResultSet 객체 얻어오기 & execute (쿼리 실행)
- ResultSet 객체: 오라클에서 쿼리를 실행해서 나온 결과물을 담는 객체
- executeQuery() 메서드: SQL 쿼리문 실행
- 오라클에서 SELECT문의 결과로 나온 것을 자바에서 응답받을 때 ResultSet 객체가 그 전체 내용을 가지고 있다.
package day01;
import java.sql.*;
public class ExamDriverLoad {
public static void main(String[] args) {
try{
//1. 자바와 DB 사이의 통역사 역할을 하는 driver 클래스를 로딩한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("클래스 로딩 성공!");
//2. DB 연동을 위한 커넥션
String user = "scott";
String password = "tiger";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
//프로토콜:dbms유형:드라이브타입:@host:port:전역데이터베이스
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("데이터베이스 접속 성공!");
//3. SQL문 작성
String sql = "SELECT empno, ename, job, hiredate, sal, deptno "
+ "FROM emp WHERE JOB = 'MANAGER'";
System.out.println(sql);
System.out.println("-------------------------------------------------------");
//4. Statement객체 얻어오기
//Statement객체: 데이터베이스에 SQL을 전송하고, 그 결과물을 얻어오는 역할
Statement stmt= con.createStatement();
//5. ResultSet객체 얻어오기 & execute(쿼리실행)
ResultSet rs = stmt.executeQuery(sql.toString());
//executeQuery() 호출: 위에 만들었던 sql 구문을 전달
//오라클에서 SELECT문의 결과로 나온 것을 자바에서 응답받을 때
//ResultSet 객체가 그 전체 내용을 가지고 있음
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
8. ResultSet 객체 순회
- 오라클의 결과를 담고 있는 ResultSet 객체를 하나 하나씩 레코드 순회해야 한다.
- rs.next(): 레코드(행, row)가 존재하는지 찾음 => 존재하면 true. 반복문 실행
- 컬럼의 값을 꺼낼 때는 숫자로 찾거나 컬럼명으로 찾아도 된다.
※ 주의: 자료형을 잘 매치해야 함
package day01;
import java.sql.*;
public class ExamDriverLoad {
public static void main(String[] args) {
try{
//1. 자바와 DB 사이의 통역사 역할을 하는 driver 클래스를 로딩한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("클래스 로딩 성공!");
//2. DB 연동을 위한 커넥션
String user = "scott";
String password = "tiger";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
//프로토콜:dbms유형:드라이브타입:@host:port:전역데이터베이스
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("데이터베이스 접속 성공!");
//3. SQL문 작성
String sql = "SELECT empno, ename, job, hiredate, sal, deptno "
+ "FROM emp WHERE JOB = 'MANAGER'";
System.out.println(sql);
System.out.println("-------------------------------------------------------");
//4. Statement객체 얻어오기
//Statement객체: 데이터베이스에 SQL을 전송하고, 그 결과물을 얻어오는 역할
Statement stmt= con.createStatement();
//5. ResultSet객체 얻어오기 & execute(쿼리실행)
ResultSet rs = stmt.executeQuery(sql.toString());
//executeQuery() 호출: 위에 만들었던 sql 구문을 전달
//오라클에서 SELECT문의 결과로 나온 것을 자바에서 응답받을 때
//ResultSet 객체가 그 전체 내용을 가지고 있음
//6. ResultSet객체 순회
while(rs.next()) {
int empno = rs.getInt(1); //해당 레코드(행)의 첫 번째 컬럼의 값을 꺼냄
String ename = rs.getString("ENAME"); //해당 레코드(행)의 ename 값을 꺼냄
String job = rs.getString(3); //해당 레코드(행)의 세 번째 컬럼의 값을 꺼냄
java.sql.Date hiredate = rs.getDate(4); //해당 레코드(행)의 네 번째 컬럼의 값을 꺼냄
int sal = rs.getInt("SAL"); //해당 레코드(행)의 sal 값을 꺼냄
int deptno = rs.getInt(6); //해당 레코드(행)의 여섯 번째 컬럼의 값을 꺼냄
System.out.printf("%d\t%s\t%s\t%s\t%d\t%d\n",
empno, ename, job, hiredate.toString(), sal, deptno);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
9. DB 연결자원 반납
- ResultSet의 rs, Statement의 stmt, Connection의 con 자원을 각각 반납한다.
- 반납 순서: 가장 먼저 만들어진 객체를 가장 마지막에 반납해야 한다.
package day01;
import java.sql.*;
public class ExamDriverLoad {
public static void main(String[] args) {
try{
//1. 자바와 DB 사이의 통역사 역할을 하는 driver 클래스를 로딩한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("클래스 로딩 성공!");
//2. DB 연동을 위한 커넥션
String user = "scott";
String password = "tiger";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("데이터베이스 접속 성공!");
//3. SQL문 작성
String sql = "SELECT empno, ename, job, hiredate, sal, deptno "
+ "FROM emp WHERE JOB = 'MANAGER'";
System.out.println(sql);
System.out.println("-------------------------------------------------------");
//4. Statement객체 얻어오기
//Statement객체: 데이터베이스에 SQL을 전송하고, 그 결과물을 얻어오는 역할
Statement stmt= con.createStatement();
//5. ResultSet객체 얻어오기 & execute(쿼리실행)
ResultSet rs = stmt.executeQuery(sql.toString());
//executeQuery() 호출: 위에 만들었던 sql 구문을 전달
//오라클에서 SELECT문의 결과로 나온 것을 자바에서 응답받을 때
//ResultSet 객체가 그 전체 내용을 가지고 있음
//6. ResultSet객체 순회
//오라클의 결과를 담고 있는 ResultSet 객체를 하나 하나 레코드 순회해야 함
//rs.next(): 레코드(행, row)가 존재하는지 찾게 됨 => 존재하면 true. while문 실행
//숫자로 쓰거나 컬럼네임으로 써도 된다. 주의: 자료형을 잘 선택해야 함
while(rs.next()) {
int empno = rs.getInt(1); //해당 레코드(행)의 첫 번째 컬럼의 값을 꺼냄
String ename = rs.getString("ENAME"); //해당 레코드(행)의 ename 값을 꺼냄
String job = rs.getString(3); //해당 레코드(행)의 세 번째 컬럼의 값을 꺼냄
java.sql.Date hiredate = rs.getDate(4); //해당 레코드(행)의 네 번째 컬럼의 값을 꺼냄
int sal = rs.getInt("SAL"); //해당 레코드(행)의 sal 값을 꺼냄
int deptno = rs.getInt(6); //해당 레코드(행)의 여섯 번째 컬럼의 값을 꺼냄
System.out.printf("%d\t%s\t%s\t%s\t%d\t%d\n",
empno, ename, job, hiredate.toString(), sal, deptno);
}
//7. DB 연결자원 반납
if(rs!=null) rs.close();
if(stmt!=null) stmt.close();
if(con!=null) con.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
전체 코드 및 실행결과
package day01;
import java.sql.*;
public class ExamDriverLoad {
public static void main(String[] args) {
try{
//1. 자바와 DB 사이의 통역사 역할을 하는 driver 클래스를 로딩한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("클래스 로딩 성공!");
//2. DB 연동을 위한 커넥션
String user = "scott";
String password = "tiger";
String url = "jdbc:oracle:thin:@localhost:1521:XE";
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("데이터베이스 접속 성공!");
//3. SQL문 작성
String sql = "SELECT empno, ename, job, hiredate, sal, deptno "
+ "FROM emp WHERE JOB = 'MANAGER'";
System.out.println(sql);
System.out.println("-------------------------------------------------------");
//4. Statement객체 얻어오기
Statement stmt= con.createStatement();
//5. ResultSet객체 얻어오기 & execute(쿼리실행)
ResultSet rs = stmt.executeQuery(sql.toString());
//6. ResultSet객체 순회
while(rs.next()) {
int empno = rs.getInt(1);
String ename = rs.getString("ENAME");
String job = rs.getString(3);
java.sql.Date hiredate = rs.getDate(4);
int sal = rs.getInt("SAL");
int deptno = rs.getInt(6);
System.out.printf("%d\t%s\t%s\t%s\t%d\t%d\n",
empno, ename, job, hiredate.toString(), sal, deptno);
}
//7. DB 연결자원 반납
if(rs!=null) rs.close();
if(stmt!=null) stmt.close();
if(con!=null) con.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}