Skip Navigation Links
Accueil
Java Standard EditionExpand Java Standard Edition
Java EE 5Expand Java EE 5
Visual Basic .Net 2005Expand Visual Basic .Net 2005
Visual C++ .Net 2005Expand Visual C++ .Net 2005
Visual C# .Net 2005Expand Visual C# .Net 2005
Cours ASP .Net 2.0Expand Cours ASP .Net 2.0
PostgresqlExpand Postgresql
LinuxExpand Linux
Visual Studio 2008Expand Visual Studio 2008
ASP 3.0 ClassiqueExpand ASP 3.0 Classique
Cours Javascript - DOM - DHTMLExpand Cours Javascript - DOM - DHTML
Cours AjaxExpand Cours Ajax
VBAExpand VBA
AssembleurExpand Assembleur
PerlExpand Perl
MembresExpand Membres
L'auteur du site
Nouveautés sur le site
Contacts
Plan du site
Accueil > Java Standard Edition > Les bases de données en Java
____________________________________________________________________________________________________
Connexion

LES BASES DE DONNEES EN JAVA

Nous prendrons un exemple simple de couche d'accès aux données(DAL = Data Access Layer, qui signifie couche d'accès aux données), pour faire comprendre comment utiliser JDBC. Les citations seront donc des exemples tirés de cette DAL. La couche d'accès aux données, c'est simplement une couche contenant des outils pour accéder facilement à la base de données. Il est à noter que la couche DAO(Data Access Object) présentée ici, contient des objets, comme l'objet clients, qui sont des objets DAO en réalité, et que j'ai appelé, pour simplication, objets métier, dans ce cours. La classe clients est donc une classe ClientDAO en réalité. De plus, toujours pour simplifier, il n'y a pas de couche métier, ni de classes d'objets métiers. Les objets DAO servent en même temps d'objets métier.

L'ensemble des sources de la couche DAO sera fourni à la fin.

Le serveur MySQL utilisé ici est MySQL 5.0, et a été installé en même temps que WAMP.

MySQL fournit un pilote JDBC, qui peut être téléchargé à l'adresse http://dev.mysql.com/downloads/connector
Le téléchargement se fait sous la forme d'un zip, par exemple mysql-connector-java-5.1.5.zip
Décompresser ce zip vous crée un répertoire, dans lequel se trouve mysql-connector-java-5.1.5-bin.jar, qui est le jar à ajouter à vos applications pour bénéficier du pilote JDBC/MySQL.
Pour ajouter ce jar à votre projet, clic droit sur votre projet dans le project explorer de Eclipse -> properties -> Java Build Path -> Add External Jars.

I) A propos de la couche d'accès aux données fournie en exemple

La classe importante est la classe communDAL.java . C'est elle qui constitue le plus bas niveau de la DAL. Notre couche d'accès aux données peut aussi être constitué de classes qui héritent de la classe communDAL, comme la classe clients.java .

I.a) La classe communDAL

Cette classe peut être utilisée de deux manières. Car j'ai voulu montrer différentes façons de procéder. On utilise la classe communDAL soit en singleton, soit en classe mère d'une classe métier(comme la classe clients, qui hérite de la classe communDAL).

I.a.1) L'utilisation de la classe communDAL en singleton

La classe communDal peut être instanciée en singleton.
Utilisée en singleton, cette classe(une fois instanciée) représente une couche DAL( uniquement la partie commune de la couche DAL, c'est à dire les méthodes de bas niveau, et les attributs généraux).
La classe communDAL possède donc une implémentation du design pattern singleton, qui d'ailleurs peut être soit un singleton simple, soit un singleton multithread.
Il suffit de décommenter la méthode getInstance gérée en multithreading, et de commenter celle monothread, pour avoir un singleton multithreading. On peut mettre le constructeur en private au lieu de protected, lors d'une utilisation de la classe mère en singleton(c'est notre cas ici).

I.a.2) L'utilisation de la classe communDAL en classe mère d'une classe métier

La deuxième façon d'utiliser notre classe communDAL est de l'utiliser en classe mère d'une classe métier, par exemple comme l'exemple de la classe clients, qui hérite de communDAL.

