JDBC를 사용할 때는 다음과 같은 진술을 자연스럽게 사용합니다.
코드 사본은 다음과 같습니다.
class.forname ( "com.mysql.jdbc.driver");
문자열 URL = "jdbc : mysql : //127.0.0.1/test? useUnicode = true & characterEncoding = utf-8";
문자열 user = "";
문자열 psw = "";
Connection Con = DriverManager.getConnection (URL, USER, PSW);
온라인과 책 튜토리얼의 예제는 이와 같고 프로그램이 실제로 정상적으로 실행되기 때문에 모든 사람이 편하게 복사 할 수 있기 때문에 왜 자연 스럽습니까?
이것이 필요합니까? 아니요, 우리는이 문장으로 대체 할 수 있습니다.
코드 사본은 다음과 같습니다.
com.mysql.jdbc.driver driver = new com.mysql.jdbc.driver ();
//또는:
// new com.mysql.jdbc.driver ();
문자열 URL = "jdbc : mysql : //127.0.0.1/test? useUnicode = true & characterEncoding = utf-8";
문자열 user = "";
문자열 psw = "";
Connection Con = DriverManager.getConnection (URL, USER, PSW);
당신은 대략적인 아이디어를 보았을 것입니다. 위의 두 가지 방법 모두이 기능을 구현할 수 있으므로 프로그램은 정상적으로 실행될 수 있습니다. 다음 작업을 수행하면 프로그램이 정상적으로 실행되지 않습니다. 이로 인해 드라이버 클래스가 JVM에로드되지만 해당 초기화 작업을 수행하지 않기 때문입니다.
코드 사본은 다음과 같습니다.
com.mysql.jdbc.driver driver = null;
//또는:
클래스 로더 cl = 새로운 클래스 로더 ();
cl.loadclass ( "com.mysql.jdbc.driver");
우리는 JDBC가 Bridge Mode를 사용하여 설계되어 Java.sql.Driver가 구현 자입니다. 이전 드라이버는 인터페이스이고 후자는 클래스이며 이전 드라이버 인터페이스를 구현합니다.
Bridge Mode에서는 Abstract (DriverManager)가 구현 자 (드라이버)에 대한 참조가 필요하지만 사용 중에 드라이버 객체를 DriverManager에 등록하지 않았습니다. JDK 문서의 드라이버에 대한 설명에 문장이 있습니다.
드라이버 클래스가로드되면 자체 인스턴스를 생성하여 드라이버 메너에 등록해야합니다.
아, com.mysql.jdbc.driver가로드 후이 단계를 자동으로 완료 한 것으로 나타났습니다. 소스 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
패키지 com.mysql.jdbc
공개 클래스 드라이버는 비 등록 드라이버 확장 java.sql.driver {
// ~ 정적 필드/초기화기
// DriverManager에 자신을 등록하십시오
//
정적 {
노력하다 {
java.sql.drivermanager.registerdriver (new driver ());
} catch (sqlexception e) {
새로운 runtimeexception을 던지십시오 ( "레인지 드라이버!");
}
}
// ~ 생성자
/**
*새 드라이버를 구성하고 DriverManager에 등록하십시오
*
* @throws sqlexception
* 데이터베이스 오류가 발생하는 경우.
*/
공개 드라이버 ()는 sqlexception {를 던졌습니다.
// class.forname (). newInstance ()에 필요합니다.
}
}
추신 : JDBC 드라이버의 로딩을 수정합니다
코드 사본은 다음과 같습니다.
클래스 로더 cl = thread.currentthread (). getContextClassLoader ();
클래스 Clazz = cl.loadclass ( "com.mysql.jdbc.driver");
clazz.newinstance ();
Connection Conn = DriverManager.getConnection ( "JDBCURL");
또한 실행할 수 있습니다. 그러나 이러한 방식으로 Com.mysql.jdbc.driver의 추가 인스턴스를 구성합니다. class.forname과 동일합니다 ( "com.mysql.jdbc.driver").
지금 바로:
코드 사본은 다음과 같습니다.
class.forname ( "com.mysql.jdbc.driver") == cl.loadclass ( "com.mysql.jdbc.driver"). NewInstance ();
class.forname 및 classload.loadclass는 두 가지 다른 것입니다. 하나는 인스턴스화 된 클래스와 다른로드 클래스