본문 바로가기

데이터베이스/Oracle

JDBC 사용해보기

이것처럼 자바도 연결해줘야함
DB와 연결

// ver1 4, 5번이 아래 ver2와 다름

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCTest2 {

	public static void main(String[] args) {
        //1. JDBC드라이버설치(오라클DB에서 제공하는 자바 개발자를 위한 압축 라이브러리 파일)
		
        //2. 드라이버클래스들 JVM에 로드
        try {
            Class.forName("oracle.jdbc.OracleDriver");
            System.out.println("JDBC드라이버 로드성공");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            return;
        }
		
        //3. DB와 연결
        Connection conn = null;
        String url = "jdbc:oracle:thin:@localhost:1521:xe";	//보통 OCI와 thin중 thin씀, @+접속할 ip
        String user = "hr";
        String password = "hr";
        try {
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("DB와 연결 성공");
		} catch (SQLException e) {
			e.printStackTrace();
			return;
		}

		//4. SQL문 DB에 송신하기
		Statement stmt = null;
		
		// 5. SQL문 결과 수신하기
		ResultSet rs = null;
		

		try {
			stmt = conn.createStatement();
			int dId = 60; // 부서번호
			String fn = "D";
			String selectSQL = "SELECT employee_id, first_name, hire_date, salary\r\n"
								+ "FROM employees\r\n"
								+ "WHERE department_id=" + dId + "AND SUBSTR(first_name, 1, 1) = '" + fn + "'";
																								// " " 자바변수 선언 + + 는 연결
																								// ' ' SQL 문법
			// \r\n 줄바꿈 이대로 써도됨
			// 먼저 SQL developer를 통해서 오타 있는지 없는지 확인하는 작업부터 할 것
			// department_id=60;"; 안에 ;은 필요없음
			
			rs = stmt.executeQuery(selectSQL); //rs : 결과집합수신 //송신(stmt.executeQuery(selectSQL))
			while(rs.next()) {	// while(rs.next() == true) ) {
				int eId = rs.getInt("employee_id"); // 컬럼의 자료형이 숫자 자료형이다.
				String eName = rs.getString(2); // rs.getString("first_name"); // 컬럼의 자료형이 글자 자료형이다.
				Date eHdt = rs.getDate("hire_date"); // 컬럼의 자료형이 날짜 자료형이다.
                                                     // sql의 date 타입
				int eSal = rs.getInt("salary");
				System.out.println(eId + ":" + eName + ":" + eHdt +  ":" + eSal );
				}			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally { //연결했으면 무조건 끊어야함. 각각 close 필요
			if(rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
				}
			} 
			if(stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
				}
			}
			
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
				}
			}
		
		}	
	}
}
// ver2

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCTest2 {

	public static void main(String[] args) {
		//1. JDBC드라이버설치(오라클DB에서 제공하는 자바 개발자를 위한 압축 라이브러리 파일)
		
		//2. 드라이버클래스들 JVM에 로드
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			System.out.println("JDBC드라이버 로드성공");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return;
		}
		
		//3. DB와 연결
		Connection conn = null;
		String url = "jdbc:oracle:thin:@localhost:1521:xe";	//보통 OCI와 thin중 thin씀, @+접속할 ip
		String user = "hr";
		String password = "hr";
		try {
			conn = DriverManager.getConnection(url, user, password);
			System.out.println("DB와 연결 성공");
		} catch (SQLException e) {
			e.printStackTrace();
			return;
		}
		
		//4. SQL문 DB에 송신하기
		PreparedStatement pstmt = null;
		//준비된 구문, 이걸로 보내는걸 더 권장
		
		// 5. SQL문 결과 수신하기
		ResultSet rs = null;
		
		String selectSQL = "SELECT employee_id, first_name, hire_date, salary\r\n"
				+ "FROM employees\r\n"
				+ "WHERE department_id=?\r\n"	//	?은 바인드변수. 값의 위치에만 와야함. 값이 아닌 위치인 테이블위치나 컬럼명 등 불가능 
												// ORDER BY first_name ? 이렇게 못옴.
				+ "AND SUBSTR(first_name, 1, 1) = ?";
		try {	// SQL 구문 오라클 엔진에게 보내서 기억시킴
			pstmt = conn.prepareStatement(selectSQL);	// 송신
			pstmt.setInt(1, 60); // 첫번째 물음표 1을 60 정수로 대입, sql은 인덱스가 1부터 시작임
			pstmt.setString(2, "D"); // 두번째 물음표 2는 "D" 문자로 대입
			rs = pstmt.executeQuery(); // ?값만 송신, 안에 인자/매개변수 필요없음
			//executeQuery = select문 // executeUpdate 도 있
			
			while(rs.next()) {	// while(rs.next() == true) ) {
				int eId = rs.getInt("employee_id");
				String eName = rs.getString(2);
				Date eHdt = rs.getDate("hire_date");
				int eSal = rs.getInt("salary");
				System.out.println(eId + ":" + eName + ":" + eHdt +  ":" + eSal );
				}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if(rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
				}
			} 
			if(pstmt != null) {
				try {
					pstmt.close();
				} catch (SQLException e) {
				}
			}
			
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
				}
			}
		
		}
		
		
	}
}

커서가 행을 이동해서 검증 ture일때 반환
이런거 안좋음
executeUpdate