La phrase "Loading class 'com.mysql.jdbc.Driver'. Cette classe est obsolète. La nouvelle classe de pilote est 'com.mysql.cj.jdbc.Driver'" est claire. Vous devez utiliser le pilote le plus récent, comme ceci :
Class.forName("com.mysql.cj.jdbc.Driver");
Et dans mysql-connector-java-8.0.17. Vous trouverez que la classe com.mysql.jdbc.Driver ne fournit plus de service. (Vous pouvez aussi trouver l'avertissement venu d'ici).
public class Driver extends com.mysql.cj.jdbc.Driver {
public Driver() throws SQLException {
}
static {
System.err.println("Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.");
}
}
La phrase "Le pilote est automatiquement enregistré via l'interface SPI et le chargement manuel de la classe du pilote est généralement inutile". Cela signifie qu'il est possible d'écrire un code comme celui-ci :
//Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/world?useSSL=false&serverTimezone=Asia/Shanghai","root","root");
Grâce à SPI, le pilote est automatiquement enregistré. Comment cela fonctionne-t-il ? Vous pouvez le trouver dans java.sql.DriverManager :
private static void ensureDriversInitialized() {
...
ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
...
}
Et dans votre mysql-connector-java-XXX.jar, vous pouvez également trouver le fichier 'java.sql.Driver' dans le META-INF. \services. Le fichier est le suivant :
com.mysql.cj.jdbc.Driver
Lorsque vous exécutez DriverManager.getConnection(), le bloc statique s'exécute également. Ainsi, le pilote peut être enregistré automatiquement dans le fichier 'java.sql.Driver'.
Et plus sur SPI -> Différence entre SPI et API ? .