Вы находитесь на странице: 1из 13

INTERACTIONS AVEC LES BASES DE

DONNEES PAR L’API JDBC

Introduction
Il existe plusieurs modèles de base de données :

 Hiérarchique : historiquement le type le plus ancien, ces bases de données

étaient largement utilisées sur les gros systèmes de type mainframe. Les

données sont organisées de façon hiérarchique grâce à des pointeurs.

Exemples : DL1, IMS, Adabas

 Relationnel (RDBMS / SGBDR) : c'est le modèle le plus répandu actuellement.

Ce type de base de données repose sur les théories ensemblistes et l'algèbre

relationnel. Les données sont organisées en tables possédant des relations entre

elles grâce à des clés primaires et étrangères. Les opérations sur la base sont

réalisées grâce à des requêtes SQL. Exemple : MySQL, PosgreSQL, HSQLDB,

Derby

 Objet (ODBMS / SGBDO) : Exemple db4objects

 XML (XDBMS) : Exemple : Xindice

La seconde catégorie est historiquement la plus répandue.

L’interaction de java avec une base de données ==> :

- JDBC (Java DataBase Connectivity) désigne une API définie par Sun pour

permettre un accès aux bases de données avec Java

- java.sql : Les classes de JDBC sont regroupées dans le package java.sql ;

- un pilote : Pour pouvoir utiliser JDBC, il faut un pilote qui est spécifique à la

base de données à laquelle on veut accéder.

Th. K. DAGBA, PhD ENEAM/UAC Page 1


Le paquetage java.sql  classes importantes : DriverManager, Connection,

Statement ( et PreparedStatement ), et ResultSet, chacune correspondant à une

étape de l'accès aux données :

Classe Rôle

DriverManager charge et configure le driver de la base de données

Connection réalise la connexion et l'authentification à la base de

données

Statement (et contient la requête SQL et la transmet à la base de

PreparedStatement ) données

ResultSet permet de parcourir les informations retournées par

la base de données dans le cas d'une sélection de

données

Chacune de ces classes dépend de l'instanciation d'un objet de la précédente classe

Les accès à une base de données doivent être effectués à travers des étapes

consécutives :

1. Chargement d’un pilote JDBC

2. Définition de l’URL de connexion

3. Établissement de la connexion

4. Création d’une instruction

5. Exécution de la requête

6. Traitement des résultats

Th. K. DAGBA, PhD ENEAM/UAC Page 2


7. Fermeture de la connexion

Chargement d’un pilote JDBC

- On peut utiliser la méthode statique Class.forName().

- L’utilisation de la méthode Class.forName() peut lever une exception de type

java.lang.ClassNotFoundException

- Il convient donc de placer le chargement du pilote dans un bloc sécurisé.

Exemples :
 Pour charger le pilote à utiliser pour une base de données de type ODBC (par
exemple Access) :

String nomPilote = "sun.jdbc.odbc.JdbcOdbcDriver";


