2008. 8. 20. 15:17

자바와 MS Access DB연동

우선 JDBC Driver의 종류에 대해 소개한다.

 

 

JDBC Driver종류

 1 JDBC/ODBC Bridge 
 

 

이것은 JDK1.2 부터 포팅되어 있으므로 추가로 설치할 필요는 없다. JDBC 함수호출을 ODBC 함수호출로 전환하기 때문에 만약 예전에 사용하던 환경이 ODBC 를 이용해 구축되어 있다면 굳이 다른 드라이버를 사용하지 않고서도 시스템을 확장해 나갈수가 있다. 하지만 ODBC 계층을 경유하기 때문에 데이타복사시 오버헤드를 야기하고, 클라이언트에는 반드시 ODBC DRIVER 가 설치돼 있어야 한다. 자바 하위버전에서는 추가로 JDBC DRIVER 까지 설치돼 있어야 함은 물론이다. 또한 ODBC 와 DB 간에 소켓을 사용하기 때문에 방화벽을 통과하지 못하기 때문에 익스트라넷 환경에서 사용할 수가 없다. 또한 ODBC 접속부분에서 100% 자바코드를 사용하지 않기 때문에 애플릿으로도 연결할 수가 없다. 굳이 사용하고자 한다면 ODBC 환경설정을 따르는 MS-SQL SERVER 에 적당하다 하겠다.  


  

 2 Native-API,Partly-Java Driver 

 

 

사용환경은 JDBC/ODBC 와 유사하다. 이것은 JDBC 호출을 특정데이타베이스에서 사용하는 API 로 전환한다. 이 드라이버 역시 C/C++ 코드로 네이티브 메소드를 사용하기 때문에 클라이언트에 해당 DB 의 라이브러리가 설치돼 있어야 한다. 자체 DB DLL 를 사용하기 때문에 JDBC/ODBC 보다는 속도 향상이 있다. 하지만 여전히 오버헤드 문제가 제기되고 방화벽을 통과하지 못하기 때문에 익스트라넷 환경에서는 사용할 수가 없다.  

 



 

 3 Net-Protocol, All-Java Driver 

 

 

이것은 3-tier 모델이다. 클라이언트 측에는 드라이버 클래스와 API 가 위치하고, 실제 기능은 JDBC 미들웨어에서 구현한다. 클라이언트는 자바로 구현되기 때문에 애플릿을 통해 구현할 수 있으나 애플릿의 특성상 JDBC 미들웨어가 웹서버와 같은 호스트에 위치하여야 한다. 3-tier 환경이 주는 이점(다중 DB 접속, 질의 캐싱, 로드밸런싱,보안기능)을 이용할 수 있으며 대규머 클라이언트/서버 환경에 적합한 모델이다. 흔히 JDBC 미들웨어와의 표준프로토콜로서 CORBA 의 IIOP 나 HTTP 를 이용한다. 서버는 각 클라이언트의 요구는 DBMS 프로토콜로 바꿔 쿼리를 전달하며 반환된 결과값을 다시 클라이언트에 전달한다. 주로 통합 구성된 단일 드라이버 형태로 제공하며 멀티 DBMS 환경에 적합하다.  

 



 

 4 Native-Protocol, All-Java Driver 

 

 

JDBC 호출을 바로 DBMS 가 사용하는 프로토콜로 전환해 DBMS 와 직접 연결해 준다. DBMS 의 모든 기능을 자바로 직접 구현하였기 때문에 ODBC 나 DB 라이브러리가 별도로 필요가 없으며 모든 드라이버가 자바로 구현됐기 때문에 애플릿으로도 다운로드돼 실행될 수가 있다. 가령,
<appelet code=***.class archive=***.jar(드라이버클래스 압축파일) >
크기가 작고 다른 타입에 비해서 속도가 가장 빠르다는 장점이 있다. 현재 가장 많이 사용되고 있다. 하지만 벤더고유의 프로토콜을 알아야지만 사용할 수 있는 단점이 있다. 빠른 액세스를 요하는 2-tier 환경에 적합하고, 대규모의 클라이언트/서버 환경에는 적합하지 못하다. 

 


다음 예제는 JDBC/ODBC Bridge Driver를 이용한 JAVA Source이다.

우선 MS Access DB로 만든 테이블을 를 제어판에서 등록한다.

 



이렇게 DB가 등록이 완료되면 코딩시작...

import java.sql.*;
import java.util.*;
import javax.swing.*;


public class AccessTest
{
 public ResultSet resultSet; //질의문의 결과를 처리하는 클래스
 public ResultSetMetaData metaData; //메타데이터
 public int numberOfRows; //테이블의 행
   
 public Connection db=null;
 public Statement stmt=null;
 String queryState="";
 String sql = "SELECT * FROM Table1"; //테이블 명
 static final String JDBC_ODBC_DRIVER="sun.jdbc.odbc.JdbcOdbcDriver";
 static final String url="jdbc:odbc:dsn_db1";  //dsn_db1은 DB이름  
 
 public AccessTest()
 {
  try
  {
   /*JDBC - ODBC Bridge Driver Setting*/
   Class.forName(JDBC_ODBC_DRIVER);
   db=DriverManager.getConnection(url,"","");
   
   //SQL문 작성을 위한 Statement를 준비
   stmt=db.createStatement();
   resultSet = stmt.executeQuery(sql); //query를 실행
   
   //Query 실행값을 저장할 버퍼*/
   StringBuffer results = new StringBuffer();
   ResultSetMetaData metaData = resultSet.getMetaData(); //MetaData를 얻는다.
   int numberOfColumns = metaData.getColumnCount(); //테이블의 컬럼개수를 가져온다.
   
   while(resultSet.next())
   {
    for(int i=1;i<=numberOfColumns;i++)
         results.append(resultSet.getObject(i)+"\t");
      results.append("\n");
   }
   System.out.println(results);
  } //try의 끝
 
  catch(SQLException sqlException){
       JOptionPane.showMessageDialog( null,sqlException.getMessage(), "DataBase ERROR",
             JOptionPane.ERROR_MESSAGE );
       System.exit(1);//비정상적으로 종료시킨다.
  }
 
  catch(ClassNotFoundException classNotFound){
   JOptionPane.showMessageDialog(null,classNotFound.getMessage(),
         "Driver Not Found",JOptionPane.ERROR_MESSAGE);
   System.exit(1);     
  }
 
  finally{
   /*연결된 데이타베이스를 닫는다.*/
   try{
    stmt.close();
    db.close();
   }
   catch(SQLException sqlException){
    JOptionPane.showMessageDialog(null,
        sqlException.getMessage(), "DataBase Error",
        JOptionPane.ERROR_MESSAGE);
    System.exit(1);
   }
  }
 }
 /*main Function*/
 public static void main(String[] args)
 {
  AccessTest test = new AccessTest();
 }
 
}
-실행결과-


1       backkmir
2       lathe
3       mir

Press any key to continue...