jdbc에서 class.forname의 역할

3498 단어 jdbc
JDBC를 사용할 때 다음과 같은 문구를 자연스럽게 사용합니다.

Class.forName("com.mysql.jdbc.Driver");  
String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";  
String user = "";  
String psw = "";  
Connection con = DriverManager.getConnection(url,user,psw); 
왜 자연스럽다고 할까요. 인터넷이든 책 강좌든 예가 그렇고 프로그램도 정상적으로 작동하기 때문에 모두들 안심하고 조롱박을 찾아 내려갔습니다.이거 꼭 있어야 돼요?아니야, 우리는 이 한마디로 그것을 대체할 수 있어.

com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();  
//or:  
//new com.mysql.jdbc.Driver(); 
String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";  
String user = "";  
String psw = "";  
Connection con = DriverManager.getConnection(url,user,psw);
모두들 대략적인 것을 알 수 있습니다. 우리는 DriverManager의 getConnection 방법을 호출하기 전에 해당하는 Driver 클래스가 jvm에 불러오고 클래스의 초기화 작업을 완성하면 됩니다. 구체적으로 어떻게 이 기능을 실현하는지는 중요하지 않습니다.위의 두 가지 방법은 모두 이 기능을 실현할 수 있기 때문에 프로그램은 정상적으로 운행할 수 있다.주의하십시오. 만약에 우리가 다음과 같은 조작을 한다면 프로그램은 정상적으로 실행될 수 없습니다. 왜냐하면 이것은 드라이버 클래스를 jvm에 불러올 뿐, 해당하는 초기화 작업을 하지 않기 때문입니다.

com.mysql.jdbc.Driver driver = null;  
//or:  
ClassLoader cl = new ClassLoader();  
cl.loadClass("com.mysql.jdbc.Driver"); 
우리는 모두 JDBC가 Bridge 모드를 이용하여 설계한 것을 알고 있다. DriverManager가 바로 그 중의 Abstraction,java이다.sql.Driver는 Implementor, com입니다.mysql.jdbc.Driver는 Implementor의 구체적인 구현입니다(GOF의 Bridge 모드 설명 참조).여러분, 주의하십시오. 앞의 드라이버는 하나의 인터페이스이고 후자는 하나의 종류입니다. 이것은 앞의 드라이버 인터페이스를 실현했습니다.Bridge 모드에서 Abstraction (Driver Manager) 은 Implementor (Driver) 의 인용을 가져야 하는데, 우리가 사용하는 과정에서 Driver 대상을 Driver Manager에 등록하지 않았습니다. 어떻게 된 일입니까?ddk 문서에서 드라이버에 대한 설명에는 다음과 같은 문장이 있습니다. When a Driver class is loaded, it should create an instance of itself and register it with the Driver Manager입니다.mysql.jdbc.드라이버는 마운트가 끝난 후에 자동으로 이 절차를 완성해 줍니다.소스 코드는 다음과 같습니다.

package com.mysql.jdbc  

public class Driver extends NonRegisteringDriver implements java.sql.Driver {  
 // ~ Static fields/initializers 
 // Register ourselves with the DriverManager 
 // 
 static {  
    t ry {  
              java.sql.DriverManager.registerDriver(new Driver());  
          } catch (SQLException E) {  
              throw new RuntimeException("Can't register driver!");  
          }  
  }  
// ~ Constructors 
/** 
  * Construct a new driver and register it with DriverManager
  *  
  * @throws SQLException
  *             if a database error occurs.
  */ 
 public Driver() throws SQLException {  
     // Required for Class.forName().newInstance() 
 }  
}
PS: JDBC 드라이브 마운트 수정

ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class clazz = cl.loadClass("com.mysql.jdbc.Driver");
clazz.newInstance();
Connection conn = DriverManager.getConnection("jdbcurl");
똑같이 실행할 수 있다.하지만 이렇게 해서 com을 하나 더 만들었다.mysql.jdbc.Driver 인스턴스입니다.동급.forName("com.mysql.jdbc.Driver").
즉,

Class.forName("com.mysql.jdbc.Driver")==cl.loadClass("com.mysql.jdbc.Driver").newInstance();
Class.forName 및 ClassLoader.loadClass는 두 가지입니다. 하나의 실례화 클래스, 하나의 로드 클래스입니다.

좋은 웹페이지 즐겨찾기