[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 프로그래밍 : MySQL JDBC Type 4 드라이버 다운로드



1.

JDBC 프로그래밍 : MySQL JDBC Type 4 드라이버 다운로드

 - 절차

1) www.mvnrepository.com에 들어가 mysql을 검색한다.

2) MySQL Connector/J의 Gradle 의존 라이브러리 정보를 복사한다.

3.) 프로젝트 폴더에 있는 build.gradle 파일에서 dependencies {}를 선언해 

    블록 안에 복사한 정보를 붙여 넣는다.

4) 명령창(cmd)을 실행하고 java01 프로젝트 폴더에서 gradle 명령을 실행한다.

> gradle eclipse

5) 이클립스에서 프로젝트 폴더를 "Refresh(F5)" 한다

6) 드라이버 라이브러리 파일(mysql-connector-java-5.1.42.jar)에 있는 클래스를 로딩해본다.



2.
JDBC 프로그래밍: DriverManager 클래스
  - JDBC 드라이버를 관리하는 객체
  - 이 객체에 JDBC 드라이버 객체를 등록해야만 사용할 수 있다.
  - DBMS에 연결할 때도 이 객체가 필요하다.


DriverManager에 MySQL을 등록하는 예제

 * => JDBC 드라이버를 관리하는 객체
 * => 이 객체에 JDBC 드라이버 객체를 등록해야만 사용할 수 있다.
 * => DBMS에 연결할 때도 이 객체가 필요하다.
 */
import java.sql.DriverManager;
import java.sql.SQLException;
public class Test01_2 {
  public static void main(String[] args) throws Exception {
    // 1) MySQl JDBC 드라이버의 정보를 다루는 객체를 생성한다.
    //    => 이 객체를 통해 MySQL DMBS에 연결할 수 있다.
    com.mysql.jdbc.Driver mysqlDriver = new com.mysql.jdbc.Driver();
   
    // 2) MySQL JDBC 드라이버를 "드라이버 관리자"에 등록한다.
    //    => 반드시 java.lang.Driver 규칙에 따라 만든 클래스여아 한다.
    DriverManager.registerDriver(mysqlDriver);
   
    // 3) 드라이버 관리자를 통해 DBMS와 연결한다.
    //    => 직접 MySQL 드라이버를 사용하지 않고,
    //       이렇게 DriverManager 클래스를 통해 우회하여 DBMS와 연결한다.
    //    => 이렇게 우회하는 이유? 특정 DBMS에 종속되지 않기 위함이다.
    //       자바 코드를 작성할 때 특정 DBMS에서만 유효한 코드를 작성하게 되면,
    //       그 DBMS에 종속되게 되고 유지보수가 힘들어진다.
    //    => DriverManager의 getConnection()을 호출하여 DMBS와 연결한다.
    //       리턴 값은 DBMS와의 연결 정보를 갖고 있는,
    //       java.sql.Connection 규격에 따라 만든 객체이다.
   
    java.sql.Connection con = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/데이터베이스명" /* 연결할 DMBS와 데이터베이스 정보 */
        "유저아이디", /* 해당 DB를 사용할 수 있는 아이디*/
        "사용자 암호" /* 사용자 암호 */);
   
    // 4) 연결이 되었다는 걸 표시해보자
    System.out.println("DBMS와 연결되었음!");
  

  }


- 실행 결과 : 

Fri May 26 16:50:04 KST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

DBMS와 연결되었음!




3.

JDBC 프로그래밍: Statement 객체

 - Statement 객체는 Connection 객체로부터 얻는다.

 - SQL문을 DBMS에 전달하는 일을 한다.

   SELECT 문을 실행한 경우, 그 결과를 다루는 객체를 리턴한다.

 


Statement 객체를 만들고 결과값을 받는 ResultSet 객체를 

생성하는 예제를 위 예제에 추가한다.


// 5) SQL을 실행할 Statement 객체 얻기

    //    => java.sql.Statement 규격에 따라 만든 객체를 리턴한다.
    java.sql.Statement stmt = con.createStatement();
   
    // 6) SELECT SQL문을 DBMS에 보낸다.
    //    => Statement 객체가 SELECT 문을 DBMS에 보내는 일을 한다.
    //    => SQL을 문자열 그대로 보내는 것이 아니라,
    //       DBMS가 처리하기 쉬운 형태로 변환(컴파일)하여
    //       그 변환된 SQL을 DBMS에 보낸다.
    //    => 물론 DBMS 마다 그 변환 형식이 다를 것이다.
    //       변환하는 일은 각 DBMS의 JDBC 드라이버 클래스들 중에서
    //       Statement 객체가 할 것이다.
    //    => 주요함수
    //       executeQuery() : select 문을 보낼 때
    //       executeUpdate() : insert, update, delete 등 기타 SQL을 보낼 때
    //    => executeQuery()의 리턴 값
    //       서버가 SELECT을 실행한 후 준비한 결과 값을 가져오는 도구를 리턴한다.
    //    => 그 도구는 java.sql.ResultSet 규격에 따라 만든 객체이다.
    java.sql.ResultSet rs = stmt.executeQuery("select 컬럼명1, 컬럼명2, 컬럼명3, 컬럼명4 from 테이블명 ");
   
    // 7) ResultSet 객체를 통해 서버에 결과를 한 개씩 가져온다
    //    => 한꺼번에 다 가져오는 것이 아니라, 한 개씩 가져온다.
    //    => next() : 서버에서 결과를 한 개 가져온다.
    while (rs.next()) {
      // 서버에서 가져온 한 개의 레코드 값은 ResultSet 객체에 보관되어 있다.
      // 꺼내보자!
      System.out.printf("%d, %s, %s, %s\n",
          rs.getInt("컬럼명1"),
          rs.getString("컬럼명2"),
          rs.getString("컬럼명3"),
          rs.getString("컬럼명4"));
    }
   
    // 8) 지금까지 사용한 JDBC 관련 객체의 자원을 해제한다.
    //     => ResultSet을 더 이상 사용하지 않으면 자원을 해제하라!
    rs.close();
    //     => Statement를 더 이상 사용하지 않으면 자원을 해제하라!
    stmt.close();
    //     => DBMS와 연결을 끊고 싶다면 Connection의 close()을 호출하라!
    con.close();
   
    // => DriverManager는 close() 메서드가 없다.
  }



블로그 이미지

필로그래머

,