Ich stieß auf diesen hilfreichen Link mit Code , der funktioniert perfekt, wenn es auf meinen Webserver aktualisiert wird. Ich kann absolut alles machen.
Nun, das einzige, was ich nicht vollständig verstehe, ist Class.forName()
.
Warum wird das benutzt? Kann dies anders gemacht werden? Ist das eine Arbeit für etwas anderes? Hinzufügen einer Referenz? Erstellen einer Klasse als Implementierung / Erweiterung einer anderen?
Ich möchte vollständig verstehen, was vor sich geht, aber das ist auf meine Art.
Danke
Dieser Code zwingt die Klasse, die den MySQL-Treiber darstellt, zu laden und zu initialisieren. In Java wird eine Klasse nur geladen, wenn notwendig ist , dass die Klasse geladen wird. Da der JDBC-Code normalerweise niemals direkt auf den Treiber verweist, wird er nicht ohne Class.forName
(oder eine andere äquivalente Alternative) geladen.
Beachten Sie, dass sowohl laden als auch initialisiert die Klasse sein muss, was zwei verschiedene Dinge sind.
Beachten Sie auch, dass es nicht erforderlich ist, .newInstance()
aufzurufen - der statische Initialisierer des Treibers registriert sich bereits selbst als JDBC-Treiber.
Beachten Sie schließlich, dass es mit der Service Loader API normalerweise nicht erforderlich ist, Class.forName () aufzurufen, um den Treiber zu laden: Er kann automatisch geladen werden.
Class.forName(className)
lädt die Klasse mit der angegebenen className
.
JDBC-Treiber werden auf diese Weise geladen, um zu vermeiden, dass eine Kompilierungszeitabhängigkeit von einem bestimmten JDBC-Treiber besteht. Die Idee ist, dass Sie die Java-JDBC-API (die in den Paketen java.sql
und javax.sql
definierten Klassen und Schnittstellen) verwenden, ohne direkt auf einen bestimmten JDBC-Treiber verweisen zu müssen.
Wenn Sie Java die Treiberklasse mit dem Aufruf forName
laden lassen, registriert sich der Treiber selbst, damit er verwendet werden kann.
Beachten Sie, dass es für die meisten JDBC-Treiber nicht erforderlich ist, explizit eine neue Instanz der Treiberklasse zu erstellen. Sie können den Aufruf .newInstance()
abbrechen.
Beachten Sie, dass seit JDBC Version 4.0 der Aufruf Class.forName()
nicht mehr erforderlich ist - der Prozess zum Erkennen von Treibern wurde verbessert, JDBC kann sie automatisch laden.
Alle JDBC-Treiber haben einen statischen Block, der sich beim DriverManager registriert und DriverManager hat nur einen Initialisierer.
Der MySQL JDBC-Treiber hat einen statischen Initializer wie folgt:
%Vor%JVM führt den statischen Block aus und der Treiber registriert sich beim DriverManager. Sie benötigen eine Datenbankverbindung, um die Datenbank zu manipulieren. Um die Verbindung zur Datenbank herzustellen, muss die DriverManager-Klasse wissen, welchen Datenbanktreiber Sie verwenden möchten. Dies erfolgt durch Iterieren über das Array (intern ein Vector) von Treibern, die sich bei ihm registriert haben, und ruft die acceptURL (url) -Methode für jeden Treiber im Array auf und fordert den Treiber effektiv auf, ihm mitzuteilen, ob er die JDBC verarbeiten kann URL.
Sie können zum Beispiel verwenden:
%Vor% Aber das ist nicht so flexibel; Sie können beispielsweise den Namen "com.mysql.jdbc.Driver" aus einer Konfigurationsdatei lesen. Vielleicht möchten Sie einen anderen Treiber (von Oracle) verwenden und den Code nicht ändern. In der oben dargestellten Weise ist dies nicht möglich, daher ist der richtige Ansatz mit Class.forName(name)
.