780 likes | 1.12k Views
01. JDBC 시작. JDBC 란. 자바응용 프로그램에서 데이터베이스에 접근 할 수 있는 API 이다 . 자바 응용 프로그램은 JDBC 를 이용하여 DBMS 에 요청을 할 수 있다 . JDBC 는 응용 프로그램의 요청 (SQL 문 ) 을 DBMS 에 전달 해 주는 역할을 한다 . DBMS 의 요청 결과를 응용 프로그램에 전달 해주는 역할도 한다. JDBC. 2 - tier. JDBC. N - tier. JDBC API.
E N D
01 JDBC 시작
JDBC란 자바응용 프로그램에서 데이터베이스에 접근 할 수 있는 API이다. 자바 응용 프로그램은 JDBC를 이용하여 DBMS에 요청을 할 수 있다. JDBC는 응용 프로그램의 요청(SQL문)을 DBMS에 전달 해 주는 역할을 한다. DBMS의 요청 결과를 응용 프로그램에 전달 해주는 역할도 한다.
JDBC 2 - tier
JDBC N - tier
JDBC API JDBC API는 산업계의 다양한 관계형 Database에 접근하는 표준 API 셋을 제공한다. JDBC API는 java.sql 패키지에 제공된다. java.sql 패키지에 있는 클래스, 인터페이스, 추상 클래스들의 사용법을 알면 Database 응용 프로그램을 작성 할 수 있다. 개발자 들은 java.sql 패키지의 API클래스 사용법만을 알면 이를 지원하는 어떤 Database와도 일관된 프로그램이 가능하다. Database 벤더 들은 개발 플랫폼에 필요한 여러 가지 클라이언트 API모듈을 별도로 개발할 필요가 없이 JDBC API 클래스만 구현하면 된다. DBMS에 비종속적인 응용 프로그램개발 가능
JDBC Driver JDBC API를 구현한 클래스를 JDBC Driver라고 한다. Java 표준 API에 포함된 JDBC API 클래스들은 Java응용 프로그램과 Database 간에 통신을 할 수 있는 표준 방법 또는 표준 API만 제공한다. 그래서 특정 Database와 통신하기 위해서는 해당 Database의 클라이언트 통신 모듈이 필요하게 된다. 모듈은 JDBC API를 구현한 클래스로 제공되는데 이 모듈이 JDBC Driver이다.
JDBC Driver Type Type 1 : JDBC-ODBC Bridge Type 2 : Native Driver Type 3 : Proxy Driver ( 네트웍 연결 드라이버 ) Type 4 : Pure Driver ( DBMS 프로토콜을 사용하는 드라이버 )
JDBC Driver - Type 1 : JDBC-ODBC Bridge JDBC API를 통한 호출을 ODBC 호출로 변경해서 실제로는 ODBC라이브러리를 이용한 통신을 한다. 성능은 좋지 않지만 JDBC드라이버는 지원하지 않고 ODBC드라이버만 지원하는 마이크로 소프트의 액세스 데이터베이스를 연동할 때 사용 ODBC Bridge JDBC 드라이버는 Java 2플랫폼에서는 표준 API들의 패키지인 rt.jar 파일에 있기 때문에 ODBC드라이버만 있으면 된다. (sun.jdbc.odbc.JdbcOdbcDriver )
JDBC Driver - Type 2 : Native Driver 해당 DBMS의 라이브러리 API를 JDBC API로 Wrapping한 형태의 드라이버다. Oracle의 OCI 드라이버는 OCI 라이브러리를 Java로 Wrapping한 것이다. 클라이언트 환경에는 해당 업체의 DBMS 라이브러리가 JDBC 드라이버와 더불어 같이 존재해야 한다. 해당 데이터베이스 고유의 프로토콜을 그대로 사용함으로 DBMS 관련 통신을 더 유연하게 할 수 있다. Java 어플리케이션이 100% Java 환경이 아니고 native 라이브러리가 필요하다는 문제가 있다.
JDBC Driver - Type 3 : Proxy Driver middleware 업체에서 다양한 DBMS를 지원하기 위해 사용한다. 클라이언트는 100% 순수 자바 JDBC 드라이버를 제공한다. JDBC 드라이버가 직접 DBMS와 통신하는 것이 아니고 중간에 middleware 역할을 하는 Proxy 드라이버와 통신한다. Proxy 드라이버는 실제 DBMS통신을 위해 1타입과 2타입의 JDBC Driver를 사용한다. Proxy 드라이버 서버측에서는 load balancing과 같은 middleware가 지원하는 부가적인 서비스가 제공되는 것이 일반적이다. 거의 구입 후 사용 가능
JDBC Driver - Type 4 : Pure Driver 가장 많이 사용된다. 특정 DBMS의 native 라이브러리를 JDBC API로 다시 구현하여 100% 자바로 작성된 드라이버다. 100% 자바 클래스로 제공되기 때문에 이식성이나 배포가 좋다.
JDBC Driver 설치 - Oracle Thin Driver • JDK는 설치 되어 있겠지요?^^. • Oracle DBMS도 물론 설치 되어 있겠지요?^^. • Oracle JDBC Driver를 설치 한다. • 구한다. ( 파일 이름 : classes12.zip ) • http://industry.java.sun.com/products/jdbc/drivers • http://technet.oracle.com • CLASSPATH로 정의된 폴더 또는 ${JAVA_HOME}\jre\lib\ext 폴더에 복사한다.
JDBC 응용프로그램 실행 전에 확인 • Oracle DBMS의 서비스를 시작 했는가? • listener 서비스를 시작 했는가? • WIN98 • DOS 창에서 lsnrctl.exe 실행 • start 명령으로 listener 서비스 시작 • 기타 명령어 : stop , exit • 서비스를 start후 DOS창을 강제 종료 하지 마시오. • NT / WIN2000 Server • 서비스 관리자에서 서비스 시작
맛 보 기 import java.sql.*; import java.io.*; class Ex001Employee { public static void main (String args []) throws SQLException, ClassNotFoundException { // JDBC driver를 LOAD Class.forName ("oracle.jdbc.driver.OracleDriver"); // database에 연결 Connection conn = DriverManager.getConnection ("jdbc:oracle:thin:@127.0.0.1:1521:f1blue“ ,"scott", "tiger");
맛 보 기 // Statement 객체 생성 Statement stmt = conn.createStatement (); // Select 문 작성 및 전달 ResultSet rset = stmt.executeQuery ("select * from emp"); // select 결과 출력 while(rset.next()) { System.out.println(rset.getString(1) + "\t" + rset.getString(2) + "\t" + rset.getString(3)); } } }
java.sql 패키지의 인터페이스 • DriverManager • JDBC API에서 제공되는 Concrete 클래스로 Driver 인터페이스를 구현한 객체들을 관리하는 클래스다. • 각 드라이버 객체들을 등록 , 삭제할 수 있다. • JDBC URL을 이용해 메모리로 로드된 Driver 객체를 찾아서 Connection을 연결하는 서비스를 한다. • 로드된 Driver객체들은 내부에 Vector로 관리한다. • Driver • DBMS와 연결을 맺기 위한 인터페이스 • Connection • DBMS와 세션을 유지하는 객체로 트랜잭션을 관리한다.
java.sql 패키지의 인터페이스 • Statement • SQL을 처리할 수 있는 객체로 대부분의 SQL처리는 이 인터페이스를 이용한다. • PreparedStatement • SQL문을 Precompile하여 처리하는 것으로 동일한 형태의 질의를 여러 번 반복할 경우 Statement보다 유리하다. • CallablStatement • Stored Procedure를 처리하는 인터페이스이다.
java.sql 패키지의 인터페이스 • ResultSet • Statement를 이용한 SQL질의 결과를 나타내는 인터페이스로 일반적으로 Cursor를 의미한다. • JDBC 2.0에서는 커서 스크롤링 기능(first(), next(), previes(), last()등) 및 Update 커서 기능이 추가되고, Fetch 사이즈 결정 및 ResultSet의 크기등의 정보를 제공한다. • ResultSetMetaData • ResultSet의 컬럼 정보를 제공 • DatabaseMetaData • Database 전체에 대한 정보를 제공
DriverManager에 해당 DBMS driver 등록 Connection Statement ResultSet SQL DATA Driver DBMS JDBC API를 이용한 프로그램
1. DriverManager에 해당 DBMS driver 등록 • Class.forName(String className) • Class.forName( “oracle.jdbc.driver.OracleDriver” ); • 해당 드라이버 클래스를 동적으로 로딩한다. • 참고 • 모든 Driver 클래스는 static initialize에서 자신의 객체를 생성한다. • 생성자에서 DriverManager.Register Driver()를 이용해 생성된 자신을 등록한다. • 그러므로 Class만 로딩하면 객체가 생성되고 생성된 자신을 DriverManager에 등록하게 된다.
1. DriverManager에 해당 DBMS driver 등록 • Driver 클래스 객체 생성 • new oracle.jdbc.driver.OracleDriver(); • Driver 클래스 자체의 객체만 만들어 주어도 DriverManager에 자동적으로 등록된다.
2. 해당 Driver로부터 Connection 객체 획득 Connection 이라는 것은 DBMS에 연결된 session을 의미한다. DriverManager의 getConnection() method를 사용한다. String jdbcUrl = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL"; String user = "scott"; String password = "tiger"; Connection conn = DriverManager.getConnection ( jdbcUrl, user, password );
3. Connection 객체로부터 Statement 객체 획득 • SQL을 Database로 보내려면 다시 Statement 객체를 Connection 객체로부터 생성하여 Statement 객체에서 제공되는 method를 사용하여야 한다. • Statement 객체 생성 • Statement createStatement() • PreparedStatement prepareStatement(String sql) • CallableStatement prepareCall(String sql) Statement stmt = conn.createStatement();
4. Statement Method를 이용하여 SQL실행 SQL을 database에 보내기 위하여 Statement 객체의 다음과 같은 method를 사용한다. public ResultSet executeQuery(String sql) : SQL SELECT문 실행 시 사용 public int executeUpdate(String sql) : UPDATE/DELETE/INSERT 문 실행 시 사용 public boolean execute(String sql) : CREATE등의 DDL(Data Definition Language) 사용
4. Statement Method를 이용하여 SQL실행 StringBuffer sql = new StringBuffer(10); sql.append(" SELECT EMPNO, ENAME , JOB "); sql.append(" FROM EMP "); ResultSet rs = stmt.executeQuery(sql.toString()); 하나의 Statement 객체는 오직 하나의 ResultSet을 처리할 수 있다. 만일 하나의 ResultSet을 처리하는 중에 또다른 ResultSet이 필요하면 새로운 Statement을 만들어 사용해야 한다. 만일 같은 Statement에서 또다시 새로운 SQL을 실행시켜 ResultSet을 받아오면 이전에 있던 ResultSet은 자동으로 close된다.
4. Statement Method를 이용하여 SQL실행 • 실습 • Table001Tel.sql 파일에 있는 TABLE을 생성하고 아래 파일을 실습한다. • Ex003TelInsert.java • Ex004TelUpdate.java • Ex005TelDelete.java
5. 결과를 ResultSet 객체로 받아 이용 ResultSet 객체는 SQL의 select문을 executeQuery()로 처리한 후에 결과 data를 받아오는 객체이다. ResultSet의 getXXX() 함수를 이용하면 Fetch해온 ResultSet의 row데이터로부터 각각의 컬럼 데이터를 가져올 수 있다. next() method를 실행시키면 다음 row로 Cursor point가 이동하며 다음 row가 없을 경우 next()는 false를 return한다. 처음 ResultSet을 가져왔을 때 Cursor의 위치는 첫번째 row 위에 위치하므로, 첫번째 row도 next() 를 사용해야 접근이 가능하다. ResultSet 처리가 JDBC2.0부터 previous()/ last()/ first()등이 추가적으로 제공되어 커서의 양방향 이동이 가능하다.
5. 결과를 ResultSet 객체로 받아 이용 getXXX() method는 SQL SELECT문 상의 column 이름을 주거나 또는 column의 index(순서)를 주도록 overloading되어 있다. index를 줄 때에는 반드시 1부터 시작해야 한다. 이 때 index는 실제 DB Table의 것이 아닌 ResultSet의 index이다. 즉, SQL SELECT문에서 컬럼을 기술한 순서가 index가 되는 것이다. getXXX() Method는 DB Column data type과 일치하는 것을 사용해야 한다. 만일 일치하지 않는 것을 사용할 경우는 data type이 자동으로 변환되거나 변환이 불가능 하면 Exception이 발생한다.
5. 결과를 ResultSet 객체로 받아 이용 while(rset.next()) { System.out.println(rset.getString(1) + "\t" + rset.getString(2) + "\t" + rset.getString(3)); } while(rset.next()) { System.out.println(rset.getString("empno") + "\t" + rset.getString("ename") + "\t" + rset.getString("job")); }
5. 결과를 ResultSet 객체로 받아 이용 TABLE ResultSet select * from emp where ... rs.getString("empno")
EMPNO ENAME JOB rs.next() 7369 SMITH CLERK rs.next() 7499 ALLEN SALESMAN rs.next() 7521 WARD SALESMAN rs.next() FALSE 5. 결과를 ResultSet 객체로 받아 이용 while(rs.next()) { String empno = rs.getString("empno"); String ename = rs.getString("ename"); String job = rs.getString("job"); }
5. 결과를 ResultSet 객체로 받아 이용 • 실습 • 아래 파일을 실습한다. • Ex006TelSelect.java
ResultSet의 getXXX() 메소드와 리턴 타입 java.sql.Array getArray() : ResultSet 객체의 현재 row에서 SQL ARRAY 값을 가져온다.(JDBC 2.0) java.io.InputStream getAsciiStream() : 현재 row에서 ASCII 문자열의 stream인 colum 값을 가져온다. java.math.BigDecimal getBigDecimal() : 현재 row에서 높은 정밀도를 가진 java.math.BigDecimal 객체인 colum 값을 가져온다. (JDBC 2.0) java.io.InputStream getBinaryStream() : 현재 row에서 interpreted 되지 않은 byte들의 stream인 column 값을 가져온다.
ResultSet의 getXXX() 메소드와 리턴 타입 java.sql.Blob getBlob() : ResultSet객체의 현재 row에서 BLOB 값을 가져온다.(JDBC 2.0) boolean getBoolean() : 현재 row에서 Java boolean인 colum값을 가져온다. byte getByte() : 현재 row에서 Java byte인 colum값을 가져온다. byte[] getBytes() : 현재 row에서 Java byte 배열인 colum값을 가져온다. java.io.Reader getCharacterStream() (JDBC 2.0)
ResultSet의 getXXX() 메소드와 리턴 타입 java.sql.Clob getClob() : ResultSet 객체의 row에서 CLOB 값을 가져온다. (JDBC 2.0) int getConcurrency() : Result Set의 병렬성 모드를 리턴한다. (JDBC 2.0) java.lang.String GetCursorName() : ResultSet에 의해 사용된 SQL cursor의 이름을 가져온다. java.sql.Date getDate() : 현재 row에서 java.sql.Date인 colum값을 가져온다. java.sql.Date getDate(int ,Calendar) : 현재 row에서 java.sql.Date인 colum값을 가져온다.(JDBC 2.0)
ResultSet의 getXXX() 메소드와 리턴 타입 double getDouble() : 현재 row에서 Java double인 colum값을 가져 온다. int getFetchDirection() : Result Set을 위한 fetch direction을 리턴한다.(JDBC 2.0) int getFetchSize() : Result Set을 위한 fetch size를 리턴 한다.(JDBC 2.0) float getFloat() : 현재 row에서 Java float인 colum값을 가져온다. int getInt() : 현재 row에서 Java int인 column값을 가져 온다. long getLong() : 현재 row에서 Java long인 column 값을 가져 온다.
ResultSet의 getXXX() 메소드와 리턴 타입 java.sql.ResultSetMetaData getMetaData() : ResultSet's columns의 수,타입,속성을 얻는다. Object getObject() : 현재 row에서 Java Object인 column 값을 가져 온다. Object getObject ( ... , Map) : 현재 row에서 Java Object인 column 값을 가져 온다. java.sql.Ref getRef() : 현재 row에서 REF(<structured-type>)를 가져온다. (JDBC 2.0) int getRow()(JDBC 2.0)
ResultSet의 getXXX() 메소드와 리턴 타입 short getShort() : 현재 row에서 Java short인 column 값을 가져온다. java.sql.Statement getStatement() : ResultSet객체를 생성한 Statement를 리턴한다. (JDBC 2.0) java.lang.String getString() : 현재 row에서 Java String인 column 값을 가져 온다. java.sql.Time getTime() : 현재 row에서 java.sql.Time 객체인 column 값을 가져온다. java.sql.Timestamp getTimestamp() : 현재 row에서 java.sql.Timeestamp 객체인 column 값을 가져온다.
ResultSet의 getXXX() 메소드와 리턴 타입 int getType() : Result Set의 타입을 리턴한다.(JDBC 2.0) java.io.SQLWarning getWarnings() : ResultSet의 call에 의해 보고된 첫번째 경고를 리턴 한다.
전화 번호 관리 프로그램 • 실습 • 전화 번호 관리 프로그램을 작성한다. • 화면 구성은 다음 페이지와 같이 구성 한다. • 아래 파일은 프로그램 순서대로 기능이 확장 된다. • Ex007TelAWT01.java • Ex007TelAWT02.java • Ex007TelAWT03.java
전화 번호 관리 프로그램 • Ex007TelAWT03 Class • Ex007TelAWT03() : AWT 화면 생성 • actionPerformed(ActionEvent e) : 버튼 이벤트 처리 • init() : DB연결 객체 생성 및 전체 목록 출력 Method 호출 • setTextVisible(boolean tId , boolean tName , boolean tTel ) : 입력 TextField의 입력 가능 여부를 setEditable() Method로 지정 • setTextContent() : 입력 TextField의 내용을 지움