Cette classe fournit une classe mère pour les objets métiers, et leur fournit les méthodes de base d'accès à la base de données, ainsi que les attributs de bases. Tous ces membres étant commun à tous les objets métiers, il était intéressant de les mettre dans une classe mère. La méthode getInstance( ainsi que l'attribut privé instance) ne doit pas être utilisé dans le cas d'une utilisation en classe mère de CommunDAL.

II) La connexion à la base de données

/**

       * Méthode de connection à la base de donnée.

       * Utilise les attributs: ip, port, bdd, login, mdp.

       * @throws ClassNotFoundException

       * @throws SQLException

       */

      public void connect() throws ClassNotFoundException, SQLException

      {

            String url = "jdbc:mysql://"+ this.ip + ":" + this.port + "/" + this.bdd;

 

            Class.forName("com.mysql.jdbc.Driver"); //uniquement

                  //pour exécuter le static initializer!

            //

            CommunDAL.conn = (com.mysql.jdbc.Connection)DriverManager.getConnection(url, this.login, this.mdp);

 

      }

II.a) Le Class.forName("nom de la classe Driver")

La classe "Class"(java.lang.Class) est une classe qui sert à faire des objets qui représentent une classe!
C'est l'équivalent de la classe "Type" du framework .net.

La méthode forName est une méthode statique de la classe "Class", qui sert à construire un objet de type "Class", qui représente la classe dont le nom est donné en paramètre.

Revenons à notre appel à nous:
Class.forName("com.mysql.jdbc.Driver");
On remarque qu'on ne récupère pas l'objet retourné par la méthode forName, alors que c'est normalement le but de la méthode forName! On en conclut qu'on effectue cet appel à la méthode forName dans un autre but, il s'agit par conséquent d'une astuce. En réalité, la classe "Driver" (com.mysql.jdbc.Driver) contient ce qu'on appelle un static initializer.

La classe Driver(com.mysql.jdbc.Driver) représente un driver, et plus précisément un driver de base de données MySQL.

Regardons le code source de la classe Driver de MySql:

/*

 Copyright (C) 2002-2004 MySQL AB

 

 This program is free software; you can redistribute it and/or modify

 it under the terms of version 2 of the GNU General Public License as

 published by the Free Software Foundation.

 

 There are special exceptions to the terms and conditions of the GPL

 as it is applied to this software. View the full text of the

 exception in file EXCEPTIONS-CONNECTOR-J in the directory of this

 software distribution.

 

 This program is distributed in the hope that it will be useful,

 but WITHOUT ANY WARRANTY; without even the implied warranty of

 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

 GNU General Public License for more details.

 

 You should have received a copy of the GNU General Public License

 along with this program; if not, write to the Free Software

 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

 

 

 

 */

package com.mysql.jdbc;

 

import java.sql.SQLException;

 

/**

 * The Java SQL framework allows for multiple database drivers. Each driver

 * should supply a class that implements the Driver interface

 *

 * <p>

 * The DriverManager will try to load as many drivers as it can find and then

 * for any given connection request, it will ask each driver in turn to try to

 * connect to the target URL.

 *

 * <p>

 * It is strongly recommended that each Driver class should be small and

 * standalone so that the Driver class can be loaded and queried without

 * bringing in vast quantities of supporting code.

 *

 * <p>

 * When a Driver class is loaded, it should create an instance of itself and

 * register it with the DriverManager. This means that a user can load and

 * register a driver by doing Class.forName("foo.bah.Driver")

 *

 * @see org.gjt.mm.mysql.Connection

 * @see java.sql.Driver

 * @author Mark Matthews

 * @version $Id: Driver.java 3726 2005-05-19 15:52:24Z mmatthews $

 */

public class Driver extends NonRegisteringDriver implements java.sql.Driver {

      // ~ Static fields/initializers

      // ---------------------------------------------

 

      //

      // Register ourselves with the DriverManager

      //

