카테고리 없음

JDBC(Java Database Connectivity) 정리

coyojo 2022. 11. 21. 15:18

JDBC(Java Database Connectivity) - 오라클과 연동!! 

=> 자바가 DBMS와 연동하기 위한 기술. 즉 java 프로그램에서 SQL문을 실행하기 위해서 제공하는 API)

 

<< 오라클에 접속하여 JDBC를 사용하기 전에 해야할 일>>

1. 오라클 드라이버를 다운로드 받기 

 

 - 오라클이 설치되어 있는 경우 (xe) 11버전 
 c:/oraclexe/app/oracle/product/11.2.0/server/jdbc/lib의 ojdbc6.jar을 사용

 

 

JVM이 인식할 수 있는 위치로 오라클 드라이버를 복사
 1) 작업프로젝트 선택
 2) 프로젝트 선택 후 단축메뉴 - [Build path] -[Configure Build Path] 선택
 3) 대화상자의 세 번째 탭인 [libraries]탭 선택
 4) [classpath] 선택 후 [add external Jar..]버튼을 선택 후 라이브러리 파일의 경로를 찾아 드라이버를 등록
    c:\orclexe\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar

 

==================================================================

 

 << 자바로 jdbc 연동>>  API로 작업
    
    1. 오라클드라이버 로딩
      클래스로더를 이용해서 드라이버의 핵심 클래스를 메모리에 로딩 
      java.lang 패키지의 class 라는 클래스의 forName 이라는 메소드를 이용해서 

     오라클 드라이버의 핵심 클래스를 메모리에 로딩!  핵심클래스는 드라이버 클래스라고 하며

      드라이버 클래스는 어떤 DBMS를 이용하냐에 따라서 달라진다.

 

 

[문법] 

  Class.forName("메모리에 로딩하고 싶은 클래스명(패키지까지 명시)")

 

 

[오라클]
      class.forName("oracle.jdbc.driver.OracleDriver")
                              ---------------------------------------------
                          오라클 드라이버명 ( 오라클 드라이버의 핵심 클래스 ) = >

                제조사가 제공하는 드라이버이다! 오라클, mysql 다 각기 다르다! 

=================================================================

 

2. 데이터베이스 연결 객체 생성  
    문법 : DriveManager.getConnection(url,user,password)

 

** * API확인하기!  Overview (Java Platform SE 8 ) (oracle.com)
    java.sql의 DriveManager 클래스 에서 getCOnnections의 세번쨰 메서드인 
     ' static Connection getConnection(String url, String user, String password)'를 사용

 

<DB서버에 연결하기>
    => java.sql패키지의 API를 이용 
    DriverManager의 getConnection메소드를 이용해서 DB서버에 연결
     1) static 메소드이므로 클래스 이름으로 엑세스
     2) throws하고 있는 SQLException은 Exception클래스의 하위이므로 문법적으로 Exception처리를 해야 한다.

    3) 매개변수
          url :   연결문자열 ( 어떤 DBMS를 쓰느냐에 따라 내부에서 인식되어질 문자열을 다른 형식으로 지정 - 교재 참고)
        [오라클]
         jdbc :orcle : thin : @ip : port: 데이터베이스서비스명 
         -------------------     ---------------   --------------------------
         오라클에서 사용하는      |             |_______오라클 설치할때 설정하는 값으로 express edtion버전은 xe
         프로토콜                         |
                                                |___  DBMS가 설치되어 있는 서버의 ip와 접속 port(1521)
    
    
          ex) 127.0.0.1  또는 localhost ==> 현재 작업중인 pc(로컬)
               jdbc:orcle:thin:@127.0.0.1:1521:xe
               jdbc:orcle:thin:@localhost:1521:xe
               jdbc:orcle:thin:@본인ip주소 : 1521 :xe    

 

                
           user :  사용자계정(scott)
           password :  패스워드(scott계정의 password )

 

 

========================================================================

4) 리턴타입


   java.sql.Connection을 리턴 ( 즉, 오라클 연결정보를 리턴!)
   
   자바의 DriverManager 클래스의 getConnection 메소드는 DB서버에 연결하고 연결정보를 객체로 만들어서 리턴
                               
   표준 API는 java.sql.Connection을 리턴한다고 명시되어 있지만 DBMS의 드라이버가 어떤 드라이버가 로딩되어 있는지에 따라 달라진다. (connection은 인터페이스 )

 

 

=========================================================================

 

 3. SQL 문 실행 기능이 제공되는 객체를 생성 
   
   
   [상속 구조]
   
   <statement>   -  정적 Sql을 실행 할 때 사용 (보안취약)  정적Sql이란 ?

                            String 형 Sql문을 변수에 담지 않고 직접 설정해놓는것  
           ^
           |    
   <PreparedStatement>  - 동적 sql을 실행할때 사용 ( 시큐어 코딩에 적합한 방식, 캐시사용 ) 

                                    String형 sql문에 변수('?'와 같이 )를 주고 변수에 담아 처리하는것

           ^                           sql 문을 동적으로 입력 받아 사용 가능!  
           |               
           |
   <CallableStatement>  - 각 DBMS에 특화된 SQL로 작성된 명령문을 실행 
                                                오라클 : PL-SQL
   
 

 

 

 

 

==========================================================================

 

  => SQL문을 실행하기 위한 메소드를 갖고 있는 클래스

 

 

 1) Statement 객체를 이용
      => connection 객체가 갖고 있는 createStatement 메소드를 이용해서 생성
      [형식]
      Statement stmt = con.createStatement()
       : stmt 객체는 어떤 DBMS의 드라이버가 로딩되어 있냐에 따라 달라진다

 

[Statement 객체의 작성방법]
     ------------------------------------------------------------    
     |     Statement stmt =null;                                |
     |   stmt = con.createStatement();                     |

     |                                                                       |

     |    String sql = "SQL 구문 작성";                     |
     |    int n = stmt.executequery(sql);                   |

     -------------------------------------------------------------

 

       -  java.sql의 Connection인터페이스의 createStatement메소드를 통해서

            DB에 SQL문을 보내기 위한 연결 객체를 생성! 
        -  createStatement() 메소드는 Statement를 리턴한다!

            즉 Statement가 DB에 SQL문을 보내기 위한 연결 객체! 
       -  Statement는 SQL을 실행하기 위한 객체라는 것!!!

 

 

 2) PreparedStatement객체를 이용
   
   => connection 객체에 정의되어 있는 prepareStatement 메소드를 이용해서 생성 
   =>   PreparedStatement ptmt = con.prepareStatement(sql)
   =>   캐시사용 
    1) 쿼리 문장 분석
    2) 컴파일
    3) 실행 
    4) statement 는 sql을 실행하는 과정에서 매번 반복해서 위의 3가지 내용을 처리하고 있지만

       preparedStatement는 한 번만 작업하고 캐시에서 꺼내서 사용한다.


     1. sql 문을 미리(prepared)전달하며 preparedStatement 객체를 생성
      => sql 문을 미리 파싱하는 방법이므로 Connection 객체의 prepareStatement메소드를 

     이용해서 PreparedStatement 객체를 만들때 sql문을 전달해야 한다.
        PreparedStatement ptmt = con.preparedStatement(sql)
     
     2. sql문을 작성할때도 외부에서 입력 받아 처리할 부분은 ? 로 대체하여 표시한 후 작업
       String sql = "insert into customer values(?, ?, ?, ?, sysdate, 1000, ?)
       => ?는 값의 자리만 처리할 수 있따. 컬럼명에는 ?는 처리할 수 없다.

 

 

3.  물음표(?) 에 대한 값을 셋팅
     ?에 외부에서 전달받은 값을 설정해 주어야 sql문이 완성된다.
     preparedStatement 에 정의된 set000메소드를 이용 
     set000메소드는 타입과 연결해서 알맞은 setter 메소드를 선택해서 작업! 

      (ResultSet의 getter메소드와 타입매칭은 동일)

 

 

 ex) 
     ptmt.setString(1, 'tommy'); = > 첫번째 물음표자리에 'tommy'를 셋팅
                            ---      
              ?가 정의된 순서를 나타냄!  (즉 첫번째 물음표자리를 의미)

 

     ptmt.setInt(2,1000) => 2번째 물음표자리에 1000을 셋팅!! 

 

 

 

 

4. sql문 실행하기
   1) statement를 사용 
     1] excuteUpdate : insert, delete, update 명령문을 실행


      매개변수에 전달된 sql문이 실행, 실행 결과로 몇 개의 row가 반영되었는지 리턴
      int result = stmt.executeUpdate(sql)
      ---------
     몇 개의 행이 삽입, 수정 ,삭제되었는지 리턴
        
     2] executeQuery : select 명령문을 실행 


      실행한 후 조회된 테이블을 리턴, 

       DBMS에서 조회된 테이블을 자바에서 사용하기 위해서 만들어 놓은 객체가 ResultSet이다.
      실제로는 어떤 DBMS가 사용되었는지에 따라서 다른 ResultSet객체(ResultSet의 하위)가 리턴


     

2)PreparedStatement를 사용 
   ⓐexecuteUpdate     ⓑexecuteQuery
     Statement객체의 메소드와 동일하게 동작하지만 

    PreparedStatement객체는 매개변수가 없다!

    PreparedStatement객체 생성시 미리 sql문을 넘겨줬기 때문이다!

 

========================================================================

 

5. 결과 처리
     
     1) insert,delete, update


     - 모두 int를 리턴하므로 동일한 방법으로 처리
     int result = stmt.executeUpdate(sql)


    
     2) select 


     sql-plus 프로그램을 이용해서 select sql문을 실행할때 결과로 보여지는 2차원 표의 데이터를

      자바에서 사용할 수 있도록 만들어 놓은 객체가 ResultSet


     -select문을 실행하면 ResultSet 이라는 집합을 리턴하므로 ResultSet타입의 변수를 선언해서 결과를 참조
      ResultSet rs = stmt.executeQuery(sql문)

     - ResultSet에 있는 테이블의 데이터를 읽기 위해 ResultSet이 제공하는 메소드를 이용해서 작업
      Cursor를 다음 레코드로 이동하면서 레코드 갯수만큼 반복작업을 수행
      ResultSet객체의 next()메소드를 이용하여 다음레코드로 커서를 이동.next()는 커서를 이동했을때 
      레코드가 존재하면 true를 리턴하고 레코드가 없으면 false를 리턴한다.

 

        while (rs.next( ) ) { ---> true/false 를 리턴하므로 반복문 중 while문을 이용하여 작업
                 // 레코드의 각 칼럼을 읽는다.   
                    }

  

        - 한 번에 하나의 칼럼만 읽을 수 있다.
         ResultSet객체의 getXXX메소드를 이용하여 칼럼값을 읽는다. 타입에 따라 다른 메소드를 이용 

 

        오라클 타입이 varchar2 나 char인 경우
       ===> getString(칼럼명) or getString(컬럼의 순서 index)

                                                                   ------------------
                                                원본테이블에 정의된 컬럼의 순서가 아니라
                                                 조회된 테이블에 포함된 컬럼의 순서