Vous êtes sur la page 1sur 49

18

Connectivit aux bases de donnes Java (JDBC)

Objectifs Comprendre les bases de donnes relationnelles. Utiliser les classes et les interfaces du package java.sql pour interroger, insrer et mettre jour une base de donnes. Comprendre la formation des requtes de base au moyen du langage SQL (Structured Query Language).

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

887

Aperu
18.1 18.2 Introduction Systmes de base de donnes 18.2.1 18.2.2 18.2.3 18.2.4 18.3 18.4 18.5 Avantages des systmes de bases de donnes Indpendance des donnes Langages de bases de donnes Base de donnes rpartie

Modle de base de donnes relationnelle Aperu des bases de donnes relationnelles: la base de donnes Livres.mdb Langage de requte structur (SQL) 18.5.1 18.5.2 18.5.3 18.5.4 18.5.5 Requte de base SELECT Clause WHERE Clause ORDER BY Utilisation de INNER JOIN pour fusionner des donnes en provenance de plusieurs tables Requte TitreAuteur de Livres.mdb Enregistrer Livres.mdb en tant que source de donnes ODBC Interroger la base de donnes Livres.mdb

18.6

Un premier exemple 18.6.1 18.6.2

18.7 18.8

Lire, insrer et mettre jour une base de donnes Microsoft Access Gestion de transactions Rsum Terminologie Erreurs de programmation courantes Bonne pratique de programmation Astuce sur la performance Astuces sur la portabilit Observations de gnie logiciel Exercices de rvision Rponses aux exercices de rvision Exercices Bibliographie

18.1 Introduction
Au chapitre 17, nous avons discut du traitement des fichiers accs squentiel et accs direct. Le traitement de fichiers squentiels convient bien aux applications qui doivent traiter la presque totalit des informations dun fichier. Par contre, le traitement des fichiers accs direct est idal pour les applications qui doivent retrouver et mettre jour rapidement un lment de donne prcis (cest particulirement le cas de la gestion des transactions) et qui ne sintressent qu une petite partie du fichier la fois. Java possde de puissantes fonctionnalits pour le traitement de ces deux types de fichier. Lun des problmes qui touchent ces deux types de traitement tient ce quils ne font que rcuprer les donnes et noffrent aucune fonction pour interroger efficacement les donnes. Les systmes de base de donnes non seulement assurent le traitement des fichiers, mais en plus organisent les donnes de manire faciliter lobtention des rsultats dune requte complexe. Les bases de donnes les plus courantes dans les ordinateurs qui utilisent Java sont les bases de donnes relationnelles. Ces dernires annes, les bases de donnes objets ont fait dtonnantes peres. Un langage appel langage de requte structur (SQL) est employ dans presque tous les systmes de base de donnes pour construire des requtes (demande dinformations qui satisfait un certain critre). Java permet aux programmeurs dcrire du code qui met en uvre les requtes SQL pour retrouver des renseignements dans des bases de donnes relationnelles. Parmi les logiciels de base de donnes relationnels les plus connus, mentionnons Microsoft Access, Sybase, Oracle, Informix

888

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

et Microsoft SQL Server. Le prsent chapitre vous initie lAPI JDBC (connectivit aux bases de donnes Java) et vous montre comment travailler avec une base de donnes Microsoft Access.

18.2 Systmes de base de donnes


La disponibilit peu de frais de gigantesques mmoires accs direct a donn limpulsion dinnombrables travaux de recherche et de dveloppement dans le domaine des systmes de base de donnes. Une base de donnes est une collection intgre de donnes. Un systme de base de donnes est la somme des donnes elles-mmes, du matriel qui les hberge et du logiciel (le systme de gestion de la base de donnes ou SGBD) qui contrle le stockage et la rcupration des donnes, ainsi que le dialogue avec les utilisateurs.

18.2.1 Avantages des systmes de bases de donnes


C. J. Date (Da81) a dress une liste des avantages des systmes de base de donnes : Rduction de la redondance. limination du manque de cohrence. Partage des donnes. Application de normes. Mise en uvre de restrictions scuritaires. Maintien de lintgrit. quilibrage de besoins contradictoires. Dans les systmes autres que les bases de donnes, chaque application distincte tient jour ses fichiers, souvent en rptant les mmes tches et en recourant divers formats physiques. Dans les systmes de base de donnes, on parvient rduire la redondance grce lintgration des fichiers distincts. Le partage des donnes est sans contredit lun des avantages majeurs des bases de donnes. Des applications existantes peuvent consulter les mmes donnes. Le contrle partir dun mme endroit concourt mettre en application plus strictement des standards. Cest un enjeu particulirement important surtout avec les rseaux informatiques dans lesquels se produit une migration des donnes entre systmes. La scurit est un enjeu ambivalent pour les systmes de base de donnes. Dune part, le fait de regrouper et de conserver les donnes dans un endroit central accentue les risques, par rapport une rpartition des donnes. Dautres part, il est possible de concevoir des bases de donnes dotes dune gestion trs scuritaire des accs.

18.2.2 Indpendance des donnes


Lun des aspects les plus importants des bases de donnes est lindpendance des donnes (cest--dire que les applications nont pas savoir comment les donnes sont gardes et consultes dans la couche physique). Une application est dite dpendante des donnes sil faut que la structure de stockage et la stratgie daccs soient immuables pour que lapplication fonctionne correctement. Lindpendance des donnes permet diverses applications davoir des vues diffrentes des mmes donnes. Du point de vue du systme, il est possible de modifier, grce lindpendance des donnes, la structure de stockage et la stratgie daccs la lumire de nouveaux besoins, sans que cela implique une modification au fonctionnement des applications.

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

889

18.2.3 Langages de bases de donnes


Les utilisateurs accdent une base de donnes au moyen dun langage spcialis. Les applicatifs sont crits avec un langage de haut niveau courant comme Java, C, C++, Visual Basic, COBOL, PL/1 ou Pascal; lutilisateur peut composer des requtes pour la base de donnes en se servant dun langage de requte spcialis qui facilite llaboration de la requte dans lenvironnement de lapplication. Ces langages sont appels des langages htes. Chaque langage hte comprend gnralement un sous-langage de base de donnes (SLBD) qui concerne les particularits des objets et des oprations de la base de donnes. Le plus souvent, un sous-langage de donnes combine deux langages : un langage de dfinition de donnes (LDD) qui sert dfinir les objets de la base de donnes et un langage de manipulation des donnes (LMD) qui possde les fonctionnalits propres la spcification des traitements appliqus aux objets de la base de donnes. Le trs populaire langage de requte SQL (Structured Query Language), dont nous parlons la section 18.5, regroupe un LDD et un LMD.

18.2.4 Base de donnes rpartie


Une base de donnes rpartie (Wi88) est une base de donnes dploye sur les diffrents systmes informatiques dun rseau. Normalement, les lments de donnes dans un tel systme se retrouvent lendroit qui les consulte le plus souvent, tout en restant accessibles aux autres utilisateurs du rseau. Les systmes rpartis procurent le contrle et les conomies dun traitement localis tout en offrant laccessibilit aux informations en plusieurs points loigns gographiquement. Ce sont des solutions coteuses implanter et mettre en service, en plus dtre vulnrables du point de vue de la scurit.

18.3 Modle de base de donnes relationnelle


Trois modles de base de donnes ont connu une grande diffusion : le modle hirarchique, le modle rseau et le modle relationnel. Dans ce chapitre, nous allons dcrire le modle le plus rpandu, soit le modle de base de donnes relationnelle. Le modle relationnel dvelopp par Codd (Co70)(Co72)(Bl88)(Co88)(Re88) est une reprsentation logique des donnes dans laquelle on sintresse aux relations entre les donnes, sans considrer limplantation physique de la structure des donnes. Une base de donnes relationnelle est constitue de tables. La figure 18.1 nous montre un exemple de table que lon pourrait trs bien retrouver dans un systme de gestion de personnel. Le nom de la table est EMPLOYS et son principal rle est de faire connatre les attributs dun employ et le rapport entre ces attributs et un certain employ. Chaque range (ligne) de la table est appele un enregistrement. Notre table en question possde six enregistrements. Le champ du numro demploy de cette table sert de cl primaire pour le renvoi aux donnes de cette table. Les enregistrements de la figure 18.1 sont classs par ordre croissant de la cl primaire. Normalement, les tables dans une base de donnes possdent une cl primaire, mais ce nest pas obligatoire. La cl primaire peut tre la combinaison de deux colonnes (champs) ou plus de la base de donnes. Les champs servant de cl primaire ne peuvent jamais avoir de doublon. Chaque colonne dune table correspond un champ diffrent. Le plus souvent, les enregistrements sont uniques (par la cl primaire) dans une table, mais des valeurs de champ pourront tre identiques dans diffrents enregistrements. Par exemple, trois enregistrements diffrents de la table EMPLOYS possdent le mme numro de service 413.

890

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

Diffrents utilisateurs dune base de donnes sont souvent intresss par diffrents aspects des donnes et diffrentes relations entre les donnes. Des utilisateurs ne veulent connatre que certains sous-ensembles des colonnes de la table. Par contre, dautres utilisateurs souhaitent combiner de petites tables pour obtenir de grandes tables plus complexes. Codd a appel projection lopration dintersection et jointure lopration de combinaison. Dans la table de la figure 18.1, on pourrait, par exemple, effectuer une projection pour obtenir une nouvelle table appele SERVICE-LOCALISATEUR dont le rle est de montrer les emplacements des services. Cette nouvelle table est reproduite la figure 18.2. Dans Java, une table est manipule sous forme dun objet ResultSet. Lorganisation relationnelle dune base de donnes procure de nombreux avantages par rapport au modle hirarchique et au modle rseau: 1. La reprsentation dans des tables du modle relationnel est facile comprendre par les utilisateurs et son implantation physique ne pose pas de difficult. 2. La conversion de presque nimporte quelle autre structure de base de donnes en une structure relationnelle est relativement facile. 3. Les oprations de projection et de jointure sont facilement ralisables et permettent de crer sans difficult les nouvelles tables ncessaires des applications particulires. 4. Les recherches dans une base de donnes peuvent tre plus rapides que dans un modle qui exige que lon suive une srie de pointeurs.
Table: EMPLOYS Numro 23603 24568 Un enregistrement 34589 35761 47132 78321 Cl primaire Nom JONES, A. KERWIN, R. LARSON, P . MYERS, B. NEUMANN, C. STEPHENS, T. Service 413 413 642 611 413 611 Salaire 1100 2000 1800 1400 9000 8500 Emplacement MONTRAL MONTRAL GENVE PARIS MONTRAL PARIS

Une colonne

Figure 18.1

Structure dune base de donnes relationnelle.

Table: SERVICE-LOCALISATEUR Service 413 611 642 Emplacement MONTRAL PARIS GENVE

Figure 18.2

Une table forme par projection.

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

891

5. Les structures relationnelles sont plus simples modifier que les structures hirarchiques et rseau. Dans les environnements o la souplesse compte, cet aspect est primordial. 6. La clart et la visibilit de la base de donnes sont suprieures dans une structure relationnelle. Il est plus ais de rechercher des donnes dans des tables que de parcourir des liaisons complexes et arbitraires entre lments de donnes au moyen dun mcanisme de pointeurs.

18.4 Aperu des bases de donnes relationnelles : la base de donnes Livres.mdb


Dans cette section, nous vous dcrivons lessentiel du langage SQL (langage de requte structur) au moyen dun exemple de base de donnes que nous avons cr pour ce chapitre. Avant de passer SQL, examinons les aspects de la base de donnes Livres.mdb. Nous allons nous servir de cette base de donnes dans tout le reste de ce chapitre et elle nous permettra dintroduire diverses notions des bases de donnes, notamment comment employer SQL pour rcuprer des renseignements utiles de la base de donnes et pour manipuler la base de donnes. Cette base de donnes se trouve sur le cdrom avec les exemples de ce livre. Cette base de donnes est constitue de quatre tables: Auteurs, diteurs, AuteursISBN et Titres. La table Auteurs (voir la figure 18.3) comprend quatre champs qui conservent dans la base de donnes un identifiant unique pour lauteur, ainsi que son nom, son prnom et lanne de sa naissance. La figure 18.4 fait voir une partie des valeurs que nous avons entres dans la table Auteurs de la base de donnes Livres.mdb. La table diteurs, reproduite la figure 18.5, comprend deux champs: un pour un numro exclusif de lditeur et lautre pour le nom de lditeur. La figure 18.6 montre la table des diteurs que nous avons constitue pour la base de donnes Livres.mdb.
Champ Description

