ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [5회차] JDBC (JAVA와 ORACLE 연동)
    ORACLE 2021. 5. 3. 21:38

    강의명 : 오픈프레임워크 활용 디지털융합 SW엔지니어 양성 과정

    강의 날짜 : 21.04.30

     

    오라클 데이터베이스에 접속하기 위해서는 해당 드라이버(=객체)가 필요하다.

    오라클에서 다운로드 가능하며, 오라클 전용 드라이버로 자바와 오라클의 연동이 가능하다.

    오라클 11g은 ojdbc6이 전용 드라이버이니 확인이 필수이다.

    ojdbc의 확장자는 jar이며, 패키지를 생성할 때마다 라이브러리에서 추가를 해주어야 참조가 가능하다.

     

     

     

    1. 자바와 DB연동

     

    ① 드라이버 로딩 : 드라이버를 불러서 실행

    ② DB와 커넥션(연결)

    ③ SQL문 전송 위한 객체 할당

    ④ DB에 쿼리문 전송

    ⑤ ResultSet의 커서를 이용해 데이터 출력
    ⑥ DB와 연결된 자원 반납(해제) : 문을 닫는 것은 객체 생성의 역순

     

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    public class Firstjdbc {
    	public static void main(String[] args) {
    		try {
    			//드라이버 로딩
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			System.out.println("Driver Loading Success!");	
    			//DB와 연결
    			String url = "jdbc:oracle:thin:@localhost:1521:xe";
    			String user = "lion";
    			String pwd = "1234";
    			Connection con =DriverManager.getConnection(url,user,pwd);
    			System.out.println("DB Connected~~!");		
    			//db에 sql문을 전송하기 위한 statement객체 할당
    			Statement st = con.createStatement();
    			String sql = "SELECT * FROM DEPT";	
    			//DB에 쿼리문 전송
    			ResultSet rs = st.executeQuery(sql);
    			//커서를 이용하여 출력
    			while(rs.next()) {
    				int col1 = rs.getInt(1);
    				String col2 = rs.getString(2);
    				String col3 = rs.getString(3);
    				System.out.println(col1+"\t"+col2+"\t"+col3);
    			}
    			//db와 연결된 자원 반납(해제)
    			if(rs != null) rs.close();
    			if(st != null) st.close();
    			if(con != null) con.close();
    		}catch (ClassNotFoundException e) {
    			System.out.println(e+"=> 드라이버 로딩 오류");
    		}catch(SQLException e) {
    			System.out.println(e+"=> DB 연결 오류");
    		}
    	}
    }

     

     

    executeQuery의 반환형은 테이블 형식으로 그 값을 ResultSet에 담는다.

    즉, 커서(DB의 임시 메모리)의 자료형이 ResultSet인 것이다. (=결과 테이블)

     

    ResultSet은 무조건 한 방향으로만 움직인다. (forward only)

    데이터가 없어도 무조건 next()는 한 번 이상 실행을 해야 한다.

     

    이때 NUMBER 자료형인 DEPTNO을 getInt로, VARCHAR2자료형인 DNAME과 LOC을 getString으로 가져온다.

    하지만 NULL값의 경우에는 그냥 NULL값 그대로 가져오게 된다.

    괄호 안에는 컬럼 번호가 들어가는데, DB의 인덱스는 1번부터이므로 1번 컬럼이 DEPTNO인 것이다.

    물론 괄호 안에 인덱스명 대신 컬럼명이 들어갈 수도 있다.

     

     

     

    2. PreparedStatement Insert 예제

     

    위의 예제는 Statement 객체를 사용해 SQL문을 문장 형식으로 만들어 주었다.

    하지만 이 방식은 보안에 매우 취약하여 실무에서는 쓰이지 않는다.

    그러므로 PreparedStatement  객체를 사용하는 것이 보안상에 훨씬 유용하다.

     

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    public class PrepareStInsertTest {
    	private Connection con;
    	private PreparedStatement ps;
    
    	public PrepareStInsertTest(int empno, String ename, double sal) {
    		try {
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			String url = "jdbc:oracle:thin:@localhost:1521:xe";
    			String user = "lion";
    			String pwd = "1234";
    			Connection con =DriverManager.getConnection(url,user,pwd);
    			System.out.println("DB Connected~~!");
    			
    			String sql = "INSERT INTO EMP(EMPNO, ENAME, SAL) VALUES(?, ?, ?)";
    			ps = con.prepareStatement(sql);
    			ps.setInt(1, empno);
    			ps.setString(2, ename);
    			ps.setDouble(3, sal);
    			int result = ps.executeUpdate();
    			System.out.println("처리된 레코드의 수 : "+result);
    			ps.close();
    			con.close();
    		}catch (ClassNotFoundException e){
    			System.out.println(e+"=> 드라이버 로딩 오류");
    		}catch(SQLException e) {
    			System.out.println(e+"=> DB 연결 오류");
    		}catch(Exception e) {
    			System.out.println(e+"=> 일반 예외");
    		}
    	}
    	public static void main(String[] args) {
    		new PrepareStInsertTest(1, "JavaPris", 100);
    	}
    }

     

     

    PreparedStatement는 prepareStatement 메소드를 이용하여 미리 SQL구문을 준비해두고

    바로 실행이 이루어지도록 한다.

    와일드 카드로 값이 대체되므로 SQL문이나 데이터가 노출될 위험에서 벗어날 수 있다.

     

    executeUpdate는 처리된 레코드의 개수를 반환한다.

     

     

     

Designed by Tistory.