Al usar JDBC, naturalmente usaremos la siguiente declaración:
La copia del código es la siguiente:
Class.forname ("com.mysql.jdbc.driver");
String url = "jdbc: mysql: //127.0.0.1/test? UseUnicode = true & caracterSencoding = utf-8";
String user = "";
Cadena psw = "";
Connection Con = Drivermanager.getConnection (URL, usuario, PSW);
¿Por qué es natural?
¿Es esto necesario? No, podemos reemplazarlo con esta oración:
La copia del código es la siguiente:
com.mysql.jdbc.driver controlador = nuevo com.mysql.jdbc.driver ();
//o:
// nuevo com.mysql.jdbc.driver ();
String url = "jdbc: mysql: //127.0.0.1/test? UseUnicode = true & caracterSencoding = utf-8";
String user = "";
Cadena psw = "";
Connection Con = Drivermanager.getConnection (URL, usuario, PSW);
Es posible que haya visto una idea aproximada. Ambos métodos anteriores pueden implementar esta función, por lo que el programa puede ejecutarse normalmente. Tenga en cuenta que si realizamos las siguientes operaciones, el programa no se ejecutará normalmente, porque esto solo hace que la clase del controlador se cargue en JVM, pero no realiza el trabajo de inicialización correspondiente.
La copia del código es la siguiente:
com.mysql.jdbc.driver conductor = null;
//o:
ClassLoader cl = new ClassLoader ();
cl.loadClass ("com.mysql.jdbc.driver");
Todos sabemos que JDBC está diseñado utilizando el modo de puente. Tenga en cuenta que el controlador anterior es una interfaz, mientras que este último es una clase, que implementa la interfaz del controlador anterior.
En el modo puente, Resumen (Drivermanager) debe tener una referencia al implementador (controlador), pero durante el uso, no registramos el objeto del controlador en el Drivermanager. Hay una oración en la descripción del controlador del documento JDK:
Cuando se carga una clase de controlador, debe crear una instancia de sí misma y registrarla con Drivermanager
Oh, resulta que com.mysql.jdbc.driver completó automáticamente este paso después de cargar. El código fuente es así:
La copia del código es la siguiente:
paquete com.mysql.jdbc
Public Class Driver extiende el no registrador implementa java.sql.driver {
// ~ campos estáticos/inicializadores
// registrarnos con el drivermanager
//
estático {
intentar {
java.sql.drivermanager.registerdriver (nuevo controlador ());
} Catch (SQLException e) {
tirar nueva runtimeException ("¡No se puede registrar el controlador!");
}
}
// ~ constructores
/**
*Construya un nuevo controlador y registelo con Drivermanager
*
* @throws sqlexception
* Si se produce un error de base de datos.
*/
Public Driver () lanza SQLException {
// requerido para class.forname (). NewInstance ()
}
}
PD: Revise la carga del controlador JDBC
La copia del código es la siguiente:
ClassLoader cl = Thread.CurrentThread (). GetContextClassLoader ();
Class clazz = cl.loadclass ("com.mysql.jdbc.driver");
clazz.newinstance ();
Conexión conn = drivermanager.getConnection ("jdbcurl");
También se puede ejecutar. Pero de esta manera, construimos una instancia adicional de com.mysql.jdbc.driver. Igual que class.forname ("com.mysql.jdbc.driver").
Ahora mismo:
La copia del código es la siguiente:
Class.forname ("com.mysql.jdbc.driver") == cl.loadclass ("com.mysql.jdbc.driver"). NewInstance ();
Class.forname y classloader.loadClass son dos cosas diferentes: una clase instanciada y la otra clase cargada