jdbc에서 class.forname의 역할
3498 단어 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는 두 가지입니다. 하나의 실례화 클래스, 하나의 로드 클래스입니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 애플리케이션을 모든 SQL 데이터베이스와 연결그래서 오늘 이 기사를 통해 JDBC를 통해 Java 애플리케이션을 SQL 데이터베이스에 연결하기 위해 작성할 수 있는 각 줄을 설명하는 심층 가이드를 제공하여 그들과 모든 커뮤니티를 도우려고 합니다. JDBC는 J...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.