230814 TIL Chapter 26. JDBC

최규연·2023년 8월 14일
0

TIL

목록 보기
28/57

DB가 끝나고 JDBC 첫 시간

JDBC

JDBC란 Java에서 DB에 접근할 수 있게 해주는 Java Programming API이다.
API란 Application Programming Interface로 자바에 기본으로 내장되어 있는 인터페이스이다. ( java.sql 패키지에서 제공 )
내가 사용할 OJDBC는 오라클에서 제공하는 오라클 DB와 자바가 연결하기 위한 라이브러리이다.

JDBC를 이용한 애플리케이션 만들기

JDBC를 이용한 애플리케이션을 만들때 필요한 3가지

  • Java의 JDBC 관련 인터페이스
  • DBMC ( Oracle )
  • Oracle에서 Java 애플리케이션과 연결할 때 사용할 JDBC를 상속받아 구현한 클래스 모음

JDBC 사용해보기

코드 하나씩 정리해보고 마지막으로 한번에 묶은 코드를 보면 이해가 쉬을 것 이다.

1단계 : JDBC 객체 참조 변수 선언 ( java.sql 패키지의 인터페이스 )

Connection conn = null;
// DB 연결 점보를 담을 객체

Statement stmt = null;
// Connection을 통해 SQL문을 DB에 전달하여 실행하고
// 생성된 결과(ResultSet, 성공한 행의 개수)를 반환(java)하는데 사용되는 객체

ResultSet rs = null;
// SELECT 질의 성공시 반환
// 조회 결과 집합을 나타내는 객체

2단계 : 참조변수에 알맞은 객체 대입

// 예외처리를 위해 try문안에 작성
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
// 1. DB 연결에 필요한 Oracle JDBC Driver 메모리에 로드
// 런타임 시점에 해당 경로의 클래스를 동적으로 로드한다.
// -> () 안에 작성된 클래스의 객체를 반환
// -> 메모리에 객체가 생성되어지고 JBDC 필요시 알아서 참조하여 사용
// --> 생략해도 자동으로 메모리 로드가 진행되지만 명시적으로 작성하는걸 권장

// 2. 연결 정보를 담은 Connection을 생성
// -> DriverManager 객체를 이용해서 Connection 객체를 만들어 얻어옴!
// 밑 코드는 참고용
String type = "jdbc:oracle:thin:@";
String ip = "localhost";
String port = ":1521";
String sid = ":XE";
String user = "kh";
String pw = "kh1234";

// DriverManager
// 메모리에 로드된 JDBC 드라이버를 이용해서 Connection 객체를 만드는 역할.
conn = DriverManager.getConnection(type+ip+port+sid, user, pw);
// url == jdbc:oracle:thin:@localhost:1521:XE

// 3. SQL 작성
// ** JAVA에서 작성되는 SQL은 마지막에 ; 찍으면 안된다. **
String sql = "SELECT EMP_ID , EMP_NAME , SALARY , HIRE_DATE FROM EMPLOYEE";

// 4. Statement 객체 생성
// -> 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" 문자열 컬럼의 값을 얻어옴
    
    String empName = rs.getString("EMP_NAME");
    int salary = rs.getInt("SALARY");
    
    // java.sql.Date
	Date hireDate = rs.getDate("HIRE_DATE");
    
    System.out.printf("사번 : %s / 이름 : %s / 급여 : %d / 입사일 : %s \n",
						empId, empName, salary, hireDate.toString()
						);
                        
	// java.sql.Date 의 toStirng()은 yyyy-mm-dd 형식으로 오버라이딩 되어있다.
    } catch(ClassNotFoundException e) {
		System.err.println("JDBC 드라이버 경로가 잘못 작성되었습니다.");
    } catch(SQLException e) {
    	e.printStackTrace();
    } finally {
    	// 4단계 : 사용한 JDBC 객체 자원 반환 ( close() )
        // ResultSet, Statment, Connection 순으로(생성 역순) 닫는 것을 권장
    	try {
        if(rs != null) rs.close();
		if(stmt != null) stmt.close();
		if(conn != null) conn.close();
        } catch(SQLException e) {
			e.printStackTrace();
		}
    }

위 코드를 주석을 뺀 뒤 String sql문에 Scanner로 입력받은 값을 출력하도록 마지막으로 정리해보면

Connection conn = null;
Statement stmt = null;
ResultSet rs = null;

Scanner sc = new Scanner(System.in);

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);
    
    System.out.print("검색할 DEPT_CODE를 입력하세요 : ");
    String input = sc.nextLine();
    
    String sql = "SELECT EMP_ID , EMP_NAME , DEPT_CODE , HIRE_DATE FROM EMPLOYEE WHERE DEPT_CODE = '" + input + "'";
    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");
				Date hireDate = rs.getDate("HIRE_DATE");
         
         Systemn.out.printf("사번 : %s 이름 : %s 직급코드 : %s 입사일 : %s \n",
									empId, empName, deptCode, 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개의 댓글