Upload
pablo-sene
View
26
Download
0
Embed Size (px)
Citation preview
JDBC (Java DataBase Connectivity)
M. Belguidoum
Université Mentouri de Constantine
Département Informatique
M. Belguidoum (UMC) Programmation réseau 1 / 52
Plan
1 Introduction
2 Le paquetage java.sql
3 Mise en ÷uvre de JDBC
4 Equivalence des types java-SQL
5 Fonctionnalités supplémentaires de JDBC
M. Belguidoum (UMC) Programmation réseau 2 / 52
Introduction
Objectifs de JDBC
Permettre aux programmeurs Java d'écrire un code indépendant de labase de données et du moyen de connexion utilisé
API JDBC (Java DataBase Connectivity) 3.0
interface uniforme permettant un accès homogène aux SGBDsimple à mettre en ÷uvreindépendant du SGBD supportsupportant les fonctionnalités de base du langage SQL
M. Belguidoum (UMC) Programmation réseau 3 / 52
Introduction
JDBC : introduction
JDBC (Java Data Base Connectivity) est une API permettant l'accèsà des bases de données relationnelles à partir du langage Java
l'accès aux bases de données est réalisé en trois étapes :
la création d'une connexion à la base.l'envoi d'instructions SQL.l'exploitation des résultats provenant de la base.
JDBC est représentée par le paquetage java.sql (depuis la version1.1 du JDK)
M. Belguidoum (UMC) Programmation réseau 4 / 52
Introduction
JDBC : les drivers
chaque SGBD utilise un pilote (driver) qui lui est propre et qui permetde convertir les requêtes JDBC dans le langage natif du SGBD
le driver est un ensemble de classes qui implantent les interfaces deJDBC
les drivers dont le lien entre le programme Java et le SGBD
ces drivers dits JDBC existent pour tous les principaux SGBD : Oracle,Sybase, Informix, DB2, MySQL,...
M. Belguidoum (UMC) Programmation réseau 5 / 52
Introduction
JDBC : introduction
Les pilotes JDBC sont classés en quatre catégories :
les pilotes de pont JDBC/ODBC : ce type de pilote, fourni avec leJ2SE (Java 2 Standard Edition), permet de convertir les appels JDBCen appels ODBC (Open Database Connectivity). ODBC est fourni enstandard sur les plates-formes Windows et permet la connexion à desbases de natures diverses (Access, SQL Server, Oracle, ...).les pilotes de type 2 : ils sont écrits, en partie, en Java, maisdépendent malgré tout de code natif. En termes de portaged'application Java, ces types de pilotes présentent quelques lacunes.les pilotes de type 3 : ce type de pilote passe par un autre piloteJDBC intermédiaire (fréquemment de type 1 ou 2). Il s'agitcertainement du type de pilote le moins utile des quatre proposés.les pilotes de type 4 : leur code est écrit en Java, donc portable. Cespilotes sont fournis par presque tous les constructeurs de bases dedonnées. Chaque pilote étant adapté à une base de donnéesparticulière. Ces drivers constituent la meilleure solution pour leportage des applications Java.
M. Belguidoum (UMC) Programmation réseau 6 / 52
Introduction
JDBC : pilote de type 1
Pont JDBC-ODBC (Open Data Base Connectivity)
M. Belguidoum (UMC) Programmation réseau 7 / 52
Introduction
JDBC : pilote de type 2
API native
M. Belguidoum (UMC) Programmation réseau 8 / 52
Introduction
JDBC : pilote de type 3
M. Belguidoum (UMC) Programmation réseau 9 / 52
Introduction
JDBC : pilote de type 4
Thin (protocole natif)
M. Belguidoum (UMC) Programmation réseau 10 / 52
Introduction
Les driver JDBC
Liste des drivers disponibles à :http://developers.sun.com/product/jdbc/drivers
sélection d'un driver
choix entre vitesse, �abilité et portabilité.Programme "standalone", avec une interface graphique qui s'exécutetoujours sur un système Windows peut tirer béné�ce de performancesd'un driver type 2 (driver code-natif).Une applet peut nécessiter un driver de type 3 (pour passer un �rewall).Une servlet déployée sur de multiples plateformes peut nécessiter lasouplesse o�erte par des drivers de type 4....
M. Belguidoum (UMC) Programmation réseau 11 / 52
Le paquetage java.sql
JDBC : le paquetage java.sql
M. Belguidoum (UMC) Programmation réseau 12 / 52
Le paquetage java.sql
JDBC : les interfaces
Driver : renvoie une instance de Connection
Connection : connexion à une base
Statement : instruction SQL
PreparedStatement : instruction SQL paramétrée
CallableStatement : procédure stockée dans la base
ResultSet : n-uplets récupérés par une instruction SQL
ResultSetMetaData : description des n-uplets récupérés
DatabaseMetaData : informations sur la base de données
M. Belguidoum (UMC) Programmation réseau 13 / 52
Le paquetage java.sql
JDBC : les classes
DriverManager : gère les drivers, lance les connexions aux bases
Date : date SQL
Time : heures, minutes, secondes SQL
TimeStamp : comme Time, avec une précision à la microseconde
Types : constantes pour désigner les types SQL (conversions)
M. Belguidoum (UMC) Programmation réseau 14 / 52
Le paquetage java.sql
JDBC : les Exceptions
SQLException : est levée dès qu'une connexion ou un ordre SQL nese déroule pas correctement
méthode getMessage() : pour obtenir le message en clair de l'erreurrenvoie également des informations spéci�ques au SGBD :SQLState etle code d'erreur SGBD
SQLWarning : avertissements SQL
DataTruncation : lorsqu'une valeur est tronquée lors d'uneconversion SGBD -Java
M. Belguidoum (UMC) Programmation réseau 15 / 52
Le paquetage java.sql
JDBC : DriverManager
M. Belguidoum (UMC) Programmation réseau 16 / 52
Mise en ÷uvre de JDBC
Mise en ÷uvre de JDBC
1 Importer le package java.sql
2 Enregistrer le driver JDBC
3 Etablir la connexion au SGBD
4 Créer une requête (ou instruction SQL)
5 Exécuter la requête
6 Traiter les données retournées
7 Fermer la connexion
M. Belguidoum (UMC) Programmation réseau 17 / 52
Mise en ÷uvre de JDBC
Interface Driver
La méthode connect() de Driver
nécessite un URL vers la baserenvoie une instance de l'interface Connection (null si le driver neconvient pas)
L'instance de Connection obtenue permet de lancer des requêtes
URL pour accéder à la base (syntaxe dépend du SGBD cible)
jdbc:<sous-protocole>:<nom-BD>?param=valeur, ...
sous-protocole : mysqlnom-BD : //foo.loria.fr:1114:maBaseexemples
String url = "jdbc:odbc:maBase"
String url = "jdbc:mysql://127.0.0.1:3306/maBase"
String url = "jdbc:oracle:thin:@charlemagne:infodb"
String url = "jdbc:mysql://foo.loria.fr:1114:maBase"
M. Belguidoum (UMC) Programmation réseau 18 / 52
Mise en ÷uvre de JDBC
Étape 1 : enregistrer le driver
Rôle de la classe DriverManager : elle gère les di�érents drivers(instances de Driver)
Pour qu'un driver soit disponible, il faut charger sa classe en mémoire
Utiliser la méthode forName de la classe Class avec en paramètre lenom complet de la classe du driver : Class.forName("driverName")crée une instance de la classeenregistre cette instance auprès de la classe DriverManager
Class.forName("oracle.jdbc.driver.OracleDriver");// pilote OracleClass.forName("sun.jdbc.odbc.JdbcOdbcDriver");// pilote ODBCClass.forName("com.mysql.jdbc.Driver");// pilote MySQL
Certains compilateurs refusent cette notation et demandent plutôt :
Class.forName("driverName"). newInstance ();
M. Belguidoum (UMC) Programmation réseau 19 / 52
Mise en ÷uvre de JDBC
Étape 2 : connexion à la base
On utilise la méthode getConnection() de DriverManager avectrois arguments :
l'URL (Uniform Ressource Locator) de la base de données de la forme :jdbc:typedriver:base
le nom de l'utilisateur de la base : userson mot de passe : password
Connection connexion = DriverManager.getConnection(url ,user ,password );
le DriverManager essaie tous les drivers enregistrés (chargés enmémoire avec Class.forName()) jusqu'à ce qu'il trouve un driver quilui fournisse une connexion
M. Belguidoum (UMC) Programmation réseau 20 / 52
Mise en ÷uvre de JDBC
Etape 3 : Créer/exécuter une requête
Une fois une Connection créée on peut l'utiliser pour créer et exécuterdes requêtes (statements) SQL.
3 types (interfaces) d'objets statement :
Statement : requêtes simples (SQL statique)PreparedStatement : requêtes précompilées (SQL dynamique sisupporté par SGBD) qui peuvent améliorer les performancesCallableStatement : encapsule procédures SQL stockées dans leSGBD
3 méthodes d'exécutions :executeQuery : pour les requêtes qui retournent un résultat (SELECT)
résultat accessible au travers d'un objet ResultSet
executeUpdate : pour les requêtes qui ne retournent pas de résultat(INSERT, UPDATE, DELETE, CREATE TABLE et DROP TABLE)execute : quand on ne sait pas si la requête retourne ou non unrésultat, procédures stockées
M. Belguidoum (UMC) Programmation réseau 21 / 52
Mise en ÷uvre de JDBC
Etape 3 : Créer/exécuter une requête
Création d'un statement :
Statement state = connexion.createStatement ();
Exécution de la requête :
String myQuery = "SELECT prenom , nom , email " +"FROM employe " +"WHERE (nom='Dupont ') AND (email IS NOT NULL) " +"ORDER BY nom";ResultSet resultat = state.executeQuery(myQuery );
executeQuery(String q) renvoie un objet de type ResultSetdécrivant la table des résultats
M. Belguidoum (UMC) Programmation réseau 22 / 52
Mise en ÷uvre de JDBC
Etape 4 : traiter les données retournées
executeQuery() : renvoie une instance de ResultSet qui permetd'accéder aux champs des n-uplets sélectionnés
seules les données demandées sont transférées en mémoire par ledriver JDBC
il faut donc les lire "manuellement" et les stocker dans des variablespour un usage ultérieur
Les rangées du ResultSet se parcourent itérativement ligne (row) parligne
boolean next() : permet d'avancer à la ligne suivante, retourne falsesi pas de ligne suivantePlacé avant la première ligne à la création du ResultSetLes colonnes sont référencées par leur numéro ou par leur nomL'accès aux valeurs des colonnes se fait par des méthodes (StringnomCol) ou getXXX(int numCol) où XXX dépend du type de lacolonne dans la table SQLPour les très gros row, on peut utiliser des streams.
M. Belguidoum (UMC) Programmation réseau 23 / 52
Mise en ÷uvre de JDBC
Etape 4 : Exemple de lecture des résultats
java.sql.Statement stmt = conn.createStatement ();ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");while (rs.next ()){int i = rs.getInt("a"); // rs.getInt (1); en SQL les numéros de colonnes
// débutent à 1String s = rs.getString("b"); // rs.getString (2);byte b[] = rs.getBytes("c"); // rs.getBytes (3);System.out.println("ROW = " + i + " " + s + " " + b[0]);}
M. Belguidoum (UMC) Programmation réseau 24 / 52
Mise en ÷uvre de JDBC
ResultSet
exécuter next() au moins une fois pour avoir le premier
Impossible de revenir au n-uplet précédent ou de parcourir l'ensembledans un ordre non séquentiel
On peut parcourir le ResultSet d'avant en arrière : next() vs.previous()
en déplacement absolu (aller à la n-ième ligne) : absolute(introw), first(), last(), ...
en déplacement relatif (aller à la n-ième ligne à partir de la positioncourante du curseur) : relative(int row), afterLast(),
beforeFirst(), ...
M. Belguidoum (UMC) Programmation réseau 25 / 52
Mise en ÷uvre de JDBC
ResultSet
Méthodes de parcours
first() : Positionne sur la première ligne (1er enregistrement)last() : Positionne sur la dernière ligne (dernier enregistrement)next() : Passe à la ligne suivanteprevious() : Passe à la ligne précédantebeforeFirst() : Positionne avant la première ligneafterLast() : Positionne après la dernière ligneabsolute(int) : Positionne à une ligne donnéerelative(int) : Déplacement d'un nombre de lignes donné parrapport à ligne courante
Méthodes de test de la position du curseur
boolean isFirst() : True si curseur positionné sur la première ligneboolean isBeforeFirst() : True si curseur positionné avant lapremière ligneboolean isLast() : True si curseur positionné sur la dernière ligneboolean isAfterLast() : True si curseur positionné après la dernièreligne
M. Belguidoum (UMC) Programmation réseau 26 / 52
Mise en ÷uvre de JDBC
Étapes 5 : fermer les connexions
Pour terminer proprement un traitement, il faut fermer les di�érentsespaces ouverts. Le ramasse-miettes peut le faire mais de façon moinse�cace
Chaque objet possède une méthode close() :
resultset.close ();statement.close ();connection.close ();
M. Belguidoum (UMC) Programmation réseau 27 / 52
Equivalence des types java-SQL
Equivalence des types java-SQL
M. Belguidoum (UMC) Programmation réseau 28 / 52
Equivalence des types java-SQL
Exemple complet
import java.sql .*;public class PrintAllEmployees {public static void main(String [] args)throws SQLException , ClassNotFoundException {String dbUrl = "jdbc:mysql :// localhost :3306/ yaps";String user = "root", password = "";// Chargement dynamique du driverClass.forName("com.mysql.jdbc.Driver");Connection conn; // Etablissement de la connexionconn = DriverManager.getConnection(dbUrl , user , password );Statement st = conn.createStatement (); // Création d'un statementString anSQLquery = "SELECT prenom , nom , age FROM employe ";// Exécution de la requêteResultSet r = st.executeQuery(anSQLquery );// Parcours du résultatwhile(r.next ()) {String nom = r.getString("nom");
int age = r.getInt("age");System.out.println(nom + ", " + age + " ans");
}r.close (); st.close (); conn.close (); }}
M. Belguidoum (UMC) Programmation réseau 29 / 52
Equivalence des types java-SQL
Invocation d'une requête SQL de sélection
String anSQLquery = "SELECT prenom , nom , age FROM employe";// Création d'un statementStatement st = conn.createStatement ();// Exécution de la requêteResultSet r = st.executeQuery(anSQLquery );
M. Belguidoum (UMC) Programmation réseau 30 / 52
Equivalence des types java-SQL
Parcours du résultat : ResultSet
String query = "SELECT nom , age ...";ResutSet r = st.executeQuery(query);while(r.next ()) {
String nom = r.getString("nom");int age = r.getInt (2);// ...
}
M. Belguidoum (UMC) Programmation réseau 31 / 52
Equivalence des types java-SQL
Invocation d'une requête SQL de mise à jour
Dans le cas d'une modi�cation de donnée (INSERT, UPDATE,DELETE), on utilise la méthode executeUpdate(...) qui renvoie unentier spéci�ant le nombre d'enregistrements modi�és
String reqSql = "DELETE FROM ...";int n = st.executeUpdate(reqSql)
M. Belguidoum (UMC) Programmation réseau 32 / 52
Fonctionnalités supplémentaires de JDBC
Avec JDBC, on peut aussi ...
Exécuter des requêtes SQL pré-compilées :java.sql.PreparedStatement
Exécuter des procédures stockées : java.sql.CallableStatement
Utiliser des transactions
Accéder aux méta-données (schéma) de la base :java.sql.DatabaseMetaData
Manipuler des BLOBs
M. Belguidoum (UMC) Programmation réseau 33 / 52
Fonctionnalités supplémentaires de JDBC
Requêtes pré-compilées
La plupart des SGBD o�re la possibilité de n'analyser qu'une seule foisune requête
JDBC permet de béné�cier de cette fonctionnalité
L'objet PreparedStatement envoie une requête sans paramètres à labase de données pour précompilation et spéci�era le moment voulu lavaleur des paramètres
plus rapide qu'un Statement classiquele SGBD n'analyse qu'une seule fois la requête (recherche d'unestratégie d'exécution adéquate)pour de nombreuses exécutions d'une même requête SQL avec desparamètres variables
tous les SGBD n'acceptent pas les requêtes précompilées
M. Belguidoum (UMC) Programmation réseau 34 / 52
Fonctionnalités supplémentaires de JDBC
Création d'une requête pré-compilée
La méthode prepareStatement() de l'objet Connection crée unPreparedStatement :
PreparedStatement ps =c.prepareStatement("SELECT * FROM Clients "+
"WHERE name = ? ");
les paramètres sont spéci�és par un " ?"
ils sont ensuite instanciés par les méthodes setInt(), setString(),setDate(),...
ces méthodes nécessitent 2 arguments (setInt(n, valeur))
le premier (int) indique le numéro relatif de l'argument dans larequêtele second indique la valeur à positionner
setNull(n,type) positionne le paramètre à NULL (SQL)
M. Belguidoum (UMC) Programmation réseau 35 / 52
Fonctionnalités supplémentaires de JDBC
Exécution d'une requête pré-compilée
PreparedStatement ps =c.prepareStatement("UPDATE emp SET sal = ? "+ "WHERE name = ?");
�for(int i = 0; i < 10; i++) {
ps.setFloat(1, salary[i]);ps.setString(2, name[i]);int count = ps.executeUpdate ();
}
M. Belguidoum (UMC) Programmation réseau 36 / 52
Fonctionnalités supplémentaires de JDBC
Avantages des PreparedStatement
Traitement plus rapide si utilisés plusieurs fois avec plusieursparamètres
Amélioration de la portabilité car les méthodes setXXX() n'ont pas àtenir compte des di�érences entre SGBD
Exemple : les SGBD n'utilisent pas tous les mêmes formats de date('JJ/MM/ AA' ou 'AAAA-MM-JJ') ou de chaînes de caractères (pourles caractères d'échappement)
M. Belguidoum (UMC) Programmation réseau 37 / 52
Fonctionnalités supplémentaires de JDBC
Les procédures stockées
procédures permettant de fournir la même fonctionnalité à plusieursutilisateurs
procédure stockée dans la base côté serveur
JDBC o�re une interface dédiée
CallableStatement
dérive de l'interface PreparedStatementgère le retour de valeur avec ResultSet
Comment
création d'un objet CallableStatementen utlisant Connection.prepareCall(...)
M. Belguidoum (UMC) Programmation réseau 38 / 52
Fonctionnalités supplémentaires de JDBC
Appel des procédures stockées
La requête doit être formatée
encadrée par des accolades {...}utilisation du pré�xe call
Trois modes pour l'appel
la procédure renvoie une valeur : { ? = call
nomProcédure(?,?,...)}
la procédure ne renvoie aucune valeur :{ call nomProcédure(?,?,...)}
si on ne lui passe aucun paramètre :{ call nomProcédure }
Passage de paramètres possible : comme pour PreparedStatement
M. Belguidoum (UMC) Programmation réseau 39 / 52
Fonctionnalités supplémentaires de JDBC
Example CallableStatement sans valeur de retour
CallableStatement testCall;testCall = conn.prepareCall(
"{ call setSalary (?,?) }");testCall.setString (1, "EUR");testCall.setLong(2, 2000);testCall.execute ();
M. Belguidoum (UMC) Programmation réseau 40 / 52
Fonctionnalités supplémentaires de JDBC
Accéder aux résultats
Un PreparedStatement peut retourner des données grâce à unResultSet
Les procédures stockées étendent le modèle
appel de la procédure précédé du passage des paramètres in et outgrâce aux méthodes setXXX()type des paramètres out et in/out grâce à la méthoderegisterOutParameter()
exécution de la requête grâce à executeQuery(), executeUpdate()ou execute()
récupération des paramètres out et in/out grâce aux méthodesgetXXX()
M. Belguidoum (UMC) Programmation réseau 41 / 52
Fonctionnalités supplémentaires de JDBC
Exemple d'une procédure stockée
create or replace procedure augmentation(unDept in integer ,pourcentage in number ,cout out number) is
beginupdate emp
set sal = sal * (1 + pourcentage / 100)where dept = unDept;
select sum(sal) * pourcentage / 100 into coutfrom empwhere dept = unDept;
end;
M. Belguidoum (UMC) Programmation réseau 42 / 52
Fonctionnalités supplémentaires de JDBC
Exemple suite CallableStatement
CallableStatement csmt = conn.prepareCall("{ call augmentation (?, ?, ?) }");
// 2 chiffres après la virgule pour 3ème paramètrecsmt.registerOutParameter (3, Types.DECIMAL , 2);// Augmentation de 2,5 % des salaires du dept 10csmt.setInt(1, 10);csmt.setDouble(2, 2.5);csmt.executeQuery ();double cout = csmt.getDouble (3);System.out.println("Cout total augmentation : "
+ cout);
M. Belguidoum (UMC) Programmation réseau 43 / 52
Fonctionnalités supplémentaires de JDBC
Transactions
3 services déclarés dans l'interface Connection :
setAutoCommit(boolean b)
commit() : valide une transactionrollback() : annulle une transaction
Les nouvelles connexions sont initialement en mode auto-commit =>commit implicite après chaque requête SQL
Pour dé�nir une transaction composée de plusieurs requêtes SQL, ilfaut désactiver l'auto-commit : conn.setAutoCommit(false)
Un appel à commit() ou rollback() va alors créer implicitement unenouvelle transaction
M. Belguidoum (UMC) Programmation réseau 44 / 52
Fonctionnalités supplémentaires de JDBC
Transactions : Exemple
// Désactiver l'auto -commitconn.setAutoCommit(false);try {// les requêtes SQL suivantes constituent// une seule transactionst.executeUpdate("INSERT ...");st.executeUpdate("DELETE ...");st.executeUpdate("UPDATE ...");// valider la transactionconn.commit ();st.close ();}catch(java.sql.SQLException e) { conn.rollback (); }
M. Belguidoum (UMC) Programmation réseau 45 / 52
Fonctionnalités supplémentaires de JDBC
Accès aux méta-données
JDBC permet de récupérer des informations sur le type de donnéesque l'on vient de récupérer par un SELECT (interfaceResultSetMetaData) et sur la base elle-même (interfaceDatabaseMetaData)
Interface ResultSetMetaData
méthode getMetaData() permet d'obtenir des informations sur lestypes de données du ResultSet
elle renvoie des instances de ResultSetMetaDataon peut connaître :
le nombre de colonne : getColumnCount()
le nom d'une colonne : getColumnName(int col)
le nom de la table : getTableName(int col)
M. Belguidoum (UMC) Programmation réseau 46 / 52
Fonctionnalités supplémentaires de JDBC
Exemple : ResultSetMetaData
ResultSet rs = st.executeQuery("SELECT * FROM emp");
ResultSetMetaData rsmd = rs.getMetaData ();int nbColonnes = rsmd.getColumnCount ();for (int i = 1; i <= nbColonnes; i++) {
String typeColonne = rsmd.getColumnTypeName(i);String nomColonne= rsmd.getColumnName(i);System.out.println("Colonne " + i
+ " de nom " + nomColonne+ " de type " + typeColonne );
}
M. Belguidoum (UMC) Programmation réseau 47 / 52
Fonctionnalités supplémentaires de JDBC
Interface DatabaseMetaData
informations sur la base de données
méthode getMetaData() de l'objet Connection
dépend du SGBD avec lequel on travaille
elle renvoie des instances de DatabaseMetaData
on peut connaître :
les tables de la base : getTables()le nom de l'utilisateur : getUserName()...
M. Belguidoum (UMC) Programmation réseau 48 / 52
Fonctionnalités supplémentaires de JDBC
CLOB et BLOB
2 types d'objets larges :
CLOB : Character large objectBLOB : Binary large
Une colonne de type BLOB est en fait un pointeur vers un �chier
create table userImages (user varchar (50), image BLOB)String q ="insert into userImages values('dewez ', ?)";Statement pstmt = con.prepareStatement(q);File file = new File("dewez.jpg");InputStream fin = new FileInputStream(file);pstmt.setBinaryStream (1, fin , file.length ());pstmt.executeUpdate ();
M. Belguidoum (UMC) Programmation réseau 49 / 52
Fonctionnalités supplémentaires de JDBC
Lire un BLOB
String q = "select image from userImages"ResultSet rs = stmt.executeQuery(q);while (rs.next) {Blob b = rs.getBlob("image");InputStream stream = b.getBinaryStream ();// ...}
M. Belguidoum (UMC) Programmation réseau 50 / 52
Fonctionnalités supplémentaires de JDBC
Conclusion
Interface pour un accès homogène
le concept de Driver masque au maximum les di�érences des SGBDAPI de bas niveau : il faut connaître SQL
Tous les éditeurs proposent un driver JDBC
Problèmes
JDBC n'e�ectue aucun contrôle sur les instructions SQLCorrespondance entre classes Java et relations est un travail de basniveau
M. Belguidoum (UMC) Programmation réseau 51 / 52
Fonctionnalités supplémentaires de JDBC
Références
The JDBC Tutorial : Chapter 3 - Advanced Tutorial,http://java.sun.com/developer/Books/JDBCTutorial/
slides de Olivier Perrin et philippe Genoud
Christian Soutou, "Apprendre SQL avec MySQL : Avec 40 exercicescorrigés"
M. Belguidoum (UMC) Programmation réseau 52 / 52