본문 바로가기
☕Java/JDBC

[20210611] JDBC

by 캔 2021. 6. 11.

JDBC를 통해 오라클 데이터베이스에 저장된 데이터에 접근하는 것이 가능하다. 오라클 데이터베이스 안에서 데이터를 다루는 것은 오라클 데이터베이스 카테고리에서 설명해 놓았다.

여기서는 자바 프로그램에서 JDBC를 통해 오라클 데이터베이스에 접근할 수 있도록 하는 코드를 기술한다.

//JDBCEx02.java
package Day11;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class JDBCEx02 {
	public static void main(String[] args) throws Exception {
    	//---------서버 접속을 위한 정보(드라이버명, url, 사용자이름, 비밀번호) 선언
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@localhost";
		String user = "scott";
		String password = "tiger";
		
        //---------연결을 위한 객체들 생성
        //Connecton: 데이터베이스에 연결 및 접속하기 위한 객체
        //PreparedStatement: SQL문을 미리 컴파일해놓은 객체
        //ResultSet: SQL문 중 SELECT문으로 질의한 결과를 저장하기 위한 객체
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
        //연결부: 연결을 하기 위한 코드들
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url, user, password);
			System.out.println("conn: "+ conn);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
        //조작부: SQL문을 실행하여 질의(Query)를 실행하거나 데이터를 삽입(insert), 수정(update), 삭제(delete)
        //여기서는 SELECT문을 통해서 데이터베이스에 질의하고 결과를 가져온다.
		String sql = "select * from emp";
		try {
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();//SQL문을 실행한 결과를 ResultSet에 입력
			
			while(rs.next()) {
            //ResultSet에 저장된 결과 집합에서 필요한 각각의 데이터들을 형에 맞춰 자바의 변수로 가져옴
				int empno = rs.getInt("empno");
				String ename = rs.getString("ename");
				int sal = rs.getInt("sal");
				String hiredate = rs.getString("hiredate");
				int deptno = rs.getInt("deptno");
				
				System.out.print("사번: "+empno);
				System.out.print(", 사원명: "+ename);
				System.out.print(", 급여: "+sal);
				System.out.print(", 입사일: "+hiredate.substring(0, 10));
				System.out.print(", 부서번호: "+deptno);
				System.out.println();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
			rs.close();
			pstmt.close();
			conn.close();
			} catch(SQLException e) {
				e.printStackTrace();
			}
		}
	}
}
//MakeConnection.java
package Day11;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MakeConnection {

	private static String DRIVER = "oracle.jdbc.driver.OracleDriver";
	private static String URL = "jdbc:oracle:thin:@localhost";
	private static String USER = "scott";
	private static String PASSWORD = "tiger";

	static Connection conn = null;
	private static MakeConnection mc;
	private MakeConnection() {}
	
	public static MakeConnection getInstance() {
		if(mc == null) mc = new MakeConnection();
		return mc;		
	}
	
	public static Connection getConnection() {
		try {
			Class.forName(DRIVER);
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
}

첫 번째 코드에서 연결부를 MakeConnection 클래스로 만들어주었다. 매번 연결할 때마다 코드를 다시 작성하는 것은 비효율적이므로 클래스를 만들어 사용한다. 

package Day11;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import Day11.MakeConnection;

public class JDBCEx05 {

	public static void main(String[] args) {
    //연결부
		Connection conn = MakeConnection.getConnection();
		System.out.println("conn : " + conn);
	//INSERT문 수행을 위한 데이터 변수 선언	
		int empno = 7945;
		String ename = "홍길동";
		String job = "산적";
		int mgr = 7900;
		String hiredate = "1812/02/03";
		int sal = 2000;
		int comm = 0;
		int deptno = 50;
		StringBuffer sb = new StringBuffer();//StringBuffer는 가변적인 문자열을 다루는 클래스
		sb.append("insert into emp ");SQL문을 StringBuffer에 뒤쪽으로 추가(append)
		sb.append("values (?,?,?,?,?,?,?,?) ");//'? 위치에 데이터를 추가 하겠다는 의미
		
		PreparedStatement pstmt = null;
	//조작부
		try {
			pstmt = conn.prepareStatement(sb.toString());
			pstmt.setInt(1, empno);//sb의 첫 번째 물음표에 데이터 추가
			pstmt.setString(2, ename);//sb의 두 번째 물음표에 데이터 추가
			pstmt.setString(3, job);//sb의 세 번째 물음표에 데이터 추가
			pstmt.setInt(4, mgr);//sb의 네 번째 물음표에 데이터 추가
			pstmt.setString(5, hiredate);//sb의 다섯 번째 물음표에 데이터 추가
			pstmt.setInt(6, sal);//sb의 여섯 번째 물음표에 데이터 추가
			pstmt.setInt(7, comm);//sb의 일곱 번째 물음표에 데이터 추가
			pstmt.setInt(8, deptno);//sb의 여덟 번째 물음표에 데이터 추가
						
			pstmt.executeUpdate();//update, insert, delete문은 executeQuery가 아닌 executUpdate를 사용한다.
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				pstmt.close();
				conn.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
			
	}

}