IDAuteur Prnom Nom de famille Anne de naissance Figure 18.3

Numro identiant lauteur dans la base de donnes. Cest le champ de la cl primaire de cette table. Le prnom de lauteur. Le nom de famille de lauteur. Lanne de la naissance de lauteur.

La table Auteurs de la base de donnes Livres.mdb.

IDAuteur

Prnom

Nom de famille

Anne de naissance

1 2 3 4 Figure 18.4

Harvey Paul Floyd Tocci

Deitel Deitel Thomas Ronald

1946 1968 1957

Quelques donnes de la table Auteurs de Livres.mdb.

892

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

La table AuteursISBN (figure 18.7) est forme de deux champs qui tiennent jour le numro ISBN et le numro identifiant de lauteur correspondant. Cette table permet dassurer le lien entre les noms des auteurs et les titres de leurs livres. La figure 18.8 reproduit les valeurs de la table AuteursISBN de la base de donnes Livres.mdb. Certains ISBN sont fictifs.

Champ

Description

IDditeur Nomditeur Figure 18.5

Le numro identiant de lditeur dans la base de donnes. Il sagit de la cl primaire de cette table. Le nom abrg de lditeur.

La table diteurs de Livres.mdb.

IDditeur

Nomditeur

1 2 3 Figure 18.6

ditions R. Goulet Prentice Hall Prentice Hall PTR Les donnes de la table diteurs de Livres.mdb.

Champ

Description

ISBN IDAuteur

Le numro ISBN dun livre. Le numro identiant lauteur, qui permet de relier un livre un certain auteur. Le numro identiant doit aussi se retrouver dans la table Auteurs. La table AuteursISBN de la base Livres.mdb.

Figure 18.7

ISBN

IDAuteur

ISBN

IDAuteur

0-13-082925-0 0-13-083054-2 0-13-083055-0 0-13-226119-7 Figure 18.8

2 3 3 2

0-13-083054-2 0-13-083055-0 0-13-226119-7 0-13-456955-5

1 1 1 1

Les donnes de la table AuteursISBN de Livres.mdb. (1 de 2)

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

893

ISBN

IDAuteur

ISBN

IDAuteur

0-13-456955-5 0-13-904947-9 0-13-904947-9 2-89377-087-8 2-89377-145-9 2-89377-146-7 2-89377-147-5 2-89377-154-8 2-89377-158-0 2-89377-170-X 2-89377-171-8 2-89377-172-6 2-89377-175-0 2-89377-176-9 2-89377-177-7 Figure 18.8 Figure 18.8

2 1 3 4 14 14 14 7 2 17 7 9 8 19 10

0-13-456955-5 0-13-904947-9 2-89377-061-4 2-89377-087-8 2-89377-145-9 2-89377-146-7 2-89377-147-5 2-89377-158-0 2-89377-170-X 2-89377-170-X 2-89377-172-6 2-89377-172-6 2-89377-175-0 2-89377-177-7

3 2 4 5 15 15 15 1 16 18 8 19 11 9

Les donnes de la table AuteursISBN de Livres.mdb. (1 de 2) Les donnes de la table AuteursISBN de Livres.mdb. (2 de 2)

La table Titres (voir figure 18.9) est constitue de six champs qui tiennent jour les renseignements gnraux sur chacun des livres de la base de donnes: lISBN, le titre, le numro ddition, lanne de publication, une description du livre et le numro identifiant de lditeur. La figure 18.10 montre les donnes entres dans la table Titres. [Note: Le champ Description de la table Titres nest pas reproduit ici.]

Champ

Description

ISBN Titre dition AnnePublication Description IDditeur

Numro ISBN du livre. Titre du livre. Le numro de ldition du livre. Lanne de la publication du livre. Description du livre. Le numro identiant de lditeur. Cette valeur correspond au numro identiant de la table diteurs. La table Titres de Livres.mdb.

Figure 18.9

894

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

ISBN

Titre

dition

Anne Publication

IDditeur

0-13-082925-0 0-13-083054-2

The Complete C++ Training Course The Complete C++ Training Course 2/e and Getting Started with Visual C++ 5.0 Tutorial The Complete Java Training Course 2/e and Getting Started with Visual J++ 1.1 Tutorial C How to Program Visual Basic 6 How to Program Java How to Program Instructors Manual with Solution Disk Circuits numriques Statique Word 97 PowerPoint 97 Access 97 Fondements dlectronique Comment programmer en C++ MSCE, Coffret NT4, Examen clair lectronique, Composants et systmes dapplication Ofce 2000 Premium PowerPoint 2000 Access 2000 Word 2000

2 2

1998 1998

3 2

0-13-083055-0

1998

0-13-226119-7 0-13-456955-5 0-13-904947-9

2 1 2

1994 1998 1997

3 2 2

2-89377-061-4 2-89377-087-8 2-89377-145-9 2-89377-146-7 2-89377-147-5 2-89377-154-8 2-89377-158-0 2-89377-170-X 2-89377-171-8

2 4 1 1 1 4 2 1 5

1992 1996 1997 1997 1997 1999 1999 1999 1999

1 1 1 1 1 1 1 1 1

2-89377-172-6 2-89377-175-0 2-89377-176-9 2-89377-177-7 Figure 18.10

1 1 1 1

2000 2000 2000 2000

1 1 1 1

Les donnes de la table Titres de Livres.mdb.

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

895

La figure 18.11 nous fait voir les relations entre les tables de la base de donnes Livres.mdb. Le nom du champ en gras dsigne la cl primaire de la table. La cl primaire dune table caractrise sans quivoque chaque enregistrement de la table. Chaque enregistrement doit avoir une valeur de cl et cette valeur doit tre unique. Cest ce quon appelle la Rgle de lintgrit des entits. Les traits qui relient les tables correspondent aux relations. Considrons le trait entre les tables diteurs et Titres. lextrmit du trait sur la table diteurs, on peut voir le signe 1 et lextrmit du trait sur Titres le symbole infini. Linterprtation de ces symboles est celle-ci: pour chaque diteur dans la table diteurs il peut y avoir un nombre quelconque de titres dans la table Titres. Une telle relation porte le nom de relation un--plusieurs. Le champ IDditeur de la table Titres est appel cl secondaireparce que dans ce champ on trouve une valeur unique qui constitue la cl primaire dune autre table (par exemple IDditeur est la cl primaire de la table diteurs). Les cls secondaires sont spcifies au moment de la cration de la table. La cl secondaire aide respecter la Rgle de lintgrit rfrentielle: toute valeur dune cl secondaire doit se retrouver dans le champ de la cl primaire dune autre table. Les cls secondaires permettent aux informations tires de plusieurs tables dtre jointes ensemble des fins danalyse. Il existe une relation un--plusieurs entre une cl primaire et sa cl secondaire correspondante.

Erreur de programmation courante 18.1 Quand un champ est dsign comme la cl primaire, labsence dune valeur dans ce champ pour un enregistrement transgresse la Rgle de lintgrit des entits et constitue une erreur.
18.1

Figure 18.11

Les relations entre les tables de la base Livres.mdb.

Erreur de programmation courante 18.2 Quand un champ est dsign comme cl primaire, le fait que plusieurs enregistrements aient la mme valeur est une erreur.
18.2

Le trait qui relie les tables AuteursISBN et Auteurs traduit le fait quun mme auteur de la table Auteurs peut tre mis en correspondance avec une multitude de ISBN de livres dans la table AuteursISBN. Le champ IDAuteur de cette dernire table est une cl secondaire du champ IDAuteur de la table Auteurs. Cette table sert contenir les informations sur les liens entre les tables Titres et Auteurs.

896

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

Finalement, le trait entre les tables Titres et AuteursISBN illustre une relation un-plusieurs: un livre (titre) peut avoir plusieurs auteurs.

18.5 Langage de requte structur (SQL)


Dans cette section, nous vous dcrivons lessentiel du langage SQL (langage de requte structur) dans le contexte de la base de donnes exemple Livres.mdb, dj prsente dans ce chapitre. Vous serez en mesure de composer plus tard ces requtes SQL dans les exemples de ce chapitre. Les mots-cls dune requte SQL (figure 18.12) sont dcrits lors des requtes SQL intgrales effectues dans les sections suivantes. Sachez quil existe dautres mots-cls SQL dont lintrt dborde du cadre de ce livre. Remarque: pour en apprendre plus sur SQL, reportez-vous la bibliographie en fin de chapitre. Vous allez galement trouver beaucoup de renseignements au sujet de SQL sur lInternet.

18.5.1 Requte de base SELECT


prsent, envisageons la composition de plusieurs requtes SQL qui vont nous permettre dextraire des informations de la base de donnes Livres.mdb. Une requte SQL type slectionne des renseignements dune ou de plusieurs tables dune base de donnes. Pour rcuprer ces renseignements, on compose des requtes SELECT. Le format le plus simple dune requte SELECT est:
SELECT * FROM NomTable

Dans cette dernire requte, lastrisque(*) indique que lon veut obtenir les donnes de toutes les ranges et de toutes les colonnes dune table qui sappelle NomTable. Par exemple, pour slectionner le contenu intgral de la table diteurs (soit toutes les donnes de la figure 18.6), tapez:
SELECT * FROM diteurs

Pour slectionner des champs particuliers dune table, remplacez lastrisque (*) par une liste de noms de champ, spars par des virgules. Par exemple, pour rcuprer le IDAuteur et le Nom de famille dans la table Auteur, vous composez la requte:
SELECT IDAuteur, [Nom de famille] FROM Auteurs

Quelques rsultats de cette requte se trouvent la figure 18.13.

Observation du gnie logiciel 18.1 Si un nom de champ renferme des espaces, il doit tre encadr par des crochets ([]) dans la requte.
18.1

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

897

mot-cl SQL

Description

SELECT FROM WHERE GROUP BY HAVING ORDER BY Figure 18.12

Slectionne (rcupre) des valeurs de champ dune ou de plusieurs tables. Tables o se trouvent les champs. Obligatoire avec SELECT. Critre de slection qui dtermine les ranges rcuprer. Comment regrouper les enregistrements retrouvs. Accompagne la clause GROUP BY pour prciser les critres de groupement des enregistrements rsultants. Critre de rangement des enregistrements. Les mots-cls de requte SQL.

IDAuteur

Nom de famille

IDAuteur

Nom de famille

1 2 3 4 Figure 18.13

Deitel Deitel Nieto OLeary Quelques

4 5 6 7

Floyd Tocci Simond OLeary

IDAuteur et Nom de famille de la table Auteurs.

18.5.2 Clause WHERE


Souvent, il faut localiser dans une base de donnes des enregistrements qui rpondent un critre de slection. Seuls les enregistrements qui correspondent ce critre sont rcuprs. SQL possde la clause WHERE dans lordre SELECT pour spcifier le critre de slection de la requte. Le format le plus simple dune requte SELECT assortie dun critre de slection est:
SELECT * FROM NomTable WHERE critre

Par exemple, pour retrouver tous les champs de la table Auteurs dont lAnne de naissance de lauteur est suprieure ou gal 1960, composez:
SELECT * FROM Auteurs WHERE [Anne de naissance] > 1960

Notre base de donnes contient plusieurs personnes dans la table Auteurs, mais seuls deux dentre eux sont ns aprs 1960. Ce sont ces deux enregistrements que retourne la requte prcdente.

AuthorID

FirstName

LastName

YearBorn

2 3 Figure 18.14

Paul Tem

Deitel Nieto

1968 1969

Les auteurs de la table Auteurs, ns aprs 1960.

898

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

Astuce sur la performance 18.1 Le recours un critre de slection amliore la performance en restreignant le nombre denregistrements rcuprs.
18.1

La condition exprime dans la clause WHERE peut contenir les oprateurs <, >,<=, >=, =, <> et LIKE. Loprateur LIKE permet lvaluation de la correspondance un masque, une technique qui emploie les caractres gnriques astrisque (*) et point dinterrogation (?). Dans la correspondance un masque, SQL ne recherche que les chanes qui concordent avec le masque. Un astrisque (*) dans le masque signifie toutes les combinaisons de caractres possibles. Par exemple, la requte que voici rcupre les enregistrements de tous les auteurs dont le nom de famille commence par la lettre d.
SELECT * FROM Auteurs WHERE [Nom de famille] LIKE 'd*'

