[Java] 자바 이클립스 JDBC 4. 특정 DBMS에 종속되는 것을 막기


JDBC 프로그래밍 : 특정 DBMS에 종속되는 것을 막기

 - 기존 코드에서는 java.sql.Driver 구현체(이 규칙에 따라 만든 클래스)의

   인스턴스를 만들기 위해 직접 클래스 명을 언급하였다.

   예) com.mysql.jdbc.Driver. driver = new com.mysql.jdbc.Driver();

 - 이렇게 하면 코드가 특정 DBMS에 종속되는 문제가 발생한다.

   즉 다른 DBMS

 - 해결 방법?

    - java.sql.Driver 구현체의 이름을 변수로 받아서 처리한다.


 - 명령창에서 실행하는 법

   > java -cp bin:xxx.jar -Djdbc.driver=com.mysql.jdbc.Driver step20.Test04_1

 - 이클립스에서 실행하는 법

   1) 일단 그냥 실행한다. 그러면 실행 정보가 이클립스에 기록된다.

    Run > Run Configurations... > "Java Application / Test04_1" 선택 >arguments > -Djdbc.driver=com.mysql.jdbc.Driver step20.Test04_1




System.getProperty("...")로 드라이버를 등록하고, 

Class.forName(...)에 드라이버 이름을 주는 예제 ->


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test04_2 {
  public static void main(String[] args) {
    try {
      // JVM 아규먼트로 java.sql.Driver 구현체의 이름을 받는다.
      String driverClassName = System.getProperty("jdbc.driver");

  // 아규먼트로 넘겨준 문자열로 지정된 클래스를 찾아 로딩한다.
  // => Class.forName("com.mysql.jdbc.Driver")라면,
  //    com.mysql.jdbc.Driver 클래스를 찾아서 로딩한다.
      // => 객체를 만들어서 DriverManager에 등록하지 않아도 자동으로 인식한다.
Class.forName(driverClassName);
./* 참고! 
  * 클래스가 로딩되는 경우, (조건: 클래스가 로딩되어 있지 않을 때)
 1) 인스턴스를 만들 때 - new 연산자
 2) 스태틱 멤버(변수나 메서드)를 사용할 때 - Student.a;
 3) Class.forName()을 호출할 때.
*/
    } catch (Exception e) {
      e.printStackTrace();
      return;
    }
   
    try ( // 이 괄호 안에 선언하는 변수는 오직 java.lang.AutoCloseable 구현체 만이 가능하다.
      Connection con = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/webappdb",
        "webapp",
        "1111");
   
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery("select mno, name, tel, email from memb");
    ) {
      while (rs.next()) {
        System.out.printf("%d, %s, %s, %s\n",
            rs.getInt("mno"),
            rs.getString("name"),
            rs.getString("tel"),
            rs.getString("email"));
      }
     
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

}



블로그 이미지

필로그래머

,