Bei der Verwendung von JDBC verwenden wir natürlich die folgende Anweisung:
Die Codekopie lautet wie folgt:
Class.forname ("com.mysql.jdbc.driver");
String url = "jdbc: mysql: //127.0.0.1/test?
String user = "";
String psw = "";
Verbindung con = driverManager.getConnection (URL, Benutzer, PSW);
Warum ist es natürlich?
Ist das notwendig? Nein, wir können es durch diesen Satz ersetzen:
Die Codekopie lautet wie folgt:
com.mysql.jdbc.driver driver = new com.mysql.jdbc.driver ();
//oder:
// new com.mysql.jdbc.driver ();
String url = "jdbc: mysql: //127.0.0.1/test?
String user = "";
String psw = "";
Verbindung con = driverManager.getConnection (URL, Benutzer, PSW);
Sie haben möglicherweise eine grobe Idee gesehen. Beide oben genannten Methoden können diese Funktion implementieren, sodass das Programm normal ausgeführt werden kann. Beachten Sie, dass das Programm bei der Ausführung der folgenden Operationen nicht normal ausgeführt wird, da dies nur dazu führt, dass die Treiberklasse in JVM geladen wird, jedoch keine entsprechenden Initialisierungsarbeiten durchführt.
Die Codekopie lautet wie folgt:
com.mysql.jdbc.driver driver = null;
//oder:
Classloader cl = new classloader ();
cl.loadClass ("com.mysql.jdbc.driver");
Wir alle wissen, dass JDBC mit Bridge -Modus entworfen wurde. Bitte beachten Sie, dass der vorherige Treiber eine Schnittstelle ist, während letzteres eine Klasse ist, die die vorherige Treiberschnittstelle implementiert.
Im Brückenmodus muss Abstract (TriverManager) einen Hinweis auf den Implementierer (Treiber) haben, aber während der Verwendung haben wir das Treiberobjekt nicht in den TriverManager registriert. In der Beschreibung des Treibers des JDK -Dokuments gibt es einen Satz:
Wenn eine Fahrerklasse geladen ist, sollte sie eine Instanz von sich selbst erstellen und sie beim TriverManager registrieren
Oh, es stellt sich heraus, dass com.mysql.jdbc.driver diesen Schritt nach dem Laden automatisch abgeschlossen hat. Der Quellcode ist so:
Die Codekopie lautet wie folgt:
Paket com.mysql.jdbc
Der Fahrer der öffentlichen Klassen erweitert nicht registriertDriver implementiert java.sql.driver {
// ~ statische Felder/Initialisierer
// registrieren Sie sich mit dem TriverManager
//
statisch {
versuchen {
java.sql.drivermanager.registerDriver (neuer Treiber ());
} catch (sqlexception e) {
Neue RunTimeException werfen ("Treiber kann nicht registrieren!");
}
}
// ~ Konstruktoren
/**
*Erstellen Sie einen neuen Treiber und registrieren Sie ihn bei TriverManager
*
* @Throws SQLEXception
* Wenn ein Datenbankfehler auftritt.
*/
public driver () wirft sqlexception {aus
// erforderlich für class.forname (). NewInstance ()
}
}
PS: Überarbeiten Sie das Laden des JDBC -Treibers
Die Codekopie lautet wie folgt:
Classloader cl = thread.currentThread (). GetContextClassloader ();
Klasse clazz = cl.loadClass ("com.mysql.jdbc.driver");
clazz.newinstance ();
Verbindung conn = driverManager.getConnection ("jdbcurl");
Es kann auch ausgeführt werden. Auf diese Weise erstellen wir jedoch eine zusätzliche Instanz von com.mysql.jdbc.driver. Gleich wie class.forname ("com.mysql.jdbc.driver").
Im Augenblick:
Die Codekopie lautet wie folgt:
Class.forname ("com.mysql.jdbc.driver") == cl.loadClass ("com.mysql.jdbc.driver"). NewInstance ();
Class.forname und classloader.loadClass sind zwei verschiedene Dinge: eine sofortige Klasse und die andere geladene Klasse