Le chargement du pilote consiste à charger la classe de ce pilote, et à en créer une instance.
La façon la plus immédiate de procéder est de faire appel à la méthode forName(String)
de la classe Class
, puis par appel de la méthode newInstance()
.
Cette procédure est pratique, car il n’y a pas besoin de connaître le pilote au moment de
l’écriture du code. Il est parfaitement possible de le passer en paramètre au moment du
lancement de l’application.
Ensuite, il faut déclarer le pilote au niveau du DriverManager
, par appel à la
méthode statique registerDriver(Driver)
. Cet objet se chargera enfin de la contruction
de l’objet connexion à la base de données. Cet objet peut connaître autant de pilotes qu’on peut
lui en donner, et c’est lui qui, au vu de la chaîne de connexion qu’il reçoit, va choisir le bon
pilote et créer l’objet de type Connection
.
Le pilote est une classe qui implémente l’interface Driver
. Cette interface contient
une méthode principale : connect()
, à laquelle il faut passer comme paramètres l’URL
de la base et les identifiants de connexion pour pouvoir établir une connexion à la base de données.
Outre registerDriver(Driver)
et deregisterDriver(Driver)
, la classe
DriverManager
possède des méthodes qui permettent de configurer les pilotes qu'elle
gère.
La méthode statique forName(String)
de la classe Class
nous renvoie une
instance de Class
. On ne lui fournit qu’une chaîne de caractères qui représente le
nom complet du pilote. Une fois cette instance créée, le DriverManager
connaît
automatiquement le pilote, et il est possible de demander une connexion sur la base.
L’avantage de cette méthode est que l’on n’a pas besoin du pilote au moment de la compilation. Il suffit juste de connaître son nom complet. La machine Java n’aura besoin d’avoir ce pilote dans son espace de nom que lors de son chargement.
L’instanciation de ce pilote peut se faire par l’appel à la méthode statique newInstance()
de la classe Class
. Elle nous renvoie un objet de type Driver
,
interface implémentée par tous les pilotes JDBC.
Cette méthode était la méthode préconisée dans les anciennes version du JDK et de JDBC. De nouveaux mécanismes ont été apportés à Java 6, qui permettent de procéder de façon plus simple et purement déclarative. Notamment, il n'est plus nécessaire de charger explicitement la classe du pilote, ni même de l'instancier.
L’enregistrement du pilote se fait par appel à la méthode statique registerDriver(Driver)
de la classe DriverManager
. On passe en paramètre l’instance du pilote que l’on
vient de construire.
La méthode par chargement dynamique est préférable aux autres, puisqu’elle n’a besoin d’aucune information au moment de l’écriture du code, ni au moment de sa compilation.
La déclaration du (ou des !) pilote de la base peut se faire de deux façons.
La première consiste à passer le nom du pilote en paramètre au lancement de la machine Java,
en utilisant la déclaration de la propriété jdbc.drivers
:
$ java –Djdbc.drivers=com.mysql.jdbc.Driver TestDB
La seconde consiste a utiliser une fonctionnalité de Java 6. Lors du chargement d'un JAR, Java 6
examine le contenu du répertoire META-INF
de ce JAR. S'il y trouve un fichier
services/java.sql.Driver
, alors il l'ouvre, charge les classes définies dans ce fichier,
et les enregistre en tant que pilotes JDBC. On pourra se reporter à la documentation de la classe
java.util.ServiceLoader
pour plus d'informations sur cette fonctionnalité.
Les méthodes présentées jusqu'à présent fonctionne dans tous les environnements Java, JSE ou JEE. Toutefois, dans les environnements JEE, ce ne sont pas celles-là qui sont utilisées.
Dans un environnement JEE, que l'on soit en version 4, 5 ou 6, c'est le serveur JEE qui se charge de
gérer les connexions aux bases de données, et de fournir des objets de type DataSource
. Ces
objets sont passés au code appelant, soit par requête JNDI, soit par injection directe. Un objet
de type DataSource
possède une méthode getConnection()
qui nous retourne
notre objet Connection
classique.
Il n'est pas besoin de disposer d'un serveur JEE pour utiliser des sources de données. On peut utiliser la bibliothèque Apache DBCP (http://commons.apache.org/dbcp) pour ce faire, dont le fonctionnement de base est très simple. Notons que DBCP est elle-même utilisée dans de nombreux serveurs JEE open-source.
DBCP fournit plusieurs implémentations de l'interface DataSource
, dont la plus simple
est BasicDataSource
. Voyons un exemple simple d'utilisation.
Exemple 3.2. Création d'une source de données DBCP
BasicDataSource ds = new BasicDataSource() ; ds.setDriverClassName("com.mysql.jdbc.Driver") ; ds.setUsername("scott") ; ds.setPassword("tiger") ; ds.setUrl("jdbc:mysql://localhost:3306/db_test") ; Connection conn = ds.getConnection() ;
Le code utilisant cette connexion est identique.
Donnons ici les pilotes JDBC des principales bases de données que l'on rencontre.
Tableau 3.1. Principaux pilotes JDBC
Base de données | Classe du pilote | Référence |
---|---|---|
MySQL |
|
|
Apache Derby |
|
|
PostgreSQL |
|
|
SQLite |
|
|
HSQLDB |
|
|
Oracle |
|
|
SQLServer |
|
|