Lorsque vous utilisez JDBC, nous utiliserons naturellement l'énoncé suivant:
La copie de code est la suivante:
Class.forname ("com.mysql.jdbc.driver");
String url = "jdbc: mysql: //127.0.0.1/test? Useunicode = true & caractèrescoding = utf-8";
String user = "";
String psw = "";
Connexion Con = driverManager.getConnection (URL, utilisateur, PSW);
Pourquoi est-ce naturel? Parce que les exemples dans les tutoriels en ligne et le livre sont comme ça, et le programme fonctionne en effet normalement, donc tout le monde est à l'aise pour le copier.
Est-ce nécessaire? Non, nous pouvons le remplacer par cette phrase:
La copie de code est la suivante:
com.mysql.jdbc.Driver Driver = new com.mysql.jdbc.Driver ();
//ou:
// new com.mysql.jdbc.Driver ();
String url = "jdbc: mysql: //127.0.0.1/test? Useunicode = true & caractèrescoding = utf-8";
String user = "";
String psw = "";
Connexion Con = driverManager.getConnection (URL, utilisateur, PSW);
Vous avez peut-être vu une idée approximative. Les deux méthodes ci-dessus peuvent implémenter cette fonction, de sorte que le programme peut s'exécuter normalement. Notez que si nous effectuons les opérations suivantes, le programme ne s'exécutera pas normalement, car cela ne fait charger la classe du pilote en JVM, mais n'effectue pas le travail d'initialisation correspondant.
La copie de code est la suivante:
com.mysql.jdbc.Driver Driver = null;
//ou:
Classloadher cl = new classloader ();
cl.loadClass ("com.mysql.jdbc.driver");
Nous savons tous que JDBC est conçu en utilisant le mode Bridge. Veuillez noter que le pilote précédent est une interface, tandis que le second est une classe, qui implémente l'interface du pilote précédent.
En mode Bridge, Résumé (DriverManager) doit avoir une référence à l'implémentateur (pilote), mais pendant l'utilisation, nous n'avons pas enregistré l'objet de pilote dans le DriverManager. Il y a une phrase dans le document JDK de la description du conducteur:
Lorsqu'une classe de pilote est chargée, elle devrait créer une instance d'elle-même et l'enregistrer auprès du DriverManager
Oh, il s'avère que com.mysql.jdbc.Driver a automatiquement terminé cette étape après le chargement. Le code source est comme ceci:
La copie de code est la suivante:
package com.mysql.jdbc
Le pilote de classe publique étend les implémentés non registorsdriver java.sql.driver {
// ~ champs statiques / initialiseurs
// nous inscrivez-vous auprès du drivermanager
//
statique {
essayer {
java.sql.DiverManager.RegisterDriver (new Driver ());
} catch (sqlexception e) {
lancer un nouveau RuntimeException ("Can't Register Driver!");
}
}
// ~ constructeurs
/ **
* Construisez un nouveau pilote et enregistrez-le avec DriverManager
*
* @throws sqlexception
* Si une erreur de base de données se produit.
* /
Public Driver () lève Sqlexception {
// requis pour class.forname (). NewInstance ()
}
}
PS: réviser le chargement du pilote JDBC
La copie de code est la suivante:
Classloadher cl = thread.currentThread (). GetContextClassloader ();
Classe Cllazz = cl.loadClass ("com.mysql.jdbc.driver");
Clazz.newinstance ();
Connexion conn = driverManager.getConnection ("jdbcurl");
Il peut également être exécuté. Mais de cette manière, nous construisons une instance supplémentaire de com.mysql.jdbc.driver. Identique à class.forname ("com.mysql.jdbc.driver").
Tout de suite:
La copie de code est la suivante:
Class.forname ("com.mysql.jdbc.driver") == cl.loadclass ("com.mysql.jdbc.driver"). NewInstance ();
Class.forname et classloader.loadclass sont deux choses différentes: une classe instanciée et l'autre classe chargée