TSIG2 DA DAIGL S34 (également S35 et S36) Cours atelier n°2
- 1 -
DEVELOPPEMENT CLIENT-SERVEUR EN JAVA
1 Présentation
JDBC (Java DataBase Connectivity) est voisin d’ODBC. L’API JDBC est l’ensemble de
classes et d'interfaces permettant de travailler (connexion à la base, exécution de requêtes et
de procédures et fonctions stockées, exploitation des résultats renvoyés …) sur des bases de
données relationnelles dans des programmes Java.
Les classes et interfaces de l'API JDBC figurent dans le package java.sql.
Il est indispensable d’importer l’API JDBC dans tout programme se servant de la technologie
JDBC ; pour cela, il faut écrire :
import java.sql.* ;
Il faut dans un premier temps établir une connexion à la base puis effectuer les actions
nécessaires sur les données.
2 Connexion à la base de données
2.1.1 Types de pilotes
Il existe un ou plusieurs drivers JDBC spécifiques pour chaque SGBD (système de gestion de
bases de données : Access, Oracle, Informix, ...).
Les pilotes JDBC sont classés en 2 familles :
La famille de pilotes non 100% Java : ce sont des pilotes qui utilisent une partie écrite
dans un autre langage que Java (souvent en C). Ces pilotes doivent être installés sur la
station cliente. Dans cette 1ère famille, on distingue :
Pilotes de type 1: Pilotes accédant à une base de données par l'intermédiaire d'une
autre technologie (on parle de passerelle ou pont). C’est typiquement le cas de la
passerelle JDBC-ODBC, le driver se nomme JdbcOdbcDriver et il est livré avec le
JDK. Le pilote convertit les appels de données Java en appels ODBC et les exécute
ensuite à l'aide du pilote ODBC.
Pilotes de type 2: Pilotes dits natifs. Il s'agit en fait d'un mélange de pilotes natifs et
de pilotes Java. Les appels JDBC sont convertis en appels natifs pour le serveur de
bases de données (Oracle, Sybase, ou autres) généralement en C ou en C++.
La famille de pilotes 100% Java : ils interrogent le gestionnaire de base de données avec
du code uniquement écrit en Java. Il n’y a aucune installation à effectuer sur le client ce qui
permet d’interroger la base de données dans une applet. Dans cette 2ème famille, on
distingue :
Pilotes de type 3: Pilotes convertissant les appels JDBC pour un middleware présent
sur le serveur et qui fait l’interface avec la BD.
TSIG2 DA DAIGL S34 (également S35 et S36) Cours atelier n°2
- 2 -
Pilotes de type 4: Pilotes convertissant les appels JDBC directement en un protocole
réseau directement exploité par le SGBD.
2.1.2 Pilotes non 100% Java
2.1.2.1 Connexion via jdbc-odbc (type 1)
a. Chargement du pilote
Il faut d’abord charger le pilote pour permettre la connexion à la base et le travail sur les
données, cela se fait grâce à un appel à la méthode forName (de la classe Class) à laquelle on
transmet le nom de la classe du pilote. Le pilote est alors enregistré auprès du DriverManager
(gestionnaire de pilotes) :
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e)
{
System.out.println("JDBC driver not found.");
}
Quel que soit le pilote qu’on essaie de charger, c’est l’exception ClassNotFoundException qui
est levée (c’est à dire déclenchée) en cas d’échec. Il est obligatoire d’intercepter cette
exception ou bien de la renvoyer.
b. Connexion proprement dite
Nous allons partir de l'exemple d'une base des voyages sous Access. Précisons bien que le
SGBD Access ne permet pas de travailler en vrai mode client-serveur mais la façon de
procéder est la même, la différence résidera bien sûr dans les performances.
Cette base contient les tables suivantes :
T_Voyages(NoVoyage, LibVoyage, DateDebut, Duree, NbInscrits,NoDestination)
T_Destinations(NoDestination, LibDestination)
La connexion à la base se fait via le DSN(data source name) BDVoyage qui s’appuie sur le
pilote Microsoft Access Driver.
Pour se connecter à une base, il est nécessaire de déclarer une référence de type Connection et
de créer la connexion par un appel à la méthode getConnection de la classe Drivermanager en
indiquant la base de données à charger à l'aide d'une chaîne de connexion.
String cochaine = "jdbc:odbc:Bdvoyage"; // chaîne de connexion avec DSN
Connection conn = DriverManager.getConnection(cochaine); // on effectue la connexion
//grâce à la méthode getConnection de la classe DriverManager
TSIG2 DA DAIGL S34 (également S35 et S36) Cours atelier n°2
- 3 -
Syntaxe générale pour la connexion :
Connection objetConnection =
DriverManager.getConnection(ChaîneDeConnexion,"NomUtilisateur","MotDePasse");
Remarques :
l’accès à une base Oracle dans un programme Java peut être effectué via un DSN
ODBC (on choisira bien sûr un pilote pour Oracle lors de la création du DSN). Mais
dans le cas d’Oracle, il faudra impérativement préciser le nom d’utilisateur et le mot
de passe dans l’instruction de connexion. Sur le serveur, il faut que le listener Oracle
soit lancé. Sur le client, il faudra avoir installé Net8 et le driver odbc pour Oracle
devra bien sûr être présent.
En cas d’échec de la connexion, c’est l’exception SQLException qui est levée. Il est
obligatoire d’intercepter cette exception ou bien de la renvoyer.
3 Le client-serveur de données
Quand la connexion est établie (si aucune exception n'a été interceptée) on peut écrire des
requêtes pour construire, interroger ou mettre à jour la base.
Plusieurs interfaces sont utilisées :
Statement : C'est une interface que l'application emploie pour transmettre des requêtes SQL à
la base.
ResultSet : un ResultSet sera créé lors de l’exécution d’une requête d’interrogation, c’est
l’ensemble des tuples du résultat de la requête, cet ensemble pourra bien sûr être manipulé.
En cas d’échec de l’une des méthodes permettant de travailler sur les données, c’est
l’exception SQLException qui est levée. Il est obligatoire d’intercepter cette exception ou
bien de la renvoyer. C'est l'exception SQLException qui est levée en cas d'erreur pour
chacune des opérations vues dans la suite de ce cours.
3.1 Interrogation de la base
3.1.1 Requête et curseur (ResultSet)
Il faut commencer par créer un Statement, il s’appuie sur la connexion créée précédemment :
Statement requete = conn.createStatement();
executeQuery exécute la requête et place le résultat dans un ResultSet. Cet objet (nommé
resultat dans l’exemple ci-dessous) permet d'accéder aux données du résultat de la requête :
ResultSet resultat = requete.executeQuery ("select empno, ename, sal, hiredate from emp");
Après la requête, le curseur est positionné juste avant la première ligne du résultat mais le 1er
enregistrement n’est pas accessible, il faut effectuer un next() comme par la suite pour
avancer d’enregistrement en enregistrement.
TSIG2 DA DAIGL S34 (également S35 et S36) Cours atelier n°2
- 4 -
resultat.next();
La fin du ResultSet est détectée par le renvoi de la valeur false.
Il faut donc effectuer une lecture initiale, puis prévoir une boucle incluant l’utilisation des
données et la lecture du suivant.
boolean bool=resultat.next();
if (bool)
{
do
{
...
...
bool=resultat.next(); }
}
while (bool) ;
}
else
Facilité d’écriture :
while (resultat.next()) et if (resultat.next()) assurent la lecture de l’enregistrement et la
détection de la fin du ResultSet.
if (resultat.next())
{
do
{
...
...
}
while (resultat.next()) ;
}
else
Si on ne souhaite pas distinguer le cas ResultSet vide, on utilisera un TANTQUE et la
structure du traitement sera la suivante :
while (resultat.next()) ;
{
...
...
}
3.1.2 Récupération des données
TSIG2 DA DAIGL S34 (également S35 et S36) Cours atelier n°2
- 5 -
Pour récupérer les données des différents champs, il faut utiliser la méthode getObject (qui
permet de récupérer les données sans se soucier de leurs types mais attention, cela ne
fonctionne généralement qu’avec le pont JDBC/ODBC et à la condition qu’il ne s’agisse pas
de données de type réel ou date ou heure) ou bien les méthodes adaptées aux types des
données à récupérer mais alors il faut connaître le type des données récupérées.
De plus, si on utilise getObject, la donnée récupérée ne sera pas « typée » et il sera par
exemple impossible d’effectuer des opérations arithmétiques sur cette donnée à moins de la
convertir.
Attention les colonnes sont numérotées à partir de 1.
Principales méthodes de récupération des champs suivant le type:
Type SQL
Type Java
Méthode de récupération
CHAR, VARCHAR,
VARCHAR2
String
getString(NumColonne)
NUMERIC (NUMBER sous
ORACLE) sans partie
décimale
int ou long ou
java.math.BigDecimal
getInt(Numcolonne) ou
getLong(NumColonne) ou
getBigDecimal(NumColonne)
NUMERIC (NUMBER sous
ORACLE) avec partie
décimale
double ou float
getFloat(NumColonne) ou
getBigDecimal(NumColonne)
SMALLINT
short
getShort(NumColonne)
INTEGER
int
getInt(NumColonne)
DATE
Java.sql.Date
getDate(NumColonne)
TIME ou partie heure de
DATE
java.sql.Time
getTime(NumColonne)
1 / 20 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !