2. Chargement et déclaration du pilote

2.1. Introduction

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.

2.2. Chargement et instanciation du pilote

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.

2.3. Enregistrement du pilote

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.

2.4. Chargement dynamique

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é.

Exemple 2. Contenu du fichier META-INF/services/java.sql.Driver

oracle.jdbc.OracleDriver
com.mysql.jdbc.Driver

2.5. Utilisation de DataSource

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. 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::3306/db_test") ;

Connection conn = ds.getConnection() ;

Le code utilisant cette connexion est identique.

2.6. Pilotes pour les principales bases de données

Donnons ici les pilotes JDBC des principales bases de données que l'on rencontre.

Tableau 3. Principaux pilotes JDBC

Base de données Classe du pilote Référence
MySQL com.mysql.jdbc.Driver http://www.mysql.com/
Apache Derby org.apache.derby.jdbc.EmbeddedDriver http://db.apache.org/derby/
PostgreSQL org.postgresql.Driver http://www.postgresql.org/
SQLite org.sqlite.JDBC http://www.sqlite.org/
HSQLDB org.hsqldb.jdbcDriver http://hsqldb.org/
Oracle oracle. jdbc.driver.OracleDriver http://www.oracle.com/
SQLServer com.microsoft.jdbc.sqlserver.SQLServerDriver et net.sourceforge.jtds.jdbc.Driver http://www.microsoft.com/sqlserver/ et http://jtds.sourceforge.net/

Java Database Connectivity
Retour au blog Java le soir
Cours & Tutoriaux