10/21 26-5 JDBC (Oeacle과 연결)
다시 돌아 온 이클립스 두둥...!!
우선 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 프로그래밍 절차] -- 나는 이클립스에서 오라클 자료 불러올거얌!
큰 줄기를 먼저 이해하자!
- 드라이버 로딩
Class의 forName()메서드를 이용 한다. JDBC 드라이버를 메모리에 로딩후 DriverManager에 등록 함 Class.forName("oracle.jdbc.OracleDriver"); => 실행하면 오라클 드라이버가 메모리에 로딩 - 데이타 베이스 연결 : 콘솔창에서 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","아이디","패스워드"); - 쿼리문 전송을 위한 준비 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 프로시저명(?,?....)}");
※파라미터 : 쿼리문 중에 변경되는 부분 즉 값 부분을 ?로 처리하고 미리 쿼리문을 준비하자는 의미. - 쿼리문 전송 : 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;
혹은 쿼리가 프로시저나 함수인 경우 사용 - 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(인덱스): 해당 인덱스 로 커서 이동, 양수-전진 ,음수-후진 - 개체 자원 반납 => 끝냄! 오예!
close()메서드로 Connection 개체, Statement,PreparedStatement,CallableStatement 및 ResultSet
개체등의 자원 반납.