[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();
    }
  }

}



블로그 이미지

필로그래머

,

[Java] 자바 이클립스 JDBC 3. try ~ catach~ 를 이용하여 자원 해제시키기


JDBC 프로그래밍 : 자원의 해제


방법 1) finally 블록의 이용



finally를 통한 자원 헤제의 예제


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test03_1 {
  public static void main(String[] args) {
 
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;
   
    try {
      com.mysql.jdbc.Driver mysqlDriver = new com.mysql.jdbc.Driver();
      DriverManager.registerDriver(mysqlDriver);
     
      con = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/데이트베이스명" /* 연결할 DMBS와 데이터베이스 정보 */
        "유저명", /* 사용자 아이디*/
        "1111" /* 사용자 암호 */);
   
      stmt = con.createStatement();
      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();
    } finally {
        // try 블록 안에 한꺼번에 close()를 써주게 되면 앞에 있는 close()에서 오류가 났을 경우,
        // 그 다음에 오는 close()를 실행하지 않고 예외를 던지기 때문에 각각 try 문을 써줘야 한다.
        try {rs.close();} catch (Exception e) {}
        try {stmt.close();} catch (Exception e) {}
        try {con.close();} catch (Exception e) {}
    }
  }

}






방법 2) 클로저 (closure)를 이용한 방법



try (...) 안에 클로저 기법을 이용해 자동 자원 해제를 설정해주는 예제


import java.sql.Connection;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test03_2 {
  public static void main(String[] args) {
    try {
      com.mysql.jdbc.Driver mysqlDriver = new com.mysql.jdbc.Driver();
      DriverManager.registerDriver(mysqlDriver);
     
    } catch (Exception e) {
      e.printStackTrace();
      return;
    }
   
    try ( // 이 괄호 안에 선언하는 변수는 오직 java.lang.AutoCloseable 구현체 만이 가능하다.
      Connection con = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/데이터베이스명",
        "유저명",
        "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();
    }
  }
}





블로그 이미지

필로그래머

,