Remarquez les apostrophes de part et dautre du masque. La requte prcdente produit les deux enregistrements reproduits la figure 18.15, car nous avons dix-neuf auteurs dans notre base de donnes, mais seulement deux dont le nom de famille commence par la lettre d.
Astuce sur la portabilit 18.1 SQL fait la diffrence entre les majuscules et les minuscules dans certaines bases de donnes. Astuce sur la portabilit 18.2 Tous les systmes de bases de donnes ne reconnaissent pas loprateur LIKE. Bonne pratique de programmation 18.1 Par convention, les mots-cls SQL doivent tre crits en majuscules dans les systmes qui ne font pas la diffrence entre majuscules et minuscules, pour les faire ressortir dans la requte SQL.
18.1 18.2 18.1

Dans un masque, le point dinterrogation (?) signifie nimporte quel autre caractre cet endroit dans le masque. Par exemple,
SELECT * FROM Auteurs WHERE [nom de famille] LIKE '?i*'

est une requte qui demande que lon trouve dans la table Auteurs tous les auteurs dont la seconde lettre du nom de famille est un i. Une requte peut tre affine en autorisant tout caractre pris dans une certaine gamme se trouver dans une certaine position du masque. On spcifie ainsi une gamme de caractres:
[valeurDbut-valeurFin]

IDAuteur

Prnom

Nom de famille

Anne de naissance

1 2 Figure 18.15

Harvey Paul

Deitel Deitel

1946 1968

Les auteurs dela table Auteurs, dont le nom commence par un d.

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

899

IDAuteur

Prnom

Nom de famille

Anne de naissance

3 8 9 16 Figure 18.16

Tem Michle Colette Edward

Nieto Simond Michel Tittel

1969 1950 1955 1962

Les auteurs de la table Auteurs dont la deuxime lettre du nom de famille est un i.

o valeurDbut est le premier caractre de la gamme et valeurFin le dernier caractre de la gamme. Ainsi, la requte que voici retrouve dans la table Auteurs tous les auteurs dont la premire lettre est quelconque (ce quindique le ?), la seconde lettre est un caractre compris dans la gamme de a i (ce quindique[a-i]) et le reste est une chane quelconque de caractres (ce quindique *) :
SELECT * FROM Auteurs WHERE [nom de famille] LIKE '?[a-i]*'

La requte prcdente retourne dix auteurs de la table Auteurs (voyez la base de donnes sur le CD-ROM), parce que la deuxime lettre des noms de famille de ces dix auteurs est comprise entre a et i .

18.5.3 Clause ORDER BY


Les rsultats dune requte peuvent tre rangs par ordre croissant ou dcroissant si vous prcisez la clause facultative ORDER BY. Le format le plus simple de la clause ORDER BY est:
SELECT * FROM NomTable ORDER BY champ ASC SELECT * FROM NomTable ORDER BY champ DESC

o ASC signifie ordre croissant (du plus petit au plus grand) et DESC signifie ordre dcroissant (du plus grand au plus petit) et champ reprsente le champ que lon utilise pour effectuer le tri. Par exemple pour obtenir la liste des noms de famille des auteurs par ordre croissant (voyez figure 18.17), composez linterrogation qui suit :
SELECT * FROM Auteurs ORDER BY [Nom de famille] ASC

Sachez que la valeur de tri par dfaut est croissant, de sorte que ASC est facultatif. Pour obtenir la liste des noms de famille des auteurs par ordre dcroissant (voir figure 18.18), vous devez composer la requte suivante ;
SELECT * FROM Auteurs ORDER BY [nom de famille] DESC

IDAuteur

Prnom

Nom de famille

Anne de naissance

2 1 3 Figure 18.17

Paul Harvey Tem

Basken Deitel Nieto

1968 1946 1969

Trois premires entres de la liste des auteurs par ordre croissant du Nom de famille.

900

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

IDAuteur

Prnom

Nom de famille

Anne de naissance

12 4 16 Figure 18.18

Jean-Claude Ronald Edward

Vaudrin Tocci Tillel

1962 1944 1962

Trois premires entres de la table des du Nom de famille.

Auteurs par ordre dcroissant

On peut ranger avec la clause ORDER BY daprs plusieurs champs en utilisant le format :
ORDER BY champ1 OrdreTri, champ2 OrdreTri, ...

o OrdreTri est soit ASC ou DESC. Le paramtre OrdreTri nest pas obligatoirement identique pour tous les champs. La requte
SELECT * FROM Auteurs ORDER BY [Nom de famille], Prnom

trie par ordre croissant de nom de famille et par ordre croissant de prnom des auteurs. Donc, si deux auteurs ont le mme nom de famille, les enregistrements sont retourns tris par ordre croissant du prnom. Les clauses WHERE et ORDER BY peuvent tre couples en une seule requte. Lexemple de requte combine que voici,
SELECT * FROM Titres WHERE Titre LIKE '*2000*' ORDER BY Titre ASC

retourne tous les enregistrements de la table Titres dont le titre contient 2000 par ordre croissant du champ Titre. Voyez les rsultats de cette requte la figure 18.20 (pour des raisons despace nous avons omis la description). Remarque: quand nous composons une requte pour Java, nous crons simplement une longue chane englobant toute la requte. Dans les requtes de ce livre, nous utilisons plusieurs lignes et des retraits afin de faciliter la lecture.

18.5.4 Utilisation de INNER JOIN pour fusionner des donnes en provenance de plusieurs tables
Il nest pas rare que lon veuille fusionner des donnes provenant de plusieurs tables en une seule vue des fins danalyse. Cest ce quon appelle la jointure de tables et cest ce que ralise lopration INNER JOIN de la clause FROM de la requte SELECT. Un INNER JOIN fusionne des enregistrements de deux tables ou plus en recherchant les valeurs correspondantes dun champ commun toutes ces tables. Le format le plus lmentaire dune jointure est
SELECT * FROM Table1 INNER JOIN Table2 ON Table1.champ = Table2.champ

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

901

La partie ON de la clause INNER JOIN spcifie les champs de chaque table qui doivent tre compars quand on dtermine les enregistrements slectionner. Par exemple, pour fusionner les champs Prnom et Nom de famille de la table Auteurs avec le champ ISBN de la table AuteursISBN par ordre croissant du Nom de famille et ensuite du Prnom, afin de voir les numros ISBN de chaque livre crit par un auteur, vous crivez la requte:

IDAuteur

Prnom

Nom de famille

Anne de naissance

11 19 1 Figure 18.19

David Franois Harvey

Basken Basset Deitel

1953 1959 1946

Trois premires entres de la table Auteurs par ordre croissant de Nom de famille et de Prnom.

ISBN

Titre

dition

Anne de publication

IDditeur

2-89377-176-9 2-89377-172-6 2-89377-175-0 2-89377-177-7 Figure 18.20

Access 2000 Ofce 2000 Premium PowerPoint 2000 Word 2000

1 1 1 1

2000 2000 2000 2000

1 1 1 1

Les livres de la table Titres dont le titre contient la mention 2000 par ordre croissant du titre.

SELECT Prnom, [Nom de famille], ISBN FROM Auteurs INNER JOIN AuteursISBN ON Auteurs.IDAuteur = AuteursISBN.IDAuteur ORDER BY [Nom de famille], Prnom

Remarquez la syntaxe NomTable.NomChamp dans la partie ON de INNER JOIN. Cette syntaxe spcifie quel champ de chacune des tables il faut comparer pour raliser la jointure des tables. La syntaxe NomTable est obligatoire si les champs ont le mme nom dans les deux tables. La mme syntaxe peut tre employe chaque fois quil faut faire la distinction entre des champs de tables diffrentes qui ont le mme nom. Comme toujours, la clause FROM (qui regroupe INNER JOIN) peut tre suivie par les clauses WHERE et ORDER BY. La figure 18.21 montre les rsultats de cette dernire requte.

902

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

Prnom

Nom de famille

ISBN

Prnom

Nom de famille

ISBN

David Franois Harvey Harvey Harvey Harvey Harvey Paul Paul Paul Paul Paul Paul Paul Thomas Thomas Curt Kraige James Figure 18.21

Basken Basset Deitel Deitel Deitel Deitel Deitel Deitel Deitel Deitel Deitel Deitel Deitel Deitel Floyd Floyd Hudson Glen Meriam

2-89377-175-0 2-89377-172-6 0-13-226119-7 0-13-904947-9 0-13-083054-2 0-13-083055-0 2-89377-158-0 0-13-226119-7 2-89377-158-0 0-13-083055-0 0-13-083054-2 0-13-082925-0 0-13-456955-5 0-13-804947-9 2-89377-171-8 2-89377-154-8 2-89377-170-X 2-89377-087-8 2-89377-087-8

Franois Harvey Colette Colette Tem Tem Linda Linda Linda Timothy Timothy Timothy Simond Simond Steward Swanson Tittel Tocci

Basset Deitel Michel Michel Nieto Nieto OLeary OLeary OLeary OLeary OLeary OLeary Michle Michle Micheal Marie Edward Ronald

2-89377-176-9 0-13-456955-5 2-89377-172-6 2-89377-177-7 0-13-904947-9 0-13-456955-5 2-89377-146-7 2-89377-147-5 2-89377-145-9 2-89377-145-9 2-89377-147-5 2-89377-146-7 2-89377-175-0 2-89377-172-6 2-89377-170-X 2-89377-177-7 2-89377-170-X 2-89377-061-4

Les auteurs et les numros ISBN des livres quils ont crits par ordre croissant de Prnom et de Nom de famille.

18.5.5 La requte TitreAuteur de Livres.mdb


La base de donnes Livres.mdb renferme une requte dj compose (TitreAuteur) qui produit une table dont les en-ttes de colonne sont le titre du livre, le numro ISBN, le prnom de lauteur, le nom de famille de lauteur, lanne de publication et le nom de lditeur pour chacun des livres dans la base de donnes. Dans le cas des livres crits par plusieurs auteurs, la requte produit un enregistrement distinct pour chaque auteur. La requte TitreAuteur est reproduite la figure 18.22. La table construite par cette requte est reprise partiellement la figure 18.23.

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

903

1 2 3 4 5 6 7 8 9 10 11

SELECT Titres.Titre, Titres.ISBN, Auteurs.Prnom, Auteurs.[Nom de famille], Titres.AnnePublication, diteurs.Nomditeur FROM (diteurs INNER JOIN Titres ON diteurs.IDditeur = Titres.IDditeur) INNER JOIN (Auteurs INNER JOIN AuteursISBN ON Auteurs.IDAuteur = AuteursISBN.IDAuteur) ON Titres.ISBN = AuteursISBN.ISBN ORDER BY Titres.Titre La requte TitreAuteur de la base de donnes Livres.mdb.

Figure 18.22

Titre

ISBN

Prnom

Nom de famille

Anne Publication

Nomditeur

Access 2000 Access 97 Access 97 C How to Program C How to Program Circuits numriques Comment programmer en C++ Comment programmer en C++ lectronique, Composants et systmes dapplication Fondements dlectronique Java How to Program Instructors Manual with Solutions Java How to Program Instructors Manual with Solutions Figure 18.23

2-89377-176-9 2-89377-147-5 2-89377-147-5 0-13-226119-7 0-13-226119-7 2-89377-061-4 2-89377-158-0 2-89377-158-0 2-89377-171-8

Franois Linda Timothy Paul Harvey Ronald Harvey Paul Thomas

Basset OLeary OLeary Deitel Deitel Tocci Deitel Deitel Floyd

2000 1997 1997 1994 1994 1992 1999 1999 1999

ditions R. Goulet ditions R. Goulet ditions R. Goulet Prentice Hall PTR Prentice Hall PTR ditions R. Goulet ditions R. Goulet ditions R. Goulet ditions R. Goulet

2-89377-154-8 0-13-904947-9

Thomas Harvey

Floyd Deitel

1999 1997

ditions R. Goulet Prentice Hall

0-13-904947-9

Paul

Deitel

1997

Prentice Hall

Un extrait des rsultats de la requte TitreAuteur .

904

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

Les retraits introduits dans la requte prcdente ont simplement pour rle de faciliter la lecture de la requte. Dcomposons prsent la requte en ses principaux lments. Les lignes 1 3 indiquent les champs qui seront prsents dans les rsultats de la requte de gauche droite. Cette requte tire les champs Titre et ISBN de la table Titres, les champs Prnom et Nom de famille de la table Auteurs, le champ AnnePublication de la table Titres et le champ Nomditeur de la table diteurs. Pour les besoins de cette requte, nous avons qualifi chaque nom de champ avec le nom de sa table (comme Titres.ISBN). Les lignes 4 11 dfinissent des oprations de jointure interne (INNER JOIN) qui combinent les informations des tables. Remarquez les trois oprations INNER JOIN. Rappelez-vous quun INNER JOIN agit sur deux tables. Sachez que lune de ces deux tables peut tre le rsultat dune autre requte ou dun autre INNER JOIN. Des parenthses sont employes pour imbriquer des oprateurs INNER JOIN. Lopration la plus enfonce dans linstruction est value la premire. Nous commenons donc par linstruction
(diteurs INNER JOIN Titres ON diteurs.IDditeur = Titres.IDditeur)

qui stipule que la jointure de la table diteurs et de la table Titres se fera la condition (ON) que le numro IDditeur de chacune des tables concorde. La table rsultante temporaire contient les informations sur chaque livre et sur chaque diteur qui la publi. Passons lautre groupe de parenthses qui encadre une opration de jointure interne entre la table Auteurs et la table AuteursISBN:
(Auteurs INNER JOIN AuteursISBN ON Auteurs.IDAuteur = AuteursISBN.IDAuteur)

Cette opration INNER JOIN unit la table Auteurs et la table AuteursISBN la condition (ON) que le champ IDAuteur de la premire table concorde avec le champ IDAuteur de la seconde table. Rappelez-vous que la table AuteursISBN peut avoir plusieurs entres pour un mme ISBN si un livre a t crit par plusieurs auteurs. Ensuite, nous combinons les rsultats des deux oprations INNER JOIN prcdentes avec un dernier INNER JOIN
(diteurs INNER JOIN Titres ON diteurs.IDditeur = Titres.IDditeur) INNER JOIN (Auteurs INNER JOIN AuteursISBN ON Auteurs.IDAuteur = AuteursISBN.IDAuteur) ON Titres.ISBN = AuteursISBN.ISBN

qui regroupe les deux tables temporaires la condition (ON) que le champ Titres.ISBN de la premire table temporaire concorde avec le champ Auteurs.ISBN de la seconde table temporaire. Le rsultat de ces trois oprations INNER JOIN est une table temporaire dans laquelle sont slectionns les champs qui forment les rsultats de la requte. Finalement, la ligne 11
ORDER BY Titres.Titre

indique que les titres sont rangs par ordre croissant (le rangement par dfaut).

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

905

18.6 Un premier exemple


Dans cet exemple, nous allons composer une requte simple sur la base de donnes Livres.mdb qui retrouve les informations sur tous les auteurs de la table Auteurs et les affiche dans un composant JTable. Le programme de la figure 18.24 illustre de quelle faon on se connecte la base de donnes, on linterroge et on affiche les rsultats. La discussion qui suit cet exemple explique les principaux aspects JDBC du programme. La sous-section 18.6.1 illustre comment on inscrit la base de donnes en tant que source de donnes ODBC dans un ordinateur qui utilise Microsoft Windows comme systme dexploitation. Les tapes de la sous-section 18.6.1 doivent tre effectues avant dexcuter le programme de la figure 18.24.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 // Figure. 18.24: AfficherTable.java // Ce programme affiche le contenu de la table Auteurs // qui se trouve dans la base de donnes Livres. import java.sql.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class AfficherTable extends JFrame { private Connection connexion; private JTable table; public AfficherTable() { // Ladresse URL dsigne la base de donnes Livres // laquelle ce programme se raccorde en utilisant JDBC // pour se relier une base de donnes ODBC de Microsoft. String url = "jdbc:odbc:Livres"; String nomUtilisateur = "anonyme"; String motDePasse = "invit"; //Chargement du pilote qui assure la connexion la base de donnes. try { Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); connexion = DriverManager.getConnection( url, nomUtilisateur, motDePasse ); } catch ( ClassNotFoundException cnfex ) { System.err.println( "chec du chargement du pilote JDBC/ODBC." ); cnfex.printStackTrace(); System.exit( 1 ); // Terminer le programme. } catch ( SQLException sqlex ) { System.err.println( "Connexion impossible" ); sqlex.printStackTrace(); }

Figure 18.24

Connexion une base de donnes, requte sur cette base de donnes et affichage des rsultats. (1 de 4)

906

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

getTable(); setSize( 450, 150 ); show(); } private void getTable() { Statement instruction; ResultSet jeuResultats; try { String requete = "SELECT * FROM Auteurs"; instruction = connexion.createStatement(); jeuResultats = instruction.executeQuery( requete ); afficherJeuResultats( jeuResultats ); instruction.close(); } catch ( SQLException sqlex ) { sqlex.printStackTrace(); } } private void afficherJeuResultats( ResultSet rs ) throws SQLException { // On se place sur le premier enregistrement. boolean autresEnregistrements = rs.next(); // Aucun autre enregistrement, affichage dun message. if ( ! autresEnregistrements ) { JOptionPane.showMessageDialog( this, "Le jeu de rsultats ne contient aucun enregistrement" ); setTitle( "Aucun enregistrement afficher" ); return; } setTitle( "Table Auteurs de Livres" ); Vector enTeteColonne = new Vector(); Vector rangees = new Vector(); try { // Obtenir les en-ttes de colonne. ResultSetMetaData rsmd = rs.getMetaData(); for ( int i = 1; i <= rsmd.getColumnCount(); ++i ) enTeteColonne.addElement( rsmd.getColumnName( i ) );

Figure 18.24

Connexion une base de donnes, requte sur cette base de donnes et affichage des rsultats. (2 de 4)

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

907

91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141

// Obtenir les donnes des ranges. do { rangees.addElement( getrangeeSuivante( rs, rsmd ) ); } while ( rs.next() ); // Affichage dune table dont le contenu est le jeu de rsultats. table = new JTable( rangees, enTeteColonne ); JScrollPane defiler = new JScrollPane( table ); getContentPane().add( defiler, BorderLayout.CENTER ); validate(); } catch ( SQLException sqlex ) { sqlex.printStackTrace(); } } private Vector getrangeeSuivante( ResultSet rs, ResultSetMetaData rsmd ) throws SQLException { Vector rangeeCourante = new Vector(); for ( int i = 1; i <= rsmd.getColumnCount(); ++i ) switch( rsmd.getColumnType( i ) ) { case Types.VARCHAR: rangeeCourante.addElement( rs.getString( i ) ); break; case Types.INTEGER: rangeeCourante.addElement( new Long( rs.getLong( i ) ) ); break; default: System.out.println( "Le type tait: " + rsmd.getColumnTypeName( i ) ); } return rangeeCourante; } public void terminer() { try { connexion.close(); } catch ( SQLException sqlex ) { System.err.println( "Dconnexion impossible" ); sqlex.printStackTrace(); } }

Figure 18.24

Connexion une base de donnes, requte sur cette base de donnes et affichage des rsultats. (3 de 4)

908

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 }

public static void main( String args[] ) { final AfficherTable application = new AfficherTable(); application.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) { application.terminer(); System.exit( 0 ); } } ); }

Figure 18.24

Connexion une base de donnes, requte sur cette base de donnes et affichage des rsultats. (4 de 4)

La ligne 4 importe le package java.sql qui contient les classes et les interfaces ddies la manipulation des bases de donnes relationnelles dans Java. La ligne 11 dclare une rfrence la classe Connection appele connexion. Un objet Connection gre la connexion entre le programme Java et la base de donnes. Elle procure galement le support lexcution des instructions SQL qui manipulent la base de donnes, ainsi quau traitement des donnes. Le constructeur de la classe AfficherTable (ligne 14) cherche se connecter la base de donnes. Sil russit, il interroge la base de donnes et affiche les rsultats en appelant la mthode getTable (dfinie la ligne 47). Les lignes 19 21
String url = "jdbc:odbc:Livres"; String nomUtilisateur = "anonyme"; String motDePasse = "invit";

prcisent ladresse URL (Uniform Resource Locator) de la base de donnes qui indique au programme o il va trouver la base de donnes (sans doute dans un rseau ou dans un rpertoire du disque local de lordinateur), le nomUtilisateur qui ouvre laccs la base de donnes et le motDePasse qui sert aussi ouvrir laccs la base de donnes. LURL dsigne le protocole de communication (jdbc), le sous-protocole de communication (odbc) et le nom de la base de donnes (Livres). Le sous-protocole odbc signale que le programme utilisera jdbc pour se connecter une source de donnes ODBC de Microsoft (nous expliquons la section 18.6.1 la faon de configurer la source de donnes). ODBC est une technologie dveloppe par Microsoft qui permet un accs gnralis diffrents systmes de base de donnes sur la plate-forme Windows (et sur certaines plates-formes UNIX). Le Kit de dveloppement logiciel Java 2 (J2SDK) contient un pilote pont de JDBC ODBC qui permet un programme Java daccder une source de donnes ODBC. Ce pilote est dfini par la classe JdbcOdbcDriver du package sun.jdbc.odbc.

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

909

La dfinition de classe du pilote de base de donnes doit tre charge avant la connexion la base de donnes. La ligne 25
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );

a recours la mthode static intitule forName de la classe Class (du package java.lang) pour charger la dfinition de classe du pilote de base de donnes (cette ligne lance une exception java.lang.ClassNotFoundException si le classe est introuvable). Remarquez que linstruction prcise les noms complets du package et de la classe: sun.jdbc.odbc.JdecOdbcDriver.
Observation du gnie logiciel 18.2 Les principaux diteurs de bases de donnes fournissent leurs propres pilotes JDBC, et plusieurs diteurs tiers proposent aussi des pilotes JDBC.
18.2

Pour plus dinformations sur les pilotes JDBC et les bases de donnes prises en charge, allez sur le site Web JDBC de Sun Microsystems:
http://java.sun.com/products/jdbc/

Les lignes 26 et 27
connexion = DriverManager.getConnection( url, nomUtilisateur, motDePasse );

font usage dune mthode static appele getConnection de la classe DriverManager (du package java.sql) pour tenter dtablir une connexion avec la base spcifie par ladresse url. Les arguments nomUtilisateur et motDePasse sont passs dans ces lignes, parce que nous avons dlibrment configurer la base de donnes pour que lutilisateur doive sy connecter. des fins de dmonstration, nous avons choisi comme nom dutilisateur le mot anonyme et comme mot de passe invit. Si la classe DriverManager ne parvient pas se connecter la base de donnes, la mthode getConnection lve une exception Java.sql.SQLException. Si la tentative de connexion russit, la ligne 41 appelle une mthode utilitaire getTable (dfinie la ligne 47) qui sert rcuprer des donnes de la table Auteurs. La mthode utilitaire getTable interroge la base de donnes et appelle ensuite la mthode utilitaire displayResultSet pour crer une JTable (package javax.swing) qui renferme les rsultats de cette interrogation ou requte. La ligne 49 dclare une rfrence Statement (package java.sql), appele instruction, qui dsigne un objet implmentant linterface Statement. Cet objet soumet la requte la base de donnes. La ligne 50 dclare une rfrence ResultSet (package java.sql), appele jeuResultats, qui dsigne un objet implmentant linterface ResultSet. Quand une requte portant sur une base de donnes est excute, un objet ResultSet est retourn pour encapsuler les rsultats de la requte. Les mthodes de linterface ResultSet permettent un programmeur de manipuler les rsultats de la requte. La ligne 53 dfinit la requte voulue. Dans cet exemple, nous slectionnons tous les enregistrements figurant dans la table Auteurs. La ligne 55
instruction = connexion.createStatement();

invoque la mthode createStatement de la classe Connection pour obtenir un objet qui implmente linterface Statement. Vous pouvez prsent vous servir de lobjet instruction pour interroger la base de donnes. La ligne 56
jeuResultats = instruction.executeQuery( requete );

910

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

effectue la requte par lappel de la mthode executeQuery de la classe Statement. Cette mthode retourne un objet qui implmente linterface ResultSet et renferme les rsultats de la requte. Lobjet ResultSet est pass la mthode afficherJeuResultats (dfinie la ligne 65), puis linstruction est ferme la ligne 58 pour signifier que le traitement de la requte est termin. La ligne 69 de la mthode afficherJeuResultat:
boolean autresEnregistrements = rs.next();

place le curseur sur le premier enregistrement dans lobjet ResultSet en employant la mthode next de ResultSet. Au dbut, la position du curseur dans ResultSet est devant le premier enregistrement; il faut donc appeler cette mthode pour pouvoir accder aux rsultats. La mthode next retourne un boolen qui indique sil est possible de se placer sur lenregistrement suivant. Si lvaluation de la mthode retourne faux, il ny a plus de nouveaux enregistrements traiter. Au contraire, sil y a des enregistrements, la ligne 81 dfinit un Vector pour contenir les ranges de donnes de lobjet ResultSet. Ces Vector sont employs conjointement avec le constructeur JTable pour produire une JTable qui affiche les donnes de ResultSet. La ligne 86
ResultSetMetaData rsmd = rs.getMetaData();

obtient la mtadonne du ResultSet et lui attribue une rfrence de type ResultSet MetaData (package java.sql). La mtadonne de ResultSet dcrit le contenu dun ResultSet. Cette information peut tre exploite en programmation pour obtenir les noms et les types des colonnes de ResultSet et peut aider un programmeur traiter dynamiquement un ResultSet lorsque les dtails de ce ResultSet ne sont pas connus avant la requte. Nous nous servons de ResultSetMetaData aux lignes 88 et 89 pour rcuprer les noms de chaque colonne dans le ResultSet. La mthode getColumnCount de ResultSetMetaData retourne le nombre de colonnes dans ResultSet et la mthode getColName de ResultSetMetaData retourne le nom de la colonne prcise. Les lignes 92 94
do { rangee.addElement( getRangeeSuivante( rs, rsmd ) ); } while ( rs.next() );

rcuprent chaque range de ResultSet en employant la mthode getRangeeSuivante (dfinie la ligne 108). Cette mthode retourne un Vector qui contient les donnes dune range de ResultSet. Remarquez la condition rs.next(). Celle-ci dplace le curseur de ResultSet, qui marque lenregistrement courant dans ResultSet, sur lenregistrement suivant de cet objet. Rappelez-vous que la mthode next retourne un boolen faux quand il ny a plus dautre enregistrement dans le ResultSet. En consquence, la boucle prend fin quand il ny a plus dautre enregistrement. Aprs la conversion de toutes les ranges en Vector, la ligne 97 cre le composant dinterface utilisateur JTable qui affiche les enregistrements de ResultSet. Le constructeur retenu dans ce programme a deux arguments. Le premier est un Vector dobjets Vector (une sorte de tableau deux indices) qui renferme toutes les donnes des ranges. Le second argument est un Vector qui regroupe les noms de chacune des colonnes. Le constructeur JTable utilise ces deux Vector pour garnir la table. La mthode getRangeeSuivante (ligne 108) reoit un objet ResultSet et son ResultSetMetaData correspondant en tant quarguments, puis cre un Vector qui renferme une range de donnes de ResultSet. La structure for de la ligne 114 parcourt chaque colonne du jeu de rsultats et excute la structure switch de la ligne 115 pour dterminer le type des

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

911

donnes de la colonne. La mthode getColumnType de ResultSetMetaData retourne une constante entire de la classe Types (package java.sql) qui prcise le type des donnes. Les seuls types de notre base de donnes sont des chanes et des entiers longs. Le type SQL pour les chanes est Types.VARCHAR et le type SQL pour les entiers longs est Types.INTEGER. La ligne 117 a recours la mthode getString de ResultSet pour obtenir la chane dune colonne de type Types.VARCHAR. Les lignes 120 et 121 utilisent la mthode getLong pour obtenir lentier long dune colonne de type Types.INTEGER. La mthode terminer la ligne 131 ferme la connexion avec la base de donnes en se servant de la mthode close (ligne 134) de la classe Connection.

18.6.1 Enregistrer Livres.mdb en tant que source de donnes ODBC


Dans lexemple prcdent, nous avons prsum que la base Livres.mdb tait dj enregistre comme une source de donnes ODBC. La section que voici illustre comme sy prendre pour configurer une source ODBC sur un ordinateur exploit par Windows de Microsoft. Remarque: il est essentiel que vous disposiez sur votre ordinateur du logiciel Access de Microsoft. Pour vous connecter la base de donnes, vous devez enregistrer une source de donnes ODBC au moyen de loption Sources de donnes ODBC du Panneau de configuration de Windows. Cliquez deux fois sur licne correspondante pour afficher la bote de dialogue Administrateur de source de donnes ODBC (figure 18.25). Vous vous servez de cette bote de dialogue pour enregistrer votre Nom de source de donnes utilisateur. Assurez-vous que longlet DSN utilisateur est lavant, puis cliquez sur le bouton Ajouter... pour afficher la bote de dialogue Crer une nouvelle source de donnes (figure 18.26). tant donn que nous disposons dune base de donnes Microsoft Access, nous devons slectionner un pilote Microsoft Access Driver. Cliquez ensuite sur le bouton Terminer.

Figure 18.25

La bote de dialogue Administrateur de source de donnes ODBC.

912

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

Figure 18.26

La bote de dialogue Crer une nouvelle source de donnes.

Ceci fait apparatre la bote de dialogue Installation ODBC pour Microsoft Access (figure 18.27). Nous entrons le nom (Livres), soit le nom utilis pour dsigner la base de donnes avec JDBC, dans la zone de texte Nom de source de donnes. Nous pouvons aussi, si le cur nous en dit, taper une description. Cliquez sur le bouton Slectionner... pour afficher la bote de dialogue Slectionner la base de donnes et pour revenir la bote Installation ODBC pour Microsoft Access. Cliquez ensuite sur le bouton Options avances... pour ouvrir la bote de dialogue Initialisation des options avances. Tapez comme nom dutilisateur anonyme et comme mot de passe invit dans les champs en haut gauche de cette bote, puis cliquez sur OK pour fermer cette bote. Cliquez de nouveau sur OK pour fermer la bote de dialogue Installation ODBC pour Microsoft Access.

Figure 18.27

La bote de dialogue Installation ODBC pour Microsoft Access.

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

913

Notez que la bote de dialogue Administrateur de source de donnes ODBC contient prsent la source de donnes Livres (figure 18.28). Cliquez sur OK pour fermer cette bote de dialogue. Vous tes dsormais prt accder la source de donnes ODBC par lintermdiaire du pont JDBC ODBC. Excutez le programme de la figure 18.24 en vue dafficher la table des Auteurs de la base de donnes Livres.mdb.

18.6.2 Interroger la base de donnes Livres.mdb


Lexemple de la figure 18.29 vient complter lexemple de la figure 18.24 en proposant un programme qui permet de composer une requte quelconque. Ds que lutilisateur enfonce le bouton Soumettre requte, la mthode ActionPerformed (ligne 58) invoque une mthode utilitaire getTable (dfinie la ligne 85) pour effectuer la requte et afficher les rsultats. La saisie dcran fait voir une requte qui retrouve tous les titres de la table Titres en mettant en correspondance leurs diteur, tirs de la table diteurs. Essayez de composer vos propres requtes.

Figure 18.28 1 2 3 4 5 6 7 8 9 10 11 12 13 14

La bote de dialogue Administrateur de source de donnes ODBC montrant les pilotes enregistrs.

// Figure 18.29: AfficherResultatsDeRequete.java // Ce programme affiche le jeu de rsultats produit par une requte // portant sur la base de donnes Livres. import java.sql.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class AfficherResultatsDeRequete extends JFrame { // Les types java.sql ncessaires au traitement de la base de donnes. private Connection connexion; private Statement instruction; private ResultSet jeuResultats; Soumettre des requtes la base de donnes Livres.mdb. (1 de 5)

Figure 18.29

914

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67

private ResultSetMetaData rsMetaData; // Les types javax.swing ncessaires linterface utilisateur. private JTable table; private JTextArea entreeRequete; private JButton soumettreRequete; public AfficherResultatsDeRequete() { super("Entrer la requte. Cliquez sur Soumettre pour visualiser "+
"les rsultats.");

// Ladresse URL indique la base de donnes Livres // laquelle ce programme se raccorde en utilisant JDBC // pour se relier une base de donnes ODBC de Microsoft. String url = "jdbc:odbc:Livres"; String nomUtilisateur = "anonyme"; String motDePasse = "invit"; // Chargement du pilote qui tablit la connexion avec la base de // donnes. try { Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); connexion = DriverManager.getConnection( url, nomUtilisateur, motDePasse ); } catch ( ClassNotFoundException cnfex ) { System.err.println( "Impossible de charger le pilote JDBC/ODBC." ); cnfex.printStackTrace(); System.exit( 1 ); // Fin du programme. } catch ( SQLException sqlex ) { System.err.println( "Connexion impossible" ); sqlex.printStackTrace(); System.exit( 1 ); // Fin du programme. } // Si la connexion la base se fait, configurer un GUI. entreeRequete = new JTextArea( "SELECT * FROM Auteurs", 4, 30 ); soumettreRequete = new JButton( "Soumettre requte" ); soumettreRequete.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { if ( e.getSource() == soumettreRequete ) getTable(); } } ); JPanel voletHaut = new JPanel(); voletHaut.setLayout( new BorderLayout() ); Soumettre des requtes la base de donnes Livres.mdb. (2 de 5)

Figure 18.29

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

915

68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119

voletHaut.add( new JScrollPane( entreeRequete), BorderLayout.CENTER ); voletHaut.add( soumettreRequete, BorderLayout.SOUTH ); table = new JTable( 4, 4 ); Container c = getContentPane(); c.setLayout( new BorderLayout() ); c.add( voletHaut, BorderLayout.NORTH ); c.add( table, BorderLayout.CENTER ); getTable(); setSize( 500, 500 ); show(); } private void getTable() { try { String requete = entreeRequete.getText(); instruction = connexion.createStatement(); jeuResultats= instruction.executeQuery( requete ); afficherJeuResultats( jeuResultats ); } catch ( SQLException sqlex ) { sqlex.printStackTrace(); } } private void afficherJeuResultats( ResultSet rs ) throws SQLException { // Placer le curseur sur le premier enregistrement. boolean autresEnregistrements = rs.next(); // Sil ny a pas dautres enregistrements, afficher un message. if ( ! autresEnregistrements ) { JOptionPane.showMessageDialog( this, "Le jeu de rsultats ne contient aucun enregistrement" ); setTitle( "Aucun enregistrement afficher" ); return; } Vector enTeteColonne = new Vector(); Vector rangee = new Vector(); try { // Obtenir les en-ttes de colonne. ResultSetMetaData rsmd = rs.getMetaData();

Figure 18.29

Soumettre des requtes la base de donnes Livres.mdb. (3 de 5)

916

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171

for ( int i = 1; i <= rsmd.getColumnCount(); ++i ) enTeteColonne.addElement( rsmd.getColumnName( i ) ); // obtenir les donnes des lignes. do { rangee.addElement( getRangeeSuivante( rs, rsmd ) ); } while ( rs.next() ); // Afficher dans la table le contenu du jeu de rsultats. table = new JTable( rangee, enTeteColonne ); JScrollPane defileur = new JScrollPane( table ); Container c = getContentPane(); c.remove( 1 ); c.add( defileur, BorderLayout.CENTER ); c.validate(); } catch ( SQLException sqlex ) { sqlex.printStackTrace(); } } private Vector getRangeeSuivante( ResultSet rs, ResultSetMetaData rsmd ) throws SQLException { Vector rangeeCourante = new Vector(); for ( int i = 1; i <= rsmd.getColumnCount(); ++i ) switch( rsmd.getColumnType( i ) ) { case Types.VARCHAR: case Types.LONGVARCHAR: rangeeCourante.addElement( rs.getString( i ) ); break; case Types.INTEGER: rangeeCourante.addElement( new Long( rs.getLong( i ) ) ); break; default: System.out.println( "Le type tait : " + rsmd.getColumnTypeName( i ) ); } return rangeeCourante; } public void terminer() { try { connexion.close(); } catch ( SQLException sqlex ) { System.err.println( "Dconnexion impossible" ); Soumettre des requtes la base de donnes Livres.mdb. (4 de 5)

Figure 18.29

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

917

172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 }

sqlex.printStackTrace(); } } public static void main( String args[] ) { final AfficherResultatsDeRequete application = new AfficherResultatsDeRequete(); application.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) { application.terminer(); System.exit( 0 ); } } ); }

Figure 18.29

Soumettre des requtes la base de donnes Livres.mdb. (5 de 5)

18.7 Lire, insrer et mettre jour une base de donnes Microsoft Access
Dans notre prochain exemple (figure 18.30), nous allons manipuler une base de donnes simple et monotable de Microsoft Access, appele CarnetAdresses qui contient une table (adresses) de 11 colonnes dont les titres sont Identit (un entier long exclusif associ chaque personne du carnet dadresses), Prnom, Nom, Adresse, Ville, tatouProvince, Code postal, Pays,

918

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

Courriel, Tlphone domicile et Tlcopieur. Les champs autres que Identit sont tous de type Texte. Le programme ralise les fonctions dajout de nouveaux enregistrements, de mise jour des enregistrements existants et de recherche dans la base de donnes. Comme prcdemment, nous crons la base de donnes en tant que source ODBC et nous y accdons avec notre programme Java par le biais du pont JDBC-ODBC.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

// Figure 18.30: CarnetAdresses.java // Insrer, mettre jour et rechercher des enregistrements. import java.sql.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class CarnetAdresses extends JFrame { private VoletControles controles; private VoletParcourir zoneParcourir; private JTextArea sortie; private String url; private Connection connecter; private JScrollPane voletTexte; public CarnetAdresses() { super( "Base de donnes Carnet dadresses" ); Container c = getContentPane(); // Dbut de la mise en forme de lcran. zoneParcourir = new VoletParcourir(); sortie = new JTextArea( 6, 30 ); c.setLayout( new BorderLayout() ); c.add( new JScrollPane( zoneParcourir ), BorderLayout.CENTER ); voletTexte = new JScrollPane( sortie ); c.add( voletTexte, BorderLayout.SOUTH ); // tablir la connexion avec la base de donnes. try { url = "jdbc:odbc:CarnetAdresses"; Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); connecter = DriverManager.getConnection( url ); sortie.append( "Connexion russie\n" ); } catch ( ClassNotFoundException cnfex ) { // Traiter ici les ClassNotFoundExceptions. cnfex.printStackTrace(); sortie.append( "Connexion impossible\n" + cnfex.toString() ); } Insrer, rechercher et mettre jour des enregistrements. (1 de 16)

Figure 18.30

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

919

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79

catch ( SQLException sqlex ) { // Traiter ici les SQLExceptions. sqlex.printStackTrace(); sortie.append( "Connexion impossible\n" + sqlex.toString() ); } catch ( Exception ex ) { // Traiter ici les exceptions restantes. ex.printStackTrace(); sortie.append( ex.toString() ); } // Fin de la mise en forme de lcran. controles = new VoletControles( connecter, zoneParcourir, sortie); c.add( controles, BorderLayout.NORTH ); setSize( 500, 500 ); show(); } public static void main( String args[] ) { CarnetAdresses application = new CarnetAdresses(); application.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) { System.exit( 0 ); } } ); } } Insrer, rechercher et mettre jour des enregistrements. (2 de 16)

Figure 18.30

80 81 82 83 84 85 86 87 88 89 90 91

// Figure 18.30: AjouterEnregistrement.java // Dfinition de la classe AjouterEnregistrement. import java.awt.*; import java.awt.event.*; import java.sql.*; import javax.swing.*; public class AjouterEnregistrement implements ActionListener { private VoletParcourir champs; private JTextArea sortie; private Connection connexion;

Figure 18.30

Insrer, rechercher et mettre jour des enregistrements. (3 de 16)

920

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142

public AjouterEnregistrement( Connection c, VoletParcourir f, JTextArea o ) { connexion = c; champs = f; sortie = o; } public void actionPerformed( ActionEvent e ) { try { Statement ordre = connexion.createStatement(); if ( !champs.nom.getText().equals( "" ) && !champs.prenom.getText().equals( "" ) ) { String requete = "INSERT INTO adresses (" + "prnom, nom, adresse, ville, " + "tatouprovince, [Code postal], pays, " + "courriel, [tlphone domicile], tlcopieur" + ") VALUES ('" + champs.prenom.getText() + "', '" + champs.nom.getText() + "', '" + champs.adresse.getText() + "', '" + champs.ville.getText() + "', '" + champs.etat.getText() + "', '" + champs.codepostal.getText() + "', '" + champs.pays.getText() + "', '" + champs.courriel.getText() + "', '" + champs.telephone.getText() + "', '" + champs.telecopieur.getText() + "')"; sortie.append( "\nEnvoi de la requte: " + connexion.nativeSQL( requete ) + "\n" ); int resultat = ordre.executeUpdate( requete ); if ( resultat == 1 ) sortie.append( "\nAjout russi\n" ); else { sortie.append( "\nAjout non russi\n" ); champs.prenom.setText( "" ); champs.nom.setText( "" ); champs.adresse.setText( "" ); champs.ville.setText( "" ); champs.etat.setText( "" ); champs.codepostal.setText( "" ); champs.pays.setText( "" ); champs.courriel.setText( "" ); champs.telephone.setText( "" ); champs.telecopieur.setText( "" ); } } Insrer, rechercher et mettre jour des enregistrements. (4 de 16)

Figure 18.30

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

921

143 144 145 146 147 148 149 150 151 152 153 154 }

else sortie.append( "\nEntrez au moins le prnom et le" + " nom, puis enfoncez Ajouter\n" ); ordre.close(); } catch ( SQLException sqlex ) { sqlex.printStackTrace(); sortie.append( sqlex.toString() ); } }

Figure 18.30

Insrer, rechercher et mettre jour des enregistrements. (5 de 16)

155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190

// Figure 18.30: TrouverEnregistrement.java // Dfinition de la classe TrouverEnregistrement. import java.awt.*; import java.awt.event.*; import java.sql.*; import javax.swing.*; public class TrouverEnregistrement implements ActionListener { private VoletParcourir champs; private JTextArea sortie; private Connection connexion; public TrouverEnregistrement( Connection c, VoletParcourir f, JTextArea o ) { connexion = c; champs = f; sortie = o; } public void actionPerformed( ActionEvent e ) { try { if ( !champs.nom.getText().equals( "" ) ) { Statement ordre = connexion.createStatement(); String requete = "SELECT * FROM Adresses " + "WHERE nom = '" + champs.nom.getText() + "'"; sortie.append( "\nLancement de la requte : " + connexion.nativeSQL( requete ) + "\n" ); ResultSet rs = ordre.executeQuery( requete ); afficher( rs ); sortie.append( "\nRequte russie\n" ); ordre.close(); } Insrer, rechercher et mettre jour des enregistrements. (6 de 16)

Figure 18.30

922

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 }

else champs.nom.setText( "Entrez le nom ici, puis appuyez sur Trouver" ); } catch ( SQLException sqlex ) { sqlex.printStackTrace(); sortie.append( sqlex.toString() ); } } // Afficher les rsultats de la requte. Si rs nest pas 0. public void afficher( ResultSet rs ) { try { rs.next(); int numeroEnregistrement = rs.getInt( 1 ); if ( numeroEnregistrement != 0 ) { champs.identite.setText( String.valueOf( numeroEnregistrement)); champs.prenom.setText( rs.getString( 2 ) ); champs.nom.setText( rs.getString( 3 ) ); champs.adresse.setText( rs.getString( 4 ) ); champs.ville.setText( rs.getString( 5 ) ); champs.etat.setText( rs.getString( 6 ) ); champs.codepostal.setText( rs.getString( 7 ) ); champs.pays.setText( rs.getString( 8 ) ); champs.courriel.setText( rs.getString( 9 ) ); champs.telephone.setText( rs.getString( 10 ) ); champs.telecopieur.setText( rs.getString( 11 ) ); } else sortie.append( "\nAucun enregistrement trouv\n" ); } catch ( SQLException sqlex ) { sqlex.printStackTrace(); sortie.append( sqlex.toString() ); } }

Figure 18.30 231 232 233 234 235 236 237 238 239

Insrer, rechercher et mettre jour des enregistrements. (7 de 16)

// Figure 18.30: MAJEnregistrement.java // Dfinition de la classe MAJEnregistrement. import java.awt.*; import java.awt.event.*; import java.sql.*; import javax.swing.*; public class MAJEnregistrement implements ActionListener { private VoletParcourir champs; Insrer, rechercher et mettre jour des enregistrements. (8 de 16)

Figure 18.30

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

923

240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291

private JTextArea sortie; private Connection connexion; public MAJEnregistrement( Connection c, VoletParcourir f, JTextArea o ) { connexion = c; champs = f; sortie = o; } public void actionPerformed( ActionEvent e ) { try { Statement ordre = connexion.createStatement(); if ( ! champs.identite.getText().equals( "" ) ) { String requete = "UPDATE Adresses SET " + "prnom='" + champs.prenom.getText() + "', nom='" + champs.nom.getText() + "', adresse='" + champs.adresse.getText() + "', ville='" + champs.ville.getText() + "', tatouprovince='" + champs.etat.getText() + "', [Code postal]='" + champs.codepostal.getText() + "', pays='" + champs.pays.getText() + "', courriel ='" + champs.courriel.getText() + "', '" + "[tlphone domicile]='" + champs.telephone.getText() + "', tlcopieur ='" + champs.telecopieur.getText() + "' WHERE identit =" + champs.identite.getText(); sortie.append( "\nEnvoi de la requte : " + connexion.nativeSQL( requete ) + "\n" ); int resultat = ordre.executeUpdate( requete ); if ( resultat == 1 ) sortie.append( "\nMise jour russie\n" ); else { sortie.append( "\nchec de la mise jour\n" ); champs.prenom.setText( "" ); champs.nom.setText( "" ); champs.adresse.setText( "" ); champs.ville.setText( "" ); champs.etat.setText( "" ); champs.codepostal.setText( "" ); champs.pays.setText( "" ); champs.courriel.setText( "" ); champs.telephone.setText( "" ); champs.telecopieur.setText( "" ); }

Figure 18.30 292

Insrer, rechercher et mettre jour des enregistrements. (9 de 16) }

924

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 }

else sortie.append( "\nVous ne pouvez mettre jour quun" + " enregistrement existant. Avec Trouver," + " localisez lenregistrement, puis" + " modifiez les renseignements et" + " pressez Modifier.\n" ); ordre.close(); } catch ( SQLException sqlex ) { sqlex.printStackTrace(); sortie.append( sqlex.toString() ); } }

Figure 18.30 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333

Insrer, rechercher et mettre jour des enregistrements. (10 de 16)

// Figure 18.30: Aide.java // Dfinition de la classe Aide.java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Aide implements ActionListener { private JTextArea sortie; public Aide( JTextArea o ) { sortie = o; } public void actionPerformed( ActionEvent e ) { sortie.append( "\nCliquez sur Trouver pour localiser un" + " enregistrement. \nCliquez sur Ajouter pour insrer" + " un nouvel enregistrement. \nCliquez sur Modifier" + " pour actualiser les informations dans un" + " enregistrement.\n" + "Cliquez sur Vider pour effacer" + " les champs.\n" ); } } Insrer, rechercher et mettre jour des enregistrements. (11 de 16)

Figure 18.30 334 335 336 337 338 339 340 341

// Figure 18.30: VoletControles.java // Dfinition de la classe VoletControles. import java.awt.*; import java.awt.event.*; import java.sql.*; import javax.swing.*; public class VoletControles extends JPanel { Insrer, rechercher et mettre jour des enregistrements. (12 de 16)

Figure 18.30

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

925

342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 }

private JButton nomTrouver, nomAjouter, nomMAJ, vider, aide; public VoletControles( Connection c, VoletParcourir s, JTextArea t ) { setLayout( new GridLayout( 1, 5 ) ); nomTrouver = new JButton( "Trouver" ); nomTrouver.addActionListener( new TrouverEnregistrement( c,s,t) ); add( nomTrouver ); nomAjouter = new JButton( "Ajouter" ); nomAjouter.addActionListener( new AjouterEnregistrement( c,s,t) ); add( nomAjouter ); nomMAJ = new JButton( "Modifier" ); nomMAJ.addActionListener( new MAJEnregistrement( c, s, t ) ); add( nomMAJ ); vider = new JButton( "Vider" ); vider.addActionListener( new ViderChamps( s ) ); add( vider ); aide = new JButton( "Aide" ); aide.addActionListener( new Aide( t ) ); add( aide ); }

Figure 18.30

Insrer, rechercher et mettre jour des enregistrements. (13 de 16)

372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388

// Figure 18.30: VoletParcourir.java // Classe VoletParcourir. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class VoletParcourir extends JPanel { private JPanel voletEtiquettes, voletChamps; private String etiquettes[] = { "Identit:", "Prnom:", "Nom:", "Adresse:", "Ville :", "tat/Province:", "Code postal :", "Pays :", "Courriel:", "Tlphone domicile:", "Tlcopieur :" }; JTextField identite, prenom, nom, adresse, // Accs au package. ville, etat, codepostal, pays, courriel, telephone, telecopieur;

Figure 18.30

Insrer, rechercher et mettre jour des enregistrements. (14 de 16)

926

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 }

