Ao usar o JDBC, usaremos naturalmente a seguinte declaração:
A cópia do código é a seguinte:
Class.ForName ("com.mysql.jdbc.driver");
String url = "jdbc: mysql: //127.0.0.1/test? Useunicode = true & caracterEncoding = utf-8";
String user = "";
String psw = "";
Conexão con = driverManager.getConnection (URL, usuário, PSW);
Por que é natural?
Isso é necessário? Não, podemos substituí -lo por esta frase:
A cópia do código é a seguinte:
com.mysql.jdbc.driver driver = new com.mysql.jdbc.driver ();
//ou:
// novo com.mysql.jdbc.driver ();
String url = "jdbc: mysql: //127.0.0.1/test? Useunicode = true & caracterEncoding = utf-8";
String user = "";
String psw = "";
Conexão con = driverManager.getConnection (URL, usuário, PSW);
Você pode ter visto uma ideia aproximada. Ambos os métodos acima podem implementar essa função, para que o programa possa ser executado normalmente. Observe que, se executarmos as seguintes operações, o programa não será executado normalmente, porque isso apenas faz com que a classe de motorista seja carregada na JVM, mas não executa o trabalho de inicialização correspondente.
A cópia do código é a seguinte:
com.mysql.jdbc.driver driver = null;
//ou:
ClassLoader cl = new ClassLoader ();
cl.loadclass ("com.mysql.jdbc.driver");
Todos sabemos que o JDBC foi projetado usando o Modo Bridge. Observe que o driver anterior é uma interface, enquanto a última é uma classe, que implementa a interface do driver anterior.
No modo Bridge, o resumo (DriverManager) precisa ter uma referência ao implementador (driver), mas durante o uso, não registramos o objeto Driver no DriverManager. Há uma frase na descrição do Driver do documento JDK:
Quando uma aula de motorista é carregada, ele deve criar uma instância de si mesmo e registrá -la no DriverManager
Ah, acontece que com.mysql.jdbc.driver concluiu automaticamente esta etapa após o carregamento. O código -fonte é assim:
A cópia do código é a seguinte:
pacote com.mysql.jdbc
O driver da classe pública estende que o não registrador implementa java.sql.driver {
// ~ campos estáticos/inicializadores
// Registre -nos no DriverManager
//
estático {
tentar {
java.SQL.DriverManager.RegisterDriver (new Driver ());
} catch (sqlexception e) {
lançar a nova RuntimeTeException ("Não é possível registrar o motorista!");
}
}
// ~ construtores
/**
*Construa um novo motorista e registre -o no DriverManager
*
* @THOWS SQLEXCECTION
* Se ocorrer um erro de banco de dados.
*/
Public Driver () lança SqLexception {
// necessário para classe.ForName (). NewInstance ()
}
}
PS: Revise o carregamento do driver JDBC
A cópia do código é a seguinte:
ClassLoader cl = Thread.currentThread (). GetContextClassLoader ();
Classe clazz = cl.loadclass ("com.mysql.jdbc.driver");
clazz.NewInstance ();
Conexão conn = driverManager.getConnection ("jdbcurl");
Também pode ser executado. Mas, dessa maneira, construímos uma instância adicional de com.mysql.jdbc.driver. O mesmo que Class.ForName ("com.mysql.jdbc.driver").
Agora mesmo:
A cópia do código é a seguinte:
Class.ForName ("com.mysql.jdbc.driver") == cl.loadclass ("com.mysql.jdbc.driver"). NewInstance ();
Class.ForName e Classloader.LoadClass são duas coisas diferentes: uma classe instanciada e a outra classe carregada