L’API JDBC (Java Database Connectivity) Driver Class + connect ( [in] url : String , [in] Properties : info ) : Connection + forName ( [in] arg : String ) : void DriverManager Le DriverManager ne propose que des méthodes statiques. + getConnection ( [in] url : String , [in] name : String , [in] pwd : String ) : Connection + registerDriver ( [in] driver : Driver ) : void Connection IGSDriver + createStatement ( ) : Statement + connect ( [in] url : String , [in] Properties : info ) : Connection Instancie IGSConnection + createStatement ( ) : Statement Statement + execute ( [in] sql : String ) : ResultSet ResultSet Instancie Instancie IGSStatement + execute ( [in] sql : String ) : ResultSet IGSResultSet Figure 1 Les classes DriverManager, Driver, Connection, Satatement et ResultSet font partie du package java.sql de la bibliothèque java et la classe Class du package java.lang de la bibliothèque java. Situation Un client demande une instance de type Connection au DriverManager qui encapsule une instance de type IGSDriver (voir méthode registerDriver). Il va alors lui déléguer, via la méthode connect, la création d'une instance d'une classe réalisant l'interface Connection (ici IGSConnection). C'est effectivement le driver concret qui sait préparer un objet de type Connection capable d'interagir avec la base de données. Concrètement ici, un objet de type IGSDriver est capable de créer un objet de type IGSConnection. Déroulement 1. Chargement dans le heap (dynamic loading) de la classe IGSDriver via la méthode forName de la classe Class. 2. Tout de suite après son chargement en mémoire, le driver IGSDriver, via un bloc static, inscrit une instance de lui-même auprès du DriverManager. Ce dernier propose une méthode statique registerDriver afin de permettre l’enregsitrement d’objets réalisant l’interface Driver Olivier Schaerer 2004-2005 / IGS3 L'interface Driver définit donc des objets pouvant s'inscrire ou être inscrits auprès de DriverManager via la méthode statique registerDriver. 3. L’objet de type IGSDriver enregistré auprès du DriverManager est capable de créer des objets de type Connection (par exemple, dans notre cas, de type IGSConnection). Ainsi, lorsque le client demande une Connection au DriverManager, ce dernier en délègue la création à l’objet IGSDriver qu’il encapsule. Une Connection fournit des outils de manipulation des informations de la base de données. Parmi ces objets, on trouve des Statement, plus précisemment, des instances de classes implémentant l'interface Statement (voir IGSStatement). 4. Le client peut invoquer la méthode createStatement afiin d’obtenir un Statement. Ce dernier permettra entre autre d’exécuter des requêtes sur la source de données (BDD). C'est donc l'objet IGSConnection qui crée des instances de type Statement, particulièrement, dans notre cas, de type IGSStatement. 5. Finalement, une fois le résultat de la requête obtenu, l'instance de type IGSStatement crée un objet de la classe IGSResultSet. Cette dernière implémente l'interface ResultSet et permet de parcourir entre autre le résultat d'un SELECT. Diagrammes de séquences Le diagramme ci-dessous présente les enchaînements nécessaires à la création d’un objet de type Connection. Client : Actor1 Object1 : Class Object3 : DriverManager Classe IGSDriver C'est la classe IGSDriver qui créee une instance d'elle même ! 1 : forName ( arg ) Dynamic loading --------------------> 2 : \bloc static\ 3 : \New\ Object2 : IGSDriver 4 : registerDriver ( driver ) 5 : getConnection ( url , name , pwd ) 6 : connect ( url , Properties ) une Connection une Connection Figure 2 Chargement du driver et création d’un objet Connection Le diagramme suivant présente les étapes pour effectuer une requête (SELECT) sur la base de données et récupérer les données dans un ResultSet. Olivier Schaerer 2004-2005 / IGS3 Client : Actor1 Object4 : IGSConnection 6 : createStatement ( ) 7 : \new\ Object5 : IGSStatement un Statement 8 : execute ( sql ) un ResultSet 9 : \new\ Object6 : IGSResultSet Figure 3 Effectuer une requête sur la base de données et récupérer le résultat dans une ResultSet Olivier Schaerer 2004-2005 / IGS3