public VoletParcourir() { // Le volet des tiquettes. voletEtiquettes = new JPanel(); voletEtiquettes.setLayout( new GridLayout( etiquettes.length, 1 ) ); ImageIcon ii = new ImageIcon( "images/icone.gif" ); for ( int i = 0; i < etiquettes.length; i++ ) voletEtiquettes.add( new JLabel( etiquettes[ i ], ii, 0) ); // Volet des champs de texte. voletChamps = new JPanel(); voletChamps.setLayout( new GridLayout( etiquettes.length, 1 ) ); identite = new JTextField( 20 ); identite.setEditable( false ); voletChamps.add( identite ); prenom = new JTextField( 20 ); voletChamps.add( prenom ); nom = new JTextField( 20 ); voletChamps.add( nom ); adresse = new JTextField( 20 ); voletChamps.add( adresse ); ville = new JTextField( 20 ); voletChamps.add( ville ); etat = new JTextField( 20 ); voletChamps.add( etat ); codepostal = new JTextField( 20 ); voletChamps.add( codepostal ); pays = new JTextField( 20 ); voletChamps.add( pays ); courriel = new JTextField( 20 ); voletChamps.add( courriel ); telephone = new JTextField( 20 ); voletChamps.add( telephone ); telecopieur = new JTextField( 20 ); voletChamps.add( telecopieur ); setLayout( new GridLayout( 1, 2 ) ); add( voletEtiquettes ); add( voletChamps ); }

Figure 18.30

Insrer, rechercher et mettre jour des enregistrements. (15 de 16)

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

927

434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462

// Figure 18.30: ViderChamps.java // Dfinition de la classe ViderChamps. import java.awt.*; import java.awt.event.*; public class ViderChamps implements ActionListener { private VoletParcourir champs; public ViderChamps( VoletParcourir f ) { champs = f; } public void actionPerformed( ActionEvent e ) { champs.identite.setText( "" ); champs.prenom.setText( "" ); champs.nom.setText( "" ); champs.adresse.setText( "" ); champs.ville.setText( "" ); champs.etat.setText( "" ); champs.codepostal.setText( "" ); champs.pays.setText( "" ); champs.courriel.setText( "" ); champs.telephone.setText( "" ); champs.telecopieur.setText( "" ); } }

Figure 18.30

Insrer, rechercher et mettre jour des enregistrements. (16 de 16)

928

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

La classe CarnetAdresses dfinie la ligne 8 fait appel un objet VoletControles, dfini la ligne 341, et un objet VoletParcourir, dfini la ligne 378, pour produire linterface utilisateur. La ligne 36 tablit la connexion avec la base de donnes en passant getConnection la chane jdbd:odbc:CarnetAdresses.mdb. Remarque: cette instruction suppose que la base CarnetAdresses.mdb est inscrite comme source ODBC dans le page donglet DSN utilisateur sous le nom CarnetAdresses. La sous-section 18.6.1 montre comment enregistrer une source ODBC. Des classes distinctes sont dfinies pour traiter chacun des vnements lancs par les cinq boutons de linterface utilisateur. La classe AjouterEnregistrement (ligne 87) ajoute un nouvel enregistrement la base de donnes CarnetAdresses quand on appuie sur le bouton Ajouter du GUI. Le constructeur AjouterEnregistrement (ligne 92) accepte trois arguments: un type Connection, un type VoletParcourir et un type JTextArea qui agit comme une zone de sortie pour les messages affichs par le programme. La ligne 103 de la mthode actionPerformed cre un objet Statement (appel ordre) pour la manipulation de la base de donnes. Les lignes 105 et 106 testent la prsence de valeurs dans les champs Nom et Prnom. Si ces deux champs sont vides, aucun enregistrement nest ajout la base de donnes. Les lignes 107 121 construisent la chane SQL INSERT INTO qui sert ajouter un enregistrement dans la base de donnes. Le format de base de lordre SQL INSERT INTO est:
INSERT INTO nomTable ( nomColonne1, nomColonne2, ... ) VALUES ( valeur1, valeur2, ... )

o nomTable est la table dans laquelle les donnes sont ajoutes. Chaque nom de colonne mettre jour est ajout dans la liste, spar des autres par des virgules, et mis entre parenthses. La valeur pour chacune des colonnes est spcifie aprs le mot-cl SQL VALUES sous forme dune autre liste spare par des virgules et mise entre parenthses. La ligne 125
int resultat = ordre.executeUpdate( requete );

appelle la mthode executeUpdate de la classe Statement pour mettre jour la base de donnes avec le nouvel enregistrement. La mthode retourne un entier (int) qui informe du succs ou de lchec de la mise jour, ce que teste la ligne 127. Si la mise jour est russie, tous les champs sont ensuite vids. La classe TrouverEnregistrement, dfinie la ligne 162, recherche dans la base de donnes CarnetAdresses un certain enregistrement ds quon appuie sur le bouton Trouver de linterface utilisateur. La ligne 178 value sil y a un nom dans le champ Nom. Sil est vide, le programme inscrit dans la zone Nom le message Entrez le nom ici, puis appuyez sur Trouver. Si un nom est fourni dans ce champ, un nouvel objet Statement est cr la ligne 179. La chane de requte SQL est cre aux lignes 180 182. Cette requte slectionne seulement les enregistrements qui correspondent au nom entr dans le champ Nom. La ligne 187 appelle la mthode afficher et lui passe lobjet ResultSet retourn par lappel executeQuery. Le premier enregistrement est obtenu par lappel de la mthode next la ligne 205. La ligne 208 dtermine si le numro denregistrement est diffrent de zro. Si cest le cas, les champs sont remplis avec les donnes de lenregistrement rcupr. La ligne 211 affiche la chane du prnom retourne par la mthode getString de la classe ResultSet. Largument 2 renvoie au numro de la colonne (les numros de colonne commencent 1) dans lenregistrement. Des instructions semblables sont excutes pour chaque champ. Quand lopration est acheve, linterface utilisateur affiche le premier enregistrement dans ResultSet. La classe MAJEnregistrement (dfinie la ligne 238) met jour un enregistrement existant de la base de donnes. La ligne 256 value si lidentite de lenregistrement est valide.

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

929

Les lignes 257 270 crent la chane de requte SQL UPDATE (requete). Un ordre SQL UPDATE de base suit la forme
UPDATE nomTable SET nomColonne1='valeur1', nomColonne2='valeur2', ... WHERE critre

o nomTable est la table mettre jour, les colonnes modifier sont indiques aprs le mot-cl SQL SET (suivi dun signe gal et dune valeur entre apostrophes), et la clause WHERE dsigne lenregistrement (dans certains cas les enregistrements) mettre jour. La ligne 274 envoie la requte la base de donnes en appelant la mthode executeUpdate. La classe ViderChamps, dfinie la ligne 440, est charge deffacer les champs quand on appuie sur le bouton Vider de linterface utilisateur, et la classe Aide, dfinie la ligne 315, affiche les instructions sur lutilisation du programme dans la console au bas de lcran.

18.8 Gestion de transactions


Si la base de donnes prend en charge la gestion de transactions, des changements apports la base de donnes peuvent tre annuls. Java autorise la gestion de transactions par le biais des mthodes de linterface Connection. La mthode setAutoCommit indique si chaque ordre SQL doit tre excut et valid sparment (argument true) ou alors si plusieurs ordres SQL doivent tre regroups en une transaction (argument false). Si largument de setAutoCommit est false, lobjet Statement qui excute les ordres SQL prend fin en appelant la mthode commit de linterface Connection (pour valider les changements apports la base de donnes) ou la mthode rollback (pour remettre la base de donnes dans le mme tat quavant la transaction). Linterface Connection possde aussi une mthode getAutoCommit qui dtermine ltat de la validation automatique.

Rsum
Les systmes de base de donnes non seulement assurent le traitement des fichiers, mais organisent en plus les donnes de manire faciliter lobtention des rsultats dune requte complexe. Les types de base de donnes les plus courants dans les ordinateurs qui utilisent Java sont les bases de donnes relationnelles. Un langage appel langage de requte structur (SQL) est employ dans presque tous les systmes de base de donnes relationnelle pour construire des requtes. Une base de donnes est une collection intgre de donnes dont le contrle est centralis. Un systme de gestion de base de donnes (SGBD) gre le stockage et la rcupration des donnes dans une base de donnes. Une base de donnes rpartie est une base de donnes dploye sur les diffrents systmes informatiques dun rseau. Une base de donnes relationnelle est compose de tables que lon traite sous forme dobjets ResultSet dans Java. Chaque ligne (range) de la table est appele un enregistrement. Chaque colonne de la table reprsente un champ diffrent. Des utilisateurs ne veulent connatre que certains sous-ensembles (appels projection) des colonnes de la table. Par contre, dautres utilisateurs souhaitent combiner de petites tables pour obtenir de grandes tables plus complexes (appeles jointures). La cl primaire dune table caractrise exclusivement chaque enregistrement de la table. Chaque enregistrement doit avoir une valeur de cl et cette valeur doit tre unique. Cest ce quon appelle la Rgle de lintgrit des entits.

930

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

La cl secondaire est un champ dune table dont chaque valeur est unique dans une autre table, et ce champ dans cette autre table lui sert de cl primaire. La cl secondaire aide respecter la Rgle de lintgrit rfrentiellechaque valeur dans un champ de cl secondaire doit figurer dans le champ de la cl primaire dune autre table. Grce aux cls secondaires, on peut joindre ensemble plusieurs tables et prsenter linformation combine lutilisateur. Une requte SQL type slectionne des renseignements dune ou de plusieurs tables dune base de donnes. Pour rcuprer ces renseignements, on compose des requtes SELECT. Le format le plus simple dune requte SELECT est: SELECT * FROM NomTable Dans cette dernire requte, lastrisque(*) indique que lon veut obtenir les donnes de toutes les ranges et de toutes les colonnes dune table qui sappelle NomTable. Pour slectionner des champs spcifiques dans la table, remplacez lastrisque (*) par une liste de noms de champ spars par des virgules. SQL propose, avec la clause facultative WHERE, la possibilit de spcifier le critre de slection de la requte. Le format le plus simple dune requte SELECT assortie dun critre de slection est: SELECT * FROM NomTable WHERE critre La condition exprime dans la clause WHERE peut contenir les oprateurs <,>,<=,>=,=,<> et LIKE. Loprateur LIKE est employ pour la correspondance un masque, une technique qui emploie les caractres gnriques astrisque (*) et point dinterrogation (?). Les rsultats dune requte peuvent tre rangs par ordre croissant ou dcroissant si vous prcisez la clause facultative ORDER BY. Le format le plus simple de la clause ORDER BY est SELECT * FROM NomTable ORDER BY champ ASC SELECT * FROM NomTable ORDER BY champ DESC o ASC signifie lordre croissant (du plus petit au plus grand), DESC signifie ordre dcroissant (du plus grand au plus petit), et champ reprsente le champ daprs lequel on effectue le tri. On peut ranger avec la clause ORDER BY daprs plusieurs champs; sa syntaxe est la suivante, ORDER BY champ1 OrdreTri, champ2 OrdreTri, ... o OrdreTri est soit ASC ou DESC. Les clauses WHERE et ORDER BY peuvent tre couples en une seule requte. Un INNER JOIN fusionne des enregistrements de deux tables ou plus en recherchant les valeurs correspondantes dun champ commun toutes ces tables. Le format le plus lmentaire dune jointure est SELECT * FROM Table1 INNER JOIN Table2 ON Table1.champ = Table2.champ La partie ON de la clause INNER JOIN dtermine les champs de chacune des tables qui doivent tre compars pour dterminer les enregistrements slectionner. La syntaxe NomTable.NomChamp est employe dans une requte pour faire la distinction entre des champs ayant le mme nom dans diverses tables. Le package java.sql contient les classes et les interfaces ddies la manipulation des bases de donnes relationnelles dans Java. Linterface Connection (package java.sql) aide grer la connexion entre le programme Java et la base de donnes. Elle assure galement un support pour lexcution des ordres SQL de manipulation de la base de donnes et de gestion des transactions. Pour se relier une base de donnes, il faut connatre lURL de la base de donnes qui permet au programme de la localiser (sur le rseau ou sur le disque local de votre machine), et cet URL peut comprendre un nom dutilisateur et un mot de passe pour lentre en communication avec la base de donnes. LURL dsigne le protocole de communication, le sous-protocole de communication et le nom de la base de donnes.

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

931

Le sous-protocole odbc signale que le programme utilisera jdbc et le pont JDBC-ODBC pour se connecter une source de donnes ODBC de Microsoft. ODBC est une technologie mise au point par Microsoft pour raliser des accs gnriques diffrents systmes de base de donnes de la plate-forme Windows. Le Kit de dveloppement logiciel Java 2 (J2SDK) contient le pont de JDBC ODBC, qui permet un programme Java daccder une source de donnes ODBC. Ce pilote est dfini par la classe JdbcOdbcDriver du package sun.jdbc.odbc. La mthode forName de la classe Class sert charger la dfinition de classe dun pilote de base de donnes. La classe sun.jdbc.odbc.JdbcOdbcDriver reprsente le pont JDBC-ODBC. La mthode getConnection de la classe DriverManager tente ltablissement dune connexion avec la base de donnes indique par son argument (URL de la base). Si le DriverManager ne parvient pas se connecter la base de donnes, la mthode getConnection lve une exception java.sql.SQLException. Un objet Statement (package java.sql) a pour rle de soumettre une requte une base de donnes. Quand une requte portant sur une base de donnes est excute, un objet ResultSet est retourn pour encapsuler les rsultats de la requte. Les mthodes de linterface ResultSet permettent un programmeur de manipuler les rsultats de la requte. La mthode createStatement de Connection rcupre un objet Statement qui est utilis pour la manipulation de la base de donnes. La mthode executeQuery de Statement retourne un objet qui implmente linterface ResultSet et contient les rsultats dune requte. La mthode next de ResultSet place le curseur sur lenregistrement du ResultSet. Au dbut, le curseur du ResultSet pointe devant le premier enregistrement; il faut donc appeler cette mthode pour pouvoir accder aux rsultats. La mthode next retoune un boolean qui indique sil est possible de positionner le curseur sur lenregistrement suivant. Si la rponse de cette mthode est false, il ny a plus dautre enregistrement traiter. La mthode getMetaData de ResultSet retourne la mtadonne du ResultSet dans un objet ResultSetMetaData. La mtadonne de ResultSet dcrit le contenu dun ResultSet. Cette information peut tre exploite en programmation pour obtenir les noms et les types des colonnes du ResultSet et peut aider ainsi un programmeur traiter dynamiquement un ResultSet quand ce que contient la classe ResultSet nest pas connu avant la requte. La mthode getColumnCount de ResultSetMetaData retourne le nombre de colonnes dans ResultSet et la mthode getColName de ResultSetMetaData retourne le nom de la colonne prcise. La mthode getColumnType de ResultSetMetaData retourne une constante entire de la classe Types (package java.sql) qui prcise le type des donnes. Pour vous connecter la base de donnes, vous devez enregistrer une source de donnes ODBC au moyen de loption Sources de donnes ODBC du Panneau de configuration de Windows. Le format de base de lordre SQL INSERT INTO est INSERT INTO nomTable ( nomColonne1, nomColonne2, ... ) VALUES ( valeur1, valeur2, ... ) o nomTable est la table dans laquelle les donnes sont ajoutes. Chaque nom de colonne que lon veut mettre jour se trouve entre parenthses dans une liste de noms spars par des virgules. La valeur de chaque colonne est indique aprs le mot-cl SQL VALUES entre parenthses dans une liste de valeurs spares par des virgules. La mthode executeUpdate de Statement envoie un ordre SQL la base de donnes pour la mise jour ou lajout dun enregistrement. Cette mthode retourne un int qui indique la russite ou lchec de lopration de mise jour. Un ordre SQL UPDATE de base possde la forme UPDATE nomTable SET nomColonne1='valeur1', nomColonne2='valeur2', ... WHERE critre o nomTable est la table mettre jour, les colonnes modifier sont indiques aprs le mot rserv SET de SQL (suivi du signe gal et dune valeur place entre apostrophes) et de la clause WHERE qui dsigne lenregistrement mettre jour.

932

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

Si la base de donnes prend en charge la gestion des transactions, des changements apports la base de donnes peuvent tre annuls. Java autorise la gestion des transactions par le biais de plusieurs mthodes de linterface Connection. La mthode setAutoCommit spcifie si chaque commande SQL doit tre excute et valide sparment (argument true) ou alors si plusieurs commandes SQL doivent tre regroupes en une transaction (argument false). Si largument de setAutoCommit est false, lobjet Statement employ pour excuter les commandes SQL doit prendre fin avec un appel la mthode commit de Connection ou la mthode rollback. Linterface Connection possde aussi la mthode getAutoCommit, dont le rle est de retourner ltat de validation automatique.

Terminologie
ANSI (American National Standards Institute) ASC (ordre croissant) base de donnes base de donnes relationnelle caractre gnrique astrisque (*) caractre gnrique point dinterrogation (?) caractres gnriques champ champ, une colonne de table dans une base de donnes relationnelles classe JTable classe SQLException classe sun.jdbc.odbc.JdbcOdbcDriver classe Types clause dun critre clause INNER JOIN de lordre SELECT clause ORDER BY ASC clause ORDER BY DESC clause WHERE de lordre SELECT cl secondaire cl primaire dun enregistrement dans une table commande SQL INSERT INTO commande SQL SELECT FROM commande SQL UPDATE connecter un programme Java une base de donnes crochets ([]) DESC (ordre dcroissant) enregistrement, une range dune table dans une base de donnes relationnelle enregistrement (range dune table) enregistrement courant chier de base de donnes gestion de transactions INNER JOIN ON interface Connection interface ResultSet interface Statement jointure de deux tables de base de donnes relationnelle mthode commit de linterface Connection mthode createStatement de Connection mthode executeQuery de Statement mthode executeUpdate de Statement mthode forName de la classe Class mthode getAutoCommit de Connection mthode getColumnCount mthode getColumnName mthode getColumnType mthode getConnection (DriverManager) mthode getMetaData de ResultSet mthode next de linterface ResultSet mthode rollback de linterface Connection mthode setAutoCommit de Connection Microsoft Access normalisation des donnes oprateur LIKE dans une clause de critre package java.sql pilote de base de donnes pont JDBCODBC protocole jdbc range dune table (enregistrement) Rgle de lintgrit des entits Rgle de lintgrit rfrentielle SELECT FROM WHERE ORDER BY source de donnes ODBC sous-protocole odbc SQL (langage de requte structure) systme de gestion de base de donnes (SGBD) table dans une base de donnes tables combines URL (Uniform Resource Locator) URL de base de donnes vue dune base de donnes relationnelle

Erreurs de programmation courantes


18.1 18.2 Quand un champ est dsign comme cl primaire, labsence dune valeur dans ce champ pour un enregistrement transgresse la Rgle de lintgrit des entits et constitue une erreur. Quand un champ est dsign comme cl primaire, le fait que plusieurs enregistrements aient la mme valeur constitue une erreur.

CHAPITRE 18

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

933

Bonne pratique de programmation


18.1 Par convention, les mots-cls SQL doivent tre crits en majuscules dans les systmes qui ne font pas la diffence entre majuscules et minuscules, pour les faire ressortir dans la requte SQL.

Astuce sur la performance


18.1 Le recours un critre de slection amliore la performance en restreignant le nombre denregistrements rcuprs.

Astuces sur la portabilit


18.1 18.2 SQL fait la diffrence entre les majuscules et les minuscules dans certaines bases de donnes. Tous les systmes de bases de donnes ne reconnaissent pas loprateur LIKE.

Observations de gnie logiciel


18.1 18.2 Si un nom de champ renferme des espaces, il doit tre encadr par des crochets ([]) dans la requte. Les principaux diteurs de bases de donnes fournissent leurs propres pilotes JDBC, et plusieurs diteurs tiers proposent aussi des pilotes JDBC.

Exercices de rvision
18.1 Compltez chacune des propositions suivantes : a) Le langage de requte de base de donnes le plus employ est __________. b) Une table dans une base de donnes est forme de________ et de __________. c) Les tables se manipulent en Java comme des objets_____________. d) La_____________identifie de faon exclusive chaque enregistrement dune table. e) Le mot-cl SQL_________ est suivi dun critre de slection qui indique quels enregistrements la requte doit retrouver. f) Le mot-cl SQL _______prcise dans quel ordre les enregistrements sont classs dans les rsultats de la requte. g) Le mot-cl SQL ________sert fusionner des donnes provenant de deux ou plusieurs tables de la base de donnes.. h) Une ___________est une collection intgre de donnes gre depuis un seul endroit. i) Une ___________ est un champ dans une table dont toutes les entres sont uniques dans une autre table et qui constitue la cl primaire dans cette dernire table. j) Le package _______ contient les classes et les interfaces grce auxquelles on peut manipuler des bases de donnes relationnelles en Java. k) Linterface ________aide grer la connexion entre le programme Java et la base de donnes. l) La classe ________ reprsente le pont entre JDBC et ODBC. m) Un objet_________ sert soumettre une requte une base de donnes.

