본문 바로가기

Java/JDBC

JDBC에서 오라클 DB 활용하는 방법

JDBC에서 오라클 DB 활용하기 전, 준비 파일

  1. ojdbc.jar 파일
  2. dbinfo.properties 파일

  • Oracle Express Edition일 경우
    • DBDRIVER=jdbc:oracle:thin:@호스트이름:포트번호:XE
  • Oracle Enterprise Edition일 경우
    • DBDRIVER=jdbc:oracle:thin:@호스트이름:포트번호:ORCL

3.전문적으로 2, 3step (DBConnection.java), 7step (DBClose)하는 파일 준비

  • 편의성을 위해 미리 만들어놓으면 좋음
  • 에버노트 JAVA JDBC참조

 

 

1. import 한다.

2. Oracle Driver Loading

방법 1

방법 2

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
  • 로 적어도 됨

 

3. DB에 Connection.

방법 1 (2, 3 step을 한번에 해결)

Oracle Driver Loading & DB에 Connection을 동시에 하는 방법

방법 2 (2setp의 방법 2와 연동)

 

4. 문장객체 (Statement or PreparedStatement) 생성

  • 사용할 인터페이스 종류
    • Statement 인터페이스
      • Statement 돌릴때 마다 진행되는 일
        1. Syntax Check
          • 문법 검사
        2. Object Check
          • ex) emp 테이블이 있는지 확인
    • PreparedStatement 인터페이스
      • Statement인터페이스보다 빠름.
      • 첫번째만 Syntax, Object Check.
        • 두번째부터는 검사 안 함
      • 사용 코드

  • 인터페이스 간 관계
    • CallableStatement(손자) -> PreparedStatement(부모) -> Statement(할아버지)

 

5. 주어진 SQL문장 실행

  • SQL문장이 SELECT일 경우
    • executeQuery()메소드 이용해서 SQL문장 실행
  • SQL문장이 SELECT를 제외한 나머지 Query문일 경우
    • executeUpdate()메소드 이용해서 SQL문장 실행

 

6. ResultSet이라는 가상테이블 (바구니)를 처리.

 

7. close

  • 닫아야할 대상
    • ResultSet
    • Statement or PreparedStatement
    • Connection

 

 

 


참조 소스

 

4step에서 Statement 인터페이스 사용한 경우

//1step : import
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.example.libs.DBClose;
import com.example.libs.DBConnection;

public class JDBCDemo {
	public static void main(String[] args) throws SQLException {
		DBConnection dbconn = new DBConnection();
		Connection conn = dbconn.getConnection();  //2, 3step : Driver Loading, Connection
//		System.out.println(conn);		//확인 차 출력.
		
		//4step : Statement 생성.
		Statement stmt = conn.createStatement();		//Statement : Interface여서 이런 방법으로  생성.
		
		String sql = " SELECT deptno, job, TO_CHAR(TRUNC(AVG(sal)), '$999,999'), " +					//TO_CHAR -> 최종적으로 자바의 String형. //따라서 32행에서 String으로 받음. 
							"                             TO_CHAR(MAX(sal), '$999,999'), " +
							"								TO_CHAR(MIN(sal), '$999,999'), COUNT(*) " +
							" FROM emp " +
							" GROUP BY deptno, job " +
							" ORDER BY deptno, job ";
//		System.out.println(sql);		//확인 차 출력.
		
		//5step : excuteQuery()를 통해서 주어진 Query실행.
		ResultSet rs = stmt.executeQuery(sql);		//바구니 ResultSet에 쿼리문에 해당하는 테이블을  담아서 Eclipse로 옴.	//커서가 테이블의 처음 내용인 deptno을 가리키고 있음.
		//6step : ResultSet 오픈.
		while(rs.next()) {			//가져온 테이블의 레코드(행) 만큼만 while문 돌음.		
			//가져온 테이블의 내용을 Eclipse의 변수가 읽어들임.
			int deptno = rs.getInt(1);
			String job = rs.getString(2);
			String avg_sal = rs.getString(3);
			String avg_max = rs.getString(4);
			String avg_min = rs.getString(5);
			int count = rs.getInt(6);
			//테이블 내용을 읽어들인 뒤, 출력
			System.out.printf("%d, %s, %s, %s, %s, %d%n",
											deptno, job, avg_sal, avg_max, avg_min, count);
		}
		
		DBClose.close(conn, stmt, rs);   //7step : close
	}
}

 

 

4step에서 PreparedStatement 인터페이스 사용한 경우

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

import com.example.libs.DBClose;
import com.example.libs.DBConnection;

//전체 경로 : DriverManager --> Connection --> Statement --> ResultSet
//				DriverManager --> Connection -->	PreparedStatement -> ResultSet

public class PreparedStatementDemo {
	public static void main(String[] args) throws SQLException {
		Scanner scan = new Scanner(System.in);
		System.out.print("부서번호 : ");
		int department_num = scan.nextInt();
		System.out.print("월급 : ");
		//PreparedStatement : ? 사용. //입력받는 값 2개 = ? 2개 사용한다는  뜻.	//24행 참조.
		double salary = scan.nextDouble();
		
		DBConnection dbconn = new DBConnection();
		Connection conn = dbconn.getConnection();		//2, 3step
		
		String sql = " SELECT  ename, deptno, sal, dname  " +		//JOIN ~ USIN절 쓸 때, 식별자 사용 금지 (emp.deptno X)
						" FROM   emp INNER JOIN dept USING(deptno) " +
						" WHERE deptno = ? AND sal >= ?";		//불완전한 SQL 문장.
		//4step : PreparedStatement (문장객체) 생성.
		PreparedStatement pstmt = conn.prepareStatement(sql);		//아직까지 불완전한 SQL 문장 // 여기서 처음이자 마지막 문법검사, 객체검사 진행.
		pstmt.setInt(1, department_num);			//int : 부서번호가 정수이므로 	//1 : 첫번째 ?를 department_num로 채워라.
		pstmt.setDouble(2, salary);				//Double : salary가 double형이므로.	//2 : 두번째 ? 를 salary로 채워라.
		//5step : executeQuery()를 통해 주어진 SQL문장 처리 //단, PreparedStatement사용시, 파라미터 X.
		ResultSet rs = pstmt.executeQuery();		//주의사항!! 파라미터로 sql전달 X.	(sql : 불완전한 SQL문장이므로)
		//6step : ResultSet 가상테이블 (바구니) 오픈해서 처리.
		while(rs.next()) {
			String ename = rs.getString("ename");
			int deptno = rs.getInt("deptno");
			double sal = rs.getDouble("sal");
			String dname = rs.getString("dname");
			System.out.println(ename + "\t" + deptno + "\t" + sal + "\t" + dname);
		}
		DBClose.close(conn);  		//7step
		
	}
}