[Java Database Connectivity]
DBMS에 종속적인 개발이 아닌 java.sql.*에서 지원하는 Interface를 통해 .java와 data를 주고 받고, DBMS 제조사에서 제공해주는 OracleDriver(다운 받은Driver 경로.oracle.jdbc.driver.oracledriver)들을 통해 DBMS와 java.sql API의 Interface와 연결해준다
Third Part Library 인 JDBC
java 이외의 프로그램을 사용하기 위한 API, 사용하기 위해서는 해당 프로그램에서 제공하는 .jar파일을 class path에 학습 시킴으로서 불러올 수 있게 해준다.
우리가 사용하는 DBMS는 Oracle에서 제공하는 10g Version을 이용한다.
1. JDBC DRIVER 로딩
Class.forName("oracle.jdbc.driver.OracleDriver");
2. Connection
사용자가 login(id/pw), DBMS가 설치되어 있는 pc의 ip등을 입력 하는 것을 추상화 캡슐 화 한 Interface이다.
import java.sql.Connection;
OracleDriver od = new OracleDriver();
Properties info = new Properties();
info.put("user",user);
info.put("passoword",pwd);
Connection con = od.connect(url, info)
======================개선========================
Connection con = DriverManager.getConnection(url,user,pwd);
url
String url "jdbc: // jdbc
oracle: // DBMS Name
thin: // 하단 설명
@127.0.0.1: // 자신의 pc ip를 가르키는 고정 주소 local host
1521: // 오라클 기본포트번호인 1521
xe // dbms설정 이름
THIN => 순수하게 자바 패키지(클래스들)만으로 바로 DB와 연결,
범용성이 높다, 상대적으로 OCI보다 속도가 느리다.
OCI => Oracle Call Interface
.DLL과 .SO 파일과 같이 특정 OS 내에서만 돌아가는 Native Module을 통해 DB에 연결한다.
Registered ports(1024번부터 49151번포트)
ICANN산하기관인 IANA에 등록된 포트번호들이다.
등록은 되어있지만 Well-known ports들 처럼 직접 통제당하진 않은 포트번호들이다.
가장 유명한 포트번호로는 Mysql 기본포트번호인 3306 오라클 기본포트번호인 1521등이 있다.
웹프레임워크인 Django는 8000, Flask는 5000을 개발자서버 기본포트로 지정해두고있다.
3-1. Statement
Statement stmt = con.createStatement(); // Statement를 return해 준다.
stmt.executeQuery("SELECT ~ FROM ~") // ResultSet을 return해 준다.
위의 Statement Interface를 사용할 경우 DBMS에서 parsing, compile, run과정을
QUERY를 날릴 때 마다 계속해서 반복하여 비 효율적이다.
3-2 Prepared Statement
⇒ Statement Interface를 확장한 Interface로 유용한 기능이 추가된 Interface이다.
PreparedStatement pstmt = con.preparedStatement("SELECT ~ FROM ~(?) ~(?)~");
pstmt.setXXX(index,value);
pstmt.setXXX(index,value);
//Information Hiding 되어 있기 때문에 setter를 통해 값을 입력한다.
.
.
.
//==> parsing과 compile과정을 미리 준비해 주어 값만 받는 대로 run을 하여 효율적이다.
동일한 QUERY를 날릴 때는 Prepared Statement가 효율적이나,
다른 QUERY를 날릴 때는 두 가지 모두 비슷하다.
유지 보수가 좋고, 개발자의 실수를 줄여주며, 우리에게 익숙한 setter, getter를 사용하기에 Prepared Statement 를 주로 사용한다.
4. Result Set
ResultSet rs = stmt.executeQuery("SELECT ~ FROM ~")
// executeQuery()은 ResultSet을 return해 준다.
ResultSet rs = pstmt.executeQuery();
// run 단계, executeQuery()은 ResultSet을 return해 준다.
while(rs.next())
// ResultSet의 next() method는 boolean을 return해 주며,
// 커서를 현재 위치에서 한 행 앞으로 이동시킨다. 다음 행이 없을 경우 false를 return
SOP(rs.getXXX(index) + rs.getXXX(index) + ....);
// ResultSet의 결과 값이 Information Hiding 되어 있기 때문에 getter를 통해
// 값을 받아온다.