Principe
Accès aux bases de données avec
Java • Permet la Communication à la plupart des
SGBD (MS-ACCESS, MS SQL server, MySQL,
PostGreSQL, Oracle….)
• Utilise un pilote distribuable par le
propriétaire
• Le code java est indépendant de
l'implémentation de SGBD
Présenté par: Sami GHARBI
API Schéma
• Package: [Link]
• DriverManager: charge le pilote SGBD
Application Java pilote Protocol propriétaire
• Connection: représente une connexion
• PreparedStatement: exécute les requêtes
• ResultSet: représente le résultat d'une
requête Select Client Serveur
• Exceptions: erreurs lancées au cours de
l'interaction Architecture Deux Tiers
Algorithme PreparedStatement
1. Chargement de pilote • Créé à partir d'une connexion avec une requête
paramétrée
2. Ouverture d'une connexion • Les paramètres sont insérés grâce à une méthode
setXXX(int, String…):
3. Création d'un PreparedStatement • setInt(int position, int valeur)
4. Lancer une requête et récupérer le résultat • setString(int position, String valeur)
5. Traiter les données • Permet l'exécution de deux types de requêtes:
• Mise à jour(delete, insert, update):
6. Fermer la connexion void executeUpdate();
• Sélection(select):
ResultSet executeQuery();
ResultSet Mise à jour
• Un curseur contenant les résultats d'une • [Link](chemin_du_pilote);
requête select • Connection
• Méthodes: cnx=[Link](url,user,pass);
• String rq="requete_sql";
• boolean next()
• PreparedStatement st=[Link](rq);
• void beforeFirst() • [Link](1,100);
• String getString(int col) • [Link](2,"java");
• int getInt(int col) • [Link](rq);
• Date getDate(int col) • [Link]()
Sélection Exceptions
• [Link](chemin_du_pilote); • La plupart des interactions application-SGBD génèrent
• Connection des exceptions
cnx=[Link](url,user,pass); • Le bloc de traitement doit être délimité par un bloc try
• String rq="requete_sql"; suivi des blocs catch associé chacun à un type
• PreparedStatement st=[Link](rq); d'exception
• [Link](1,100); try{
• ResultSet rs=[Link](rq); Transaction application-SGBD
• while([Link](){ }
//Extraire champ par champ catch(TypeException1 e1){………………………………..}
} catch(TypeException2 e2){………………………………..}
[Link]() catch(TypeException3 e3){………………………………..}
Exceptions url
• Syntaxe de l'url dépend du SGBD
• MySQL:
Méthode Exception Explication
Impossible charger • jdbc:mysql://<@ip>[:port]/<bd>
forName ClassNotFoundException
la classe • Où:
getConnection
executeQuery SQLException Erreur SQL
– @ip: adresse IP du serveur
executeUpdate – port: port du serveur (MySQL 3306) optionnel
– bd: nom de la base de données
Application(1/3) Application(2/3)
• Soit une base de données: gestion • Insérer des valeurs dans la table
try{
• Le serveur est installé sur une machine ayant [Link]("[Link]");
Connection cnx=[Link](
l'adresse IP [Link] "jdbc:mysql://[Link]/gestion","root","");
String rq="insert into personne values(?,?,?)";
• Soit la table PreparedStatement st=[Link](rq);
[Link](1, 123);
Personne(CIN int(4) Primary Key, [Link](2, "ben med");
nom varchar(100), [Link](3, "Ali");
[Link](rq);
prenom varchar(100)) [Link](); }
catch(Exception ex){
[Link]("une erreur est survenue: "+[Link]());}
}
Application(3/3) Problème des dates
• Récupérer les information d'une certaine personne sachant
son CIN • Transformer une date java en une date sql (et
[Link]("[Link]");
Connection cnx=[Link]( vice-versa)
"jdbc:mysql://[Link]/gestion","root","");
String rq="select * from personne where CIN=?"; [Link] d1;
PreparedStatement st=[Link](rq);
[Link](1,CIN); ………
ResultSet rs=[Link]();
if([Link]()){ [Link] d2=new
[Link]("CIN="+[Link](1)+"\nnom="+[Link](2)+"\nprenom="+rs.g [Link]([Link]());
etString(3));}
else{
[Link]("aucune personne trouvée avec la CIN: "+CIN);}
[Link]();}
catch(Exception ex){
[Link]("une erreur est survenue: "+[Link]());}