Rponses aux exercices de rvision


18.1 a) SQL. b) ranges (lignes), colonnes. c) ResultSet. d) cl primaire e) WHERE. f) ORDER BY. g) INNER JOIN. h) base de donnes. i) cl secondaire. j) java.sql. k) Connection. l) sun.jdbc.odbc.JdbcOdbcDriver. m) Statement.

Exercices
18.2 En recourant aux techniques expliques dans ce chapitre, dfinissez une application de requte complte pour la base de donnes Livres.mdb. Prvoyez une srie de requtes prdfinies affiches dans un objet JComboBox, chacune sous un nom particulier. Autorisez galement lutilisateur composer ses propres requtes et les ajouter la liste droulante JComboBox. Voici les requtes dfinies que vous devez produire : a) Slection de tous les auteurs dans la table Auteurs. b) Slection de tous les diteurs dans la table diteurs.

934

CONNECTIVIT AUX BASES DE DONNES JAVA (JDBC)

CHAPITRE 18

c) Slection dun certain auteur et production de la liste de tous les livres dont il est lauteur. Les renseignements obtenus sont le titre, lanne et le numro ISBN, classs par ordre alphabtique du titre. d) Slection dun certain diteur et production de la liste de tous ses livres. Les renseignements obtenus sont le titre, lanne et le numro ISBN, classs par ordre alphabtique du titre. e) Toutes les autres requtes que vous jugerez propos. 18.3 Modifiez lexercice 18.2 en vue dobtenir une application de manipulation de base de donnes complte pour la base de donnes Livres.mdb. Avec cette application, lutilisateur en plus de composer des requtes pourra modifier les donnes existantes et ajouter de nouvelles donnes (en respectant les contraintes dintgrit rfrentielle et dintgrit des entits). Donnez lutilisateur la possibilit ; a) Dajouter un nouvel auteur. b) De modifier les renseignements conservs sur un auteur. c) Dajouter un nouveau titre pour un auteur (rappelez-vous que le livre doit avoir une entre dans la table AuteursISBN). Prenez soin de prciser lditeur du livre. d) Dajouter un nouvel diteur. e) De modifier les renseignements existants sur un diteur. Pour chacune des oprations prcdentes sur la base de donnes, concevez une interface utilisateur graphique servant principalement raliser cette opration. 18.4 Microsoft Access est livr avec plusieurs modles dans lAssistant Cration dapplications (collection musicale, collection vido, liste de vins, collection de livres, et ainsi de suite) qui sont tous disponibles ds que vous choisissez Nouvelle base de donnes dans le menu Fichier et que vous cliquez sur longlet Base de donnes dans la bote de dialogue rsultante. Crez une nouvelle base de donnes partir du modle de votre choix. Recommencez les exercices 18.2 et 18.3 en utilisant cette nouvelle base de donnes et ses tables prdfinies. Formulez des requtes significatives pour la base de donnes cre et accordez lutilisateur la possibilit de modifier et dajouter des donnes dans cette base. 18.5 Modifiez la fonction Trouver de la figure 18.30 pour permettre lutilisateur de parcourir le ResultSet pour le cas o il y aurait plus dune personne dans le Carnet dadresses ayant le nom de famille spcifi. Dveloppez linterface utilisateur graphique approprie.

Bibliographie
(Bl88) (Co70) (Co72) (Co88) (De90) (Da81) (Re88) (St81) (Wi88) Blaha, M. R.; W. J. Premerlani; and J. E. Rumbaugh, Relational Database Design Using an ObjectOriented Methodology, Communications of the ACM, Vol. 31, No. 4, avril 1988, pp. 414427. Codd, E. F., A Relational Model of Data for Large Shared Data Banks, Communications of the ACM, juin 1970. Codd, E. F., Further Normalization of the Data Base Relational Model, in Courant Computer Science Symposia, Vol. 6, Data Base Systems. Upper Saddle River, N.J.: Prentice Hall, 1972. Codd, E. F., Fatal Flaws in SQL, Datamation, Vol. 34, No. 16, aot 15, 1988, pp. 4548. Deitel, H. M., Operating Systems, Second Edition. Reading, MA: Addison Wesley Pubishing, 1990. Date, C. J., An Introduction to Database Systems. Reading, MA: Addison Wesley Pubishing, 1981. Relational Technology, INGRES Overview. Alameda, CA: Relational Technology, 1988. Stonebraker, M., Operating System Support for Database Management, Communications of the ACM, Vol. 24, No. 7, juillet 1981, pp. 412418. Winston, A., A Distributed Database Primer, UNIX World, avril 1988, pp. 5463.