[JDBC]TIL(Today I Learned)_230814

Aspyn Choi·2023년 8월 14일
0

TIL

목록 보기
22/37

☝🏻오늘 배운 것

1. JDBC

- JDBC란?

: Java에서 DB에 접근할 수 있게 해주는 Java Programming API(Application Programming Interface)

: JDBC는 java.sql에 들어있음

- OJDBC란?

: 오라클에서 제공하는 오라클 DB와 자바가 연결하기 위한 라이브러리
-> Oracle JDBC Driver 제공

- OJDBC Library 이클립스에 등록 방법


-> jar압축파일 등록 후 apply and close

: OJDBC Library 등록 확인

- JDBC 사용 객체

  • DriverManager
    : 데이터 원본에 JDBC드라이버를 통하여 커넥션을 만드는 역할
    : Class.forName() 메소드를 통해 생성되며 반드시 예외처리를 해야 함
    : 직접 객체 생성이 불가능하고 getConnection() 메소드를 사용하여 객체 생성 가능

  • Connection
    : 특정 데이터 원본과 연결된 커넥션을 나타내며 Statement객체를 생성할 때도 Connection객체를 사용하여 createStatement() 메소드를 호출하여 생성
    : SQL문장을 실행시키기 전에 우선 Connection객체가 있어야 함

  • Statement
    : Connection객체에 의해 프로그램에 리턴되는 객체에 의해 구현되는 일종의 메소드 집합 정의
    : Connection클래스의 createStatement() 메소드를 호출하여 얻어지며, 생성된 Statement객체로 질의문장을 String객체에 담아 인자로 전달하여 executeQuery() 메소드를 호출하여 SQL질의 수행

  • ResultSet
    : SELECT문을 사용한 질의 성공 시 Result Set 반환
    : SQL질의에 의해 생성된 테이블을 담고 있으며 커서(cursor)로 특정 행에 대한 참조 조작

- JDBC 코딩 절차

- JDBC 코딩해보기 1

package edu.kh.jdbc1;

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

public class JDCBExample1 {
	
	public static void main(String[] args) {
	
		// JDBC : Java에서 DB에 연결할 수 있게 해주는 Java Programming API(Java에 기본으로 내장된 인터페이스)
		// java.sql 패키지에서 제공
		
		// * JDBC를 이용한 어플리케이션을 만들 때 필요한 것 
		// 1. Java의 JDBC관련 인터페이스
		// 2. DBMS(Oracle)
		// 3. Oracle에서 Java 어플리케이션과 연결할 때 사용할
		//  	JDBC를 상속받아 구현한 클래스 모음(ojdbc. jar 라이브러리)
		// 		-> OracaleDrivd.class 이용 (JDBC 드라이버)
		
		
		// 1단계 : JDCB 객체 참조 변수 선언 (java.sql패키지의 인터페이스)
		
		Connection conn = null;
		// DB연결정보를 담은 객체 
		// -> DBMS 타입, 이름, IP, Port, 계정명, 비밀번호 저장
		// -> DBeaver의 계정 접속 방법과 유사함
		// * Java와 DB 사이를 연결해주는 통로
		
		Statement stmt = null;
		// Connection을 통해 SQL문을 DB에 전달하여 실행하고
		// 생성된 결과(ResultSet, 성공한 행의 개수)를 Java로 반환하는데 사용되는 객체
		
		ResultSet rs = null;
		// SELECT 질의 성공 시 반환되는데
		// 조회 결과 집합을 나타내는 객체
		
		
		try {
			// 2단계 : 참조변수에 알맞은 객체 대입
			
			// 1. DB연결에 필요한 Oracle JDBC Driver 메모리에 로드하기
			// 런타임 시점에 해당 경로의 클래스를 동적으로 로드함
			Class.forName("oracle.jdbc.driver.OracleDriver");
			// -> ()안에 작성된 클래스의 객체를 반환
			// -> 메모리에 객체가 생성되어지고 JDBC필요 시 알아서 참조하여 사용
			// -> 생략해도 자동으로 메모리 로드가 진행됨(명시적으로 작성하는걸 권장)
			
			// 2. 연결정보를 담은 Connection을 생성
			// -> DriverManager 객체를 이용해서 Connection 객체를 만들어 얻어옴
			
			String type = "jdbc:oracle:thin:@"; // JDBC 드라이버 종류
			String ip = "localhost"; // DB 서버 컴퓨터 IP
			// == 127.0.0.1 (loop back ip) 
			String port = ":1521"; // port번호 // 1521 기본값
			String sid = ":XE"; // DB이름
			String user = "kh"; // 사용자 계정
			String pw = "kh1234"; // 비밀번호
			
			// DriverManager : 
			// 메모리에 로드된 JDBC 드라이버를 이용해서
			// Connection 객체를 만드는 역할
			
			conn = DriverManager.getConnection(type+ip+port+sid, user, pw);
			// url == type+ip+prot+sid == jdbc:oracle:thin:@localhost:1521:XE
			
			
			// 중간확인
			// System.out.println(conn);
			
			// 3. SQL 작성
			// ** JAVA 에서 작성되는 SQL은 구문 마지막에 ;을 작성하면 안됨
			String sql = "SELECT EMP_ID, EMP_NAME, SALARY, HIRE_DATE FROM EMPLOYEE";
			
			// 4. Statment 객체 생성
			// -> Connection 객체를 통해서 생성
			stmt = conn.createStatement();
			
			
			// 5. 생성된 Statement 객체에
			// sql을 적재하여 실행한 후 
			// 결과를 반환받아와서 rs 변수에 저장
			rs = stmt.executeQuery(sql);
			// executeQuery() : SELECT문 수행 메서드, ResultSet 반환
			
			
			
			// 3단계 : SQL을 수행해서 반환받은 결과(ResultSet)을
			// 			한 행씩 접근해서 컬럼값 얻어오기
			
			while(rs.next()) {
				// rs.next() : rs가 참조하고있는 ResultSet 객체의
				//				첫 번째 컬럼부터 순서대로 한 행씩 이동하며
				//				다음 행이 있을 경우 true, 없으면 false반환
			
				// rs.get자료형("컬럼명")
				String empId = rs.getString("EMP_ID");
				// 현재 행의 "EMP_ID" 문자열 컬럼의 값을 얻어옴
				int salary = rs.getInt("SALARY");
				String empName = rs.getString("EMP_NAME");
				Date hireDate = rs.getDate("HIRE_DATE"); // java.sql.Date
				
				System.out.printf("사번 : %s / 이름 : %s / 급여 : %d / 입사일 : %s\n", 
						empId, empName, salary, hireDate.toString());
			
				// java.sql.Date 의 toSting()은 yyyy-mm-dd 형식으로 오버라이딩 되어있음.
				
			}
			
		}catch(ClassNotFoundException e) {
			System.err.println("JDBC 드라이버 경로가 잘못 작성되었습니다.");
		}catch(SQLException e) {
			// SQLException : DB 관련 최상위 예외
			e.printStackTrace();
		}finally{
			
			// 4단계 : 사용한 JDBC 객체 자원 반환( close() )
			// ResultSet, Statement, Connection (생성 역순으로 닫는 것을 권장)
			
			try {
				if(rs != null) rs.close();
				if(stmt != null) stmt.close();
				if(conn!= null) conn.close();
				
			}catch(SQLException e) {
				e.printStackTrace();
			}
			
		}
		
		
	}
	

}