try
{
Class.forName(nomPilote);//Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch(ClassNotFoundException e)
{
System.err.println("Erreur de chargement du driver : " +e) ;
}

 Les lignes suivantes montrent le cas d’autres SGBDR


Class.forName("com.mysql.jdbc.Driver"); //MySQL
Class.forName("postgresql.Driver"); //Postgres
Class.forName("oracle.jdbc.driver.OracleDriver"); //Oracle

Pour obtenir plus d’informations sur les pilotes JDBC, il faut se référer à l’adresse

suivante :

//http://java.sun.com/jdbc/drivers.html

Les drivers se présentent souvent sous forme de fichiers .jar dont le chemin doit être

ajouté au classpath pour permettre au programme de l'utiliser.

Th. K. DAGBA, PhD ENEAM/UAC Page 3


Définition de l’URL de connexion.

Afin de localiser le serveur ou la base de données,

- il est indispensable de spécifier une adresse sous forme d’URL de type

«jdbc:».

- Le format exact de cette URL est dépendant du pilote JDBC utilisé et peut

varier d'un type de base de données à l'autre mais elle est toujours de la

forme «protocole:sous_protocole:nom»

- Le protocole vaut toujours "jdbc".

- Le sous protocole définit le mécanisme de connexion pour un type de bases

de données, par exemple «odbc»

Par exemple, « jdbc:odbc:toto » permettra de se connecter à la base de

données Access après avoir définis un alias ODBC nommé « toto ».

Si la base de donnée MySQL est sur le localhost :


jdbc:mysql://localhost/toto

Etablissement de la connexion

Après avoir chargé le pilote et défini l’URL de connexion :

- On peut entrer en contact avec la base de données

- Lors de la connexion, il est possible de spécifier un certain nombre de

paramètres tels que le nom de l’utilisateur et son mot de passe

- Pour l’établissement de la connexion, on utilise la classe DriverManager du

paquetage java.sql

- La classe DriverManager dispose d’une méthode statique permettant

d’obtenir une connexion à l’URL : la méthode getConnection()

Th. K. DAGBA, PhD ENEAM/UAC Page 4


- la méthode getConnection() retourne un objet de type Connection.

- la méthode getConnection() peut lever une exception de type

java.sql.SQLException si la connexion échoue ou si aucun pilote ne prend

en charge l’URL spécifiée.

Exemple :
import java.sql.* ;
……
try
{
Connection con =
DriverManager.getConnection(url,userId,password)
}
catch(SQLException sqle)
{
System.err.println("Erreur lors de la connexion : "
+ sqle) ;
}

Une fois la connexion établie, on peut obtenir des métadonnées sur la base en

utilisant la classe DatabaseMetaData. Une instance de cette classe est retournée

par la méthode getMetaData() de la classe Connection.

Exemple :
import java.sql.* ;
……
try
{
Connection con = DriverManager.getConnection(url,userId,password) ;
DatabaseMetaData metaData = con.getMetaData();
System.out.println(metaData.getDatabaseProductName());
System.out.println(metaData.getDatabaseProductVersion());
}
catch(SQLException sqle)
{
System.err.println(" Erreur lors de la connexion : " + sqle) ;
}

Une DatabaseMetaData supporte les concepts de catalogue et de schéma

qu’introduisent certaines bases.

Th. K. DAGBA, PhD ENEAM/UAC Page 5


- La méthode DatabaseMataData.getDatabaseProductName()

Retourne le nom de l’application de base de données (SQLServer, MySQL,

Oracle,…)

- DatabaseMataData getDatabaseProductVersion()

Retourne la version de l’application de base de données

- DatabaseMataData getDriverName()

Retourne le nom du pilote utilisé pour accéder à la base de données

- DatabaseMataData String getDriverversion()

Retourne la version du pilote utilisé pour accéder à la base de données

Création d’une instruction.


Afin d’accéder ou de modifier les informations contenues dans la base de données :

- Il convient d’utiliser un objet de type Statement

- Une instance de cet objet est retournée par la méthode createStatement() de

la classe Connection :

Statement st = con.createStatement() ;

Exécution d’une requête


Après avoir obtenu le Statement, on peut s’en servir pour effectuer une requête sur la

base de données.

Th. K. DAGBA, PhD ENEAM/UAC Page 6


Les requêtes de type sélection doivent utiliser un objet de type ResultSet afin de

pouvoir en traiter le résultat.

Exemple :
String query = "SELECT * FROM Employes";
ResultSet rs = st.executeQuery(query);

Si l'on utilise executeQuery() pour exécuter une requête SQL ne contenant pas
d'ordre SELECT, alors une exception de type SQLException est levée.

Remarque :
Pour une requête de type commande (INSERT, DELETE ou UPDATE), il sera

préférable de passer par la méthode executeUpdate() qui, en retour, fournira le

nombre de lignes affectées par la requête.

Exemple :
String query = "DELETE FROM Employes WHERE Region = ‘WA’";
int result = st.executeUpdate(query) ;

Traitement du résultat

Un ResultSet propose de nombreuses méthodes pour désigner l’un de ses

enregistrements comme l’enregistrement courant :

Méthode L’enregistrement courant devient


beforeFirst() L’enregistrement (vide) situé avant le
premier enregistrement du ResultSet
first() Le premier enregistrement du ResultSet
next() L’enregistrement suivant l’enregistrement
courant du ResultSet
previous() L’enregistrement précédent
l’enregistrement courant du Resultset
last() Le dernier enregistrement du ResultSet
afterLast() L’enregistrement (vide) situé après le
dernier enregistrement du ResultSet

first(), next(), previous(), last() retournent true si la navigation a pu s’effectuer, false

sinon ; toutes peuvent lever une exception de type SQLException en cas d’erreur

d’accès à la base.

Th. K. DAGBA, PhD ENEAM/UAC Page 7


La classe ResultSet propose encore comme aide à la navigation des méthodes

comme suit :

Méthode Retourne
isBeforeFirst() true si l’enregistrement courant est situé
avant le premier du ResultSet, false
sinon
isFirst() true si l’enregistrement courant est le
premier du ResultSet, false sinon
isLast() true si l’enregistrement courant est le
dernier du ResultSet, false sinon
isAfterLast() true si l’enregistrement courant est situé
après le dernier du ResultSet, false sinon
getRow() Le numéro de l’enregistrement courant
du ResultSet

ResultSet offre également des méthodes d’extraction de données de colonnes

individuelles. Il y a plusieurs méthodes, qui permettent d’extraire les données selon

des formats différents. La meilleure manière d’extraire les données d’une colonne est

de référencer sa position. Les positions débutent par 1. On peut toutefois spécifier le

nom de la colonne sous forme de chaîne de caractère :

Méthode Rôle
getInt() retourne sous forme d'entier le contenu de la colonne dont le numéro est
passé en paramètre
getLong() retourne sous forme d'entier long le contenu de la colonne dont le
numéro est passé en paramètre
getByte() retourne sous forme de byte le contenu de la colonne dont le numéro est
passé en paramètre
getFloat() retourne sous forme de nombre flottant le contenu de la colonne dont le
numéro est passé en paramètre
getDate() retourne sous forme de date le contenu de la colonne dont le numéro est
passé en paramètre

La méthode getString() permet d'obtenir la valeur d'un champ de n'importe quel type.

Th. K. DAGBA, PhD ENEAM/UAC Page 8


Fermeture de la connexion
Pour fermer explicitement une connexion, utilisez la méthode close() de la classe

Connection.

Exemple : con.close() ;

Th. K. DAGBA, PhD ENEAM/UAC Page 9


Exemples récapitulatifs

Exemple 1 :
Cet exemple affiche le contenu d’une base Access de nom « commande »

import java.sql.*;
//import java.io.*;
// affiche le contenu d'une base commande
public class Sql0
{
static final String DB="commande"; // base de données à exploiter
public static void main(String arg[])
{
Connection con=null; // connexion avec la base
Statement st=null; // objet d'émission des requêtes
ResultSet rs=null; // table résultat d'une requête
try
{
// connexion à la base
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
con=DriverManager.getConnection("jdbc:odbc:"+DB,"","");
System.out.println("Connexion avec la base " + DB + " établie");
// création d'un objet Statement
st=con.createStatement();
// exécution d'une requête select
rs=st.executeQuery("select * from Customers" );
// exploitation de la table des résultats
while(rs.next())
{ // tant qu'il y a une ligne à exploiter
// on l'affiche à l'écran
System.out.println(rs.getString(1)+","+
rs.getString(2)+","+
rs.getString(3)+","+
rs.getString(4)+",");
}// ligne suivante
} catch (Exception e)
{
System.err.println("Erreur " + e);
}
// fermeture de la base
try
{
con.close();
System.out.println("Base " + DB + " fermée");
} catch (Exception e){}
}// main
}// classe

Exemple 2 :
Ce programme exécute sur la base « commande » toute requête SQL Select que l’utilisateur tape au
clavier.

import java.sql.*;
import java.io.*;
// affiche le contenu d'une base système commande
public class Sql1

Th. K. DAGBA, PhD ENEAM/UAC Page 10


{
static final String DB="commande"; // base de données à exploiter
public static void main(String arg[])
{
Connection connect=null; // connexion avec la base
Statement S=null; // objet d'émission des requêtes
ResultSet RS=null; // table résultat d'une requête
String select; // texte de la requête SQL select
int nbColonnes; // nb de colonnes du ResultSet
// création d'un flux d'entrée clavier
BufferedReader in=null;
try
{
in=new BufferedReader(new InputStreamReader(System.in));
}
catch(Exception e)
{
erreur("erreur lors de l'ouverture du flux clavier ("+e+")",3);
}
try
{
// connexion à la base
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
connect=DriverManager.getConnection("jdbc:odbc:"+DB,"","");
System.out.println("Connexion avec la base " + DB + " établie");
// création d'un objet Statement
S=connect.createStatement();
// boucle d'exécution des requêtes SQL tapées au clavier
System.out.print("Entrez votre requête : ");
select=in.readLine();
while(!select.equals("fin"))
{
// exécution de la requête
RS=S.executeQuery(select);
// nombre de colonnes
nbColonnes=RS.getMetaData().getColumnCount();
// exploitation de la table des résultats
System.out.println("Résultats obtenus\n\n");
while(RS.next())
{ // tant qu'il y a une ligne à exploiter
// on l'affiche à l'écran
for(int i=1;i<nbColonnes;i++)
{System.out.print(RS.getString(i)+",");}

System.out.println(RS.getString(nbColonnes));
}// ligne suivante
// requête suivante
System.out.print("Requête : ");
select=in.readLine();
}// while
}
catch (Exception e)
{
erreur("Erreur " + e,2);
}
// fermeture de la base et du flux d'entrée
try
{
connect.close();
System.out.println("Base " + DB + " fermée");

Th. K. DAGBA, PhD ENEAM/UAC Page 11


in.close();
}
catch (Exception e){}
}// main
public static void erreur(String msg, int exitCode)
{
System.err.println(msg);
System.exit(exitCode);
}
}// classe

Exemple 3 :
Le programme précédent modifié légèrement : les requêtes tapées au clavier sont maintenant des
requêtes de mise à jour de la base « commande ».

import java.sql.*;
import java.io.*;
// affiche le contenu d'une base système commande
public class sql2
{
static final String DB="commande"; // base de données à exploiter
public static void main(String arg[])
{
Connection connect=null; // connexion avec la base
Statement S=null; // objet d'émission des requêtes
ResultSet RS=null; // table résultat d'une requête
String sqlUpdate; // texte de la requête SQL de mise à jour
int nbLignes; // nb de lignes affectées par une mise à jour
// création d'un flux d'entrée clavier
BufferedReader in=null;
try
{
in=new BufferedReader(new InputStreamReader(System.in));
}
catch(Exception e)
{
erreur("erreur lors de l'ouverture du flux clavier ("+e+")",3);
}
try
{
// connexion à la base
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
connect=DriverManager.getConnection("jdbc:odbc:"+DB,"","");
System.out.println("Connexion avec la base " + DB + " établie");
// création d'un objet Statement
S=connect.createStatement();
// boucle d'exécution des requêtes SQL tapées au clavier
System.out.print("Entrez votre requête : ");
sqlUpdate=in.readLine();
while(!sqlUpdate.equals("fin"))
{
// exécution de la requête
nbLignes=S.executeUpdate(sqlUpdate);
// suivi
System.out.println(nbLignes + " ligne(s) ont été mises à jour");
// requête suivante
System.out.print("Requête : ");
sqlUpdate=in.readLine();
}// while

Th. K. DAGBA, PhD ENEAM/UAC Page 12


}
catch (Exception e)
{
erreur("Erreur " + e,2);
}
// fermeture de la base et du flux d'entrée
try
{
// on libère les ressources liées à la base
RS.close();
S.close();
connect.close();
System.out.println("Base " + DB + " fermée");
// fermeture flux clavier
in.close();
}
catch (Exception e){}
}// main
public static void erreur(String msg, int exitCode)
{
System.err.println(msg);
System.exit(exitCode);
}
}// classe

EXERCICES DE PROGRAMMATION
1. Remplacer dans les exemples récapitulatifs ci-dessus la base Access par une base MySQL
ou ORACLE possédant plus d’une table et expérimenter la jointure.
2. Considérer les requêtes d’action (de commande)
3. Considérer le travail en mode graphique

Th. K. DAGBA, PhD ENEAM/UAC Page 13

Вам также может понравиться