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 파일 넣기

이클립스 라이브러리에 ojdbc6.jar파일을 넣어준다.

 

 

3. 드라이버 클래스 로딩

  • 자바 프로그램에서 데이터베이스 연동을 하기 위해서 jdbc 드라이버를 라이브러리에 저장했는데, 그 안에 있는 코드를 활용하기 위해서 드라이버 클래스를 로딩해줘야 한다.
  • ojdbc6.jar파일 안에 oracle.jdbc.driver 패키지 안에 OracleDriver라는 클래스가 있다. 이 클래스를 로딩해야 한다.

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();
			}
		
	}

}

ResultSet 객체가 담고 있는 오라클 결과물

 

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();
			}
			
	}

}

실행 결과

 

+ Recent posts