- JDBC 코딩해보기 2

package edu.kh.jdbc1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

public class JDBCExample2 {

	public static void main(String[] args) {
		
		// 1단계 : JDBC 객체 참조 변수 생성
		
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;

		Scanner sc = new Scanner(System.in);
		
		try {

			// 2단계 : 참조변수에 알맞은 객체 대입
			Class.forName("oracle.jdbc.driver.OracleDriver");

			String type = "jdbc:oracle:thin:@"; // JDBC 드라이버 종류
			String ip = "localhost"; // DB 서버 컴퓨터 IP
			String port = ":1521"; // port번호 // 1521 기본값
			String sid = ":XE"; // DB이름
			String user = "kh"; // 사용자 계정
			String pw = "kh1234"; // 비밀번호
			
			conn = DriverManager.getConnection(type+ip+port+sid, user, pw);
			
			System.out.println("< 입력받은 급여보다 많이 받는(초과) 직원만 조회");
			System.out.print("급여 입력 : ");
			
			int input = sc.nextInt();
			
			String sql = "SELECT EMP_ID, EMP_NAME, SALARY FROM EMPLOYEE WHERE SALARY > " + input;
			
			stmt = conn.createStatement();
			
			rs = stmt.executeQuery(sql);
			
			
			// 3단계 : SQL을 수행해서 반환받은 결과을 한 행씩 접근해서 컬럼값 얻어오기
			while(rs.next()) {
				
				String empId = rs.getString("EMP_ID");
				String empName = rs.getString("EMP_NAME");
				int salary = rs.getInt("SALARY");
				
				System.out.printf("사번 : %s / 이름 : %s / 급여 : %d\n", empId, empName, salary);
				
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}finally {
			// 4단계 : 사용한 JDBC 객체 자원 반환
			
			try {
				
				if(rs != null) rs.close();
				if(stmt != null) stmt.close();
				if(conn != null) conn.close();
				
			}catch(Exception e) {
				e.printStackTrace();
			}
			
		}
		
	}

}

- JDBC 코딩해보기 3 (혼자 연습해보기)

  • 부서별 최고 급여를 받는 직원의 이름, 직급, 부서, 급여를 부서 순으로 정렬하여 조회
package edu.kh.jdbc1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCExample3 {
	
	public static void main(String[] args) {
	// * 부서별 최고 급여를 받는 직원의 이름, 직급, 부서, 급여를 부서 순으로 정렬하여 조회	

		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		
		try {
			
			Class.forName("oracle.jdbc.driver.OracleDriver");

			String type = "jdbc:oracle:thin:@"; // JDBC 드라이버 종류
			String ip = "localhost"; // DB 서버 컴퓨터 IP
			String port = ":1521"; // port번호 // 1521 기본값
			String sid = ":XE"; // DB이름
			String user = "kh"; // 사용자 계정
			String pw = "kh1234"; // 비밀번호
			
			conn = DriverManager.getConnection(type+ip+port+sid, user, pw);
			
			String sql = "SELECT EMP_NAME, JOB_CODE, DEPT_CODE, SALARY FROM EMPLOYEE WHERE SALARY IN (SELECT MAX(SALARY) FROM EMPLOYEE GROUP BY DEPT_CODE)";
			
			stmt = conn.createStatement();
			
			rs = stmt.executeQuery(sql);
			
			while(rs.next()) {
				
				String empName = rs.getString("EMP_NAME");
				String jobCode = rs.getString("JOB_CODE");
				String deptCode = rs.getString("DEPT_CODE");
				int salary = rs.getInt("SALARY");
				
				System.out.printf("이름 : %s/ 직급 : %s/ 부서 : %s/ 급여 : %d\n", empName, jobCode, deptCode, salary);
				
			}
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally{
			
			try {
				
				if(rs != null)rs.close(); 
				if(stmt != null)stmt.close(); 
				if(conn != null)conn.close(); 
				
			}catch(Exception e) {
				e.printStackTrace();
			}
			
		}
		
	}

}

- JDBC 코딩해보기 4 (혼자 연습해보기)

  • 77년생 여자 사원과 동일한 부서이면서 동일한 사수를 가지고 있는 사원을 조회하시오.
    사번, 이름, 부서코드, 사수번호, 주민번호, 고용일 조회
package edu.kh.jdbc1;

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

public class JDBCExample4 {
	
	public static void main(String[] args) {
		// * 77년생 여자 사원과 동일한 부서이면서 동일한 사수를 가지고 있는 사원을 조회하시오. 
		//		사번, 이름, 부서코드, 사수번호, 주민번호, 고용일 조회
			
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		
		try {
			
			Class.forName("oracle.jdbc.driver.OracleDriver");

			String type = "jdbc:oracle:thin:@"; 
			String ip = "localhost";
			String port = ":1521";
			String sid = ":XE";
			String user = "kh";
			String pw = "kh1234"; 
			
			conn = DriverManager.getConnection(type+ip+port+sid, user, pw);
			
			String sql = "SELECT EMP_ID, EMP_NAME, DEPT_CODE, MANAGER_ID, EMP_NO, HIRE_DATE "
					+ "FROM EMPLOYEE "
					+ "WHERE (DEPT_CODE, MANAGER_ID) = (SELECT DEPT_CODE, MANAGER_ID "
					+ "FROM EMPLOYEE "
					+ "WHERE SUBSTR(EMP_NO, 1, 2) = '77' "
					+ "AND SUBSTR(EMP_NO, 8, 1) = '2') ";
			
//			String sql = "SELECT EMP_ID, EMP_NAME, DEPT_CODE, MANAGER_ID, EMP_NO, HIRE_DATE FROM EMPLOYEE WHERE (DEPT_CODE, MANAGER_ID) = (SELECT DEPT_CODE, MANAGER_ID FROM EMPLOYEE WHERE SUBSTR(EMP_NO, 1, 2) = '77' AND SUBSTR(EMP_NO, 8, 1) = '2')";
			
			stmt = conn.createStatement();
			
			rs = stmt.executeQuery(sql);
			
			while(rs.next()) {
				
				String empId = rs.getString("EMP_ID");
				String empName = rs.getString("EMP_Name");
				String deptCode = rs.getString("DEPT_CODE");
				String managerId = rs.getString("MANAGER_ID");
				String empNo = rs.getString("EMP_NO");
				Date hireDate = rs.getDate("HIRE_DATE");
				
				System.out.printf("사번 : %s/ 이름 : %s/ 부서코드 : %s/ 관리자사번 : %s/ 주민번호 : %s/ 입사일 : %s\n",
									empId, empName, deptCode, managerId, empNo, hireDate);
				
			}
			
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			
			try {
				
				if(rs != null)rs.close();
				if(stmt != null)stmt.close();
				if(conn != null)conn.close();
				
			}catch(Exception e) {
				e.printStackTrace();
			}
			
		}			
			
	}
	
}

0개의 댓글