      static {

            try {

                  java.sql.DriverManager.registerDriver(new Driver());

            } catch (SQLException E) {

                  throw new RuntimeException("Can't register driver!");

            }

      }

 

      // ~ Constructors

      // -----------------------------------------------------------

 

      /**

       * Construct a new driver and register it with DriverManager

       *

       * @throws SQLException

       *             if a database error occurs.

       */

      public Driver() throws SQLException {

            // Required for Class.forName().newInstance()

      }

}

 

En tout début de classe, nous avons les lignes suivantes:

// ~ Static fields/initializers

      // ---------------------------------------------

 

      //

      // Register ourselves with the DriverManager

      //

      static {

            try {

                  java.sql.DriverManager.registerDriver(new Driver());

            } catch (SQLException E) {

                  throw new RuntimeException("Can't register driver!");

            }

      }

Ceci est ce qu'on appelle un static initializer. Il s'agit d'une syntaxe particulière, qui est constituée du mot "static", suivi d'un bloc( entre accolades). Le contenu de ce bloc est exécutée quand la classe est "chargée", ce qui signifie, à mon sens, lors de la toute première utilisation de cette classe. Un static initializer ressemble donc à un constructeur, sauf qu'il est exécuté une et une seule fois, et non à l'instanciation de chaque objet.

On comprend alors mieux le "Class.forname", dont l'objectif est de faire "charger" la classe Driver, car elle va être forcément utilisée par la méthode forName, donc elle va être "chargée". Et donc le static initializer sera exécuté, et c'est bien l'objectif qu'on recherchait!

II.a.2) Le contenu du static initializer de la classe Driver

Maintenant, attardons nous sur le contenu du static initializer:

static {

            try {

                  java.sql.DriverManager.registerDriver(new Driver());

            } catch (SQLException E) {

                  throw new RuntimeException("Can't register driver!");

            }

      }

Il s'agit d'un appel à la méthode statique "registerDriver" de la classe java.sql.DriverManager. Cette méthode demande un objet qui implémente l'interface java.sql.Driver. Bien entendu, notre classe Driver(com.mysql.jdbc.Driver), implémente cette interface java.sql.Driver, car elle a été écrite pour cela!
Nous créons donc un objet avec notre classe Driver, car c'est un objet qui est demandé.
D'où le "new Driver();". Le constructeur de notre classe Driver ne fait rien. Et le new Driver() ne va pas réexécuter le static initializer, car le static initializer est exécuté une et une seule fois!

L'appel à la méthode registerDriver va enregistrer notre classe Driver( com.mysql.jdbc.Driver) auprès du DriverManager de java.

Ci-dessous nous allons voir comment établir la connexion, et nous expliquerons alors l'utilité de cet enregistrement auprès du DriverManager.

II.b) L'appel à la méthode getConnection du DriverManager

String url = "jdbc:mysql://"+ this.ip + ":" + this.port + "/" + this.bdd;

(...)

CommunDAL.conn = (com.mysql.jdbc.Connection)DriverManager.getConnection(url, this.login, this.mdp);

La méthode static getConnection du DriverManager, doit d'abord retrouver dans son tableau interne quel driver elle doit utiliser. Pour cela, elle parcourt le tableau contenant tous les objets Driver qui se sont enregistrés, et elle appelle leur méthode booléenne acceptsURL(url), qui est une des méthodes de l'interface java.sql.Driver. Si la méthode retourne vraie, c'est que c'est le bon objet Driver à utiliser.
Cette méthode va juste déduire, à partir de la string contenant l'url, s'il peut traiter ou pas l'url JDBC donnée.

Grâce à cette technique pour retrouver le bon Driver, la méthode getConnection du DriverManager va être capable d'établir la connexion à la base de donnée, tout simplement en appelant la méthode connect de l'objet Driver( la méthode connect fait partie de l'interface java.sql.Driver).
Remarque: le type retourné par la méthode DriverManager.getConnection est java.sql.Connection, qui est une interface.

III) Ensemble des sources fournies

III.a)Le fichier CommunDAL.java

III.b) Le fichier clients.java

III.c) Le programme d'essai


RETOUR HAUT