학원/JDBC

10/21 26-5 JDBC (Oeacle과 연결)

도원결의 2022. 10. 23. 16:22

다시 돌아 온 이클립스 두둥...!!

우선 JDBC에 대해서...

Java언어로 데이타베이스에 연결해서 입력,수정,삭제 및 조회등의 작업을 할 수 있도록 해주는 기술이다

JDBC는 프로그램과 각각의 데이터베이스(Oracle,MS-SQL,DB2,MySQL등)  중간에서 각 데이타베이스의 벤더(회사)에서 제공하는 API들을 사용할 수 있도록 변환해주는 기능을 수행한다.
JDBC가 각 벤더에 맞는 API를 사용할 수 있도록 프로그래머는 각 벤더에서 제공해주는 드라이버를 다운받아 JAVA개발환경에 설정 해줘야 한다.
쉬운 예를 들면 회사가 처음엔 oracle쓰다가 나중에 재정사정이 안좋아져서 ms-sql이나 mysql로 데이터베이스를 바꿔야  할 때, 그 동안 oracle에서 작업했던 수많은 프로그램을 다시 바뀐 데이터베이스에 맞게 다 변환하려면 ..... 걍 퇴사하고 싶어지겠지..  아무튼 JDBC는 그렇게 각각 다른 데이터베이스들에 맞게 프로그램을 사용할 수 있게 변환 해주는 변환기 같은 거라고 생각 하면 된다! 오 그래 쓰면서 생각났네!! 220V짜리 제품을 110V에 꽂아서 사용할 수 있게 하는 변환기라고 생각 하자!! 

 

[환경설정하기]

1. 드라이버 다운로드 

  1] Oracle데이타베이스가 설치된 경우 : 11g인 경우 App폴더 로 가서 Administrator ->Product->버전->DbHome_1폴더->JDBC폴더->lib폴더  안에 드라이버(.jar)가 존재함

   11g인 경우:ojdbc5.jar(jdk 5버전),ojdbc6.jar(jdk 6.0버전)
  *상기에서 본인이  사용하고 있는 jdk버전에 맞는 .jar파일을 복사해서 환경설정을 하자.

2. 환경설정

 - classpath로 설정하는 경우 : 내 컴퓨터 ->마우스 우클릭 ->속성->고급->환경변수에서 classpath에 드라이버가 있는 폴더 추가 
- 혹은 드라이버를 복사 후 JDK가 설치된 폴더로 가서 jdk버전\jre\lib\ext폴더 안에 붙여 넣는다.

 

 

[JDBC 프로그래밍 절차]  -- 나는 이클립스에서 오라클 자료 불러올거얌!

    큰 줄기를 먼저 이해하자!

  1. 드라이버 로딩     
               Class의 forName()메서드를 이용 한다. JDBC 드라이버를 메모리에 로딩후 DriverManager에 등록 함                           Class.forName("oracle.jdbc.OracleDriver");   => 실행하면 오라클 드라이버가 메모리에 로딩

  2. 데이타 베이스 연결  :  콘솔창에서 sqlplust scott/scott 같은거  자바에선 new 같은거         
               DriverManager클래스의 getConnection()메서드로 연결 시도
               getConnection("드라이버종류:@서버가위치한 주소:사용포트:전역데이타베이스명","아이디","비밀번호");
                    ****오라클 주소 :127.0.0.1 (아니면 localhost) 걍 외우셈
               -오라클인 경우
               Connection con = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe","아이디","패스워드");

  3. 쿼리문 전송을 위한  준비         Connection 개체의 메서드 이용해서 Statement 계열 개체 얻기
             Statement > PreparedStatement > CallableStatement(상속 계층도) 
                 Statement , PreparedStatement 이거 둘은 일반적인 문을 쓸 때 사용하고(PreparedStatement주로 사용한대 )
                 CallableStatement 이건 함수,프로시져 실행 할 때 주로 사용한다

           -쿼리문이 일반 Text형태의 SQL문 인경우     
                       3-1. 파라미터 이용 하지 않을때
                                Statement st =con.createStarement();
                       3-2. 파라미터 이용시
                                 PreparedStatement st = con.prepareStatement("SELECT * FROM emp WHERE empno=?");
                                 *SQL문에는 ? 를 이용 파라미터에 값을 전달 한다
           -쿼리문이 스토어드 프로시저 인 경우
                       CallableStatement  st = con.prepareCall("{call 프로시저명(?,?....)}");
                       ※파라미터 : 쿼리문 중에 변경되는 부분 즉 값 부분을  ?로 처리하고 미리 쿼리문을 준비하자는 의미.

  4. 쿼리문 전송   : select * from emp ; 같은거!               - Statement/ PreparedStatement /CallableStatement 
                   개체를 통해 연결 된 데이터 베이스에 일반 쿼리문 혹은 스토어드 프로시저 전송
                    Statement 인터페이스는 execute계열 메서드에 직접 쿼리문을 인자로 넣어준다
                   단,PreparedStatement /CallableStatement 인터페이스는 Connection 개체의 prepare계열 메서드로 개체                      를 얻어 올때 미리(Prepare) 쿼리문을 넣어 준다   
                   
                   ***쿼리 전송시 메서드의 종류***
                    ResultSet rs= st.executeQuery(): 쿼리가 SELECT문인 경우
                    int affectedcount = st.executeUpdate():쿼리가 UPDATE/INSERT/DELETE 인 경우
                    boolean bool = st.execute(): 쿼리가 SELECT인 경우 true,  UPDATE/INSERT/DELETE인 경우 false;
                                                                   혹은 쿼리가 프로시저나 함수인 경우 사용

  5. ResultSet에서 값 꺼내 오기
                       while( rs.next() ){
                            rs.getXXX(컬럼인덱스) 혹은
                            rs.getXXX(컬럼명) 등의 메소드를 통해 데이터를 꺼내온다.
                            *인덱스로 가져오는것이 성능면에서 유리(속도가 더 빠름)
                                      }
                       [ResultSet 개체의 주요 메서드]
                             -next():다음행으로 커서를 옮김
                             -previous():이전 행으로 커서를 옮김
                             -first():첫번째 행으로 커서를 옮김
                             -last()마지막 행으로 커서를 옮김
                             -afterLast():커서를 마지막 행 바로 다음으로 옮김(EOF:END OF FILE)
                             -beforeFirst():커서를 첫번째 행 바로 앞으로 옮김(BOF:BEGIN OF FILE)
                             -getRow():현재 커서가 위한 행의 인덱스를 돌려 준다.인덱스는 첫번째 행 바로 앞이 0
                             -absolute(인덱스): 해당 인덱스 로 커서 이동, 양수-전진 ,음수-후진  

  6. 개체 자원 반납   => 끝냄! 오예!
                     close()메서드로 Connection 개체, Statement,PreparedStatement,CallableStatement 및 ResultSet 
                       개체등의 자원 반납.