web-dev-qa-db-fra.com

qu'est-ce que cela fait exactement Class.forName ("com.mysql.jdbc.Driver"). newInstance ();

Lors de la connexion à la base de données MySQL, je fais les étapes suivantes

Connection con = null;
Resultset rs = null;
Statement st = null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/database","root","passwp");

En fait, je voulais savoir ce que fait l'instruction Class.forName("com.mysql.jdbc.Driver").newInstance();.

Althogh cette classe n'est pas dans mysql.jar. Où est-il présent?

17
user2098012

La classe Class se trouve dans le package Java.lang, elle est donc distribuée avec Java et importée automatiquement dans chaque classe.

Ce que fait la méthode forName(), c'est simplement renvoyer l'objet Class pour le paramètre qui a été chargé par le chargeur de classe. La méthode newInstance() renvoie ensuite une nouvelle instance de la classe.

Alors, ce qui se passe, c'est que vous appelez Class.forName(...) il retourne com.mysql.jdbc.Driver.class. Vous appelez ensuite newInstance() sur cette classe qui retourne une instance de la classe, sans paramètre, donc elle appelle essentiellement new com.mysql.jdbc.Driver();.

26
chossenger

Il initialise la classe "com.mysql.jdbc.Driver" S'il se trouve dans le chemin de classe, cela implique que le pilote est enregistré dans le gestionnaire de pilotes JDBC puisque le processus d'enregistrement est à l'intérieur de l'initialiseur statique de la classe de pilote ...

Il existe une autre approche que vous pouvez utiliser pour enregistrer un pilote: utiliser la méthode statique DriverManager.registerDriver().

7
aleroot

Citant de la spécification JDBC , chapitre 9, section 2:

Les pilotes JDBC doivent implémenter l'interface du pilote et l'implémentation doit contenir un initialiseur statique qui sera appelé lors du chargement du pilote. Cet initialiseur enregistre une nouvelle instance de lui-même avec le DriverManager.

Et un exemple de code est fourni pour AcmeJdbcDriver comme suit:

public class AcmeJdbcDriver implements Java.sql.Driver {
    static {
        Java.sql.DriverManager.registerDriver(newAcmeJdbcDriver());
    }
}

Et lorsque vous appelez Class.forName (String className) , selon la documentation de l'API, les événements suivants se produisent:

Un appel à forName ("X") provoque l'initialisation de la classe nommée X.

où l'initialisation implique le code dans le bloc statique à exécuter.

Donc, fondamentalement, vous initialisez la classe Driver, et à son tour la classe s'enregistre avec le Java.sql.DriverManager selon la spécification JDBC.

Veuillez noter que cela n'est plus nécessaire. Les détails peuvent être trouvés ici .

Les méthodes DriverManager getConnection et getDrivers ont été améliorées pour prendre en charge le mécanisme Java Standard Edition Service Provider. Les pilotes JDBC 4.0 doivent inclure le fichier META-INF/services/Java.sql.Driver. Ce fichier contient le nom de l'implémentation des pilotes JDBC de Java.sql.Driver. Par exemple, pour charger la classe my.sql.Driver, le fichier META-INF/services/Java.sql.Driver contiendrait l'entrée:

my.sql.Driver

Les applications n'ont plus besoin de charger explicitement les pilotes JDBC à l'aide de Class.forName ().

6
Koray Tugay

Il créera une nouvelle instance de com.mysql.jdbc.Driver et donc appeler l'initialisation statique qui enregistrera le pilote avec le DriverManager afin que vous puissiez créer des connexions mysql en fonction de l'URL que vous utilisez dans la deuxième ligne.

La classe doit cependant être dans le mysql.jar.

5
Janick Bernet