Une présentation de la JDBC et des principaux appels de bases pour établir une connexion à un serveur de bases de données.
Les Pilotes JDBC
Quelques adresses à connaître :
Se connecter à JDBC :
- Les adresses sont de la forme:
jdbc:driver:nomDeLaBase
(exemple pour odbc :jdbc:odbc://adresseHote:port/nomBase;PWD=passwd
) - Enregistrer le pilote :
Class.forName(“driver”);;
- Se Connecter :
DriverManager.getConnection(url, username, pwd);
- Déboguer :
DriverManager.setLogWriter(stream);
Utiliser un contexte de connexions :
- Context jndiContext = …
- DataSource ds =
jndiContext.lookUp(“adresse”);
source.getConnection(user, password);
Les requêtes
Les requêtes de mise à jour :
- connexion.createStatement();
- statement.executeUpdate(); : utilisé pour les requetes INSERT, UPDATE, CREATE TABLE, DROP TABLE
- Renvoit le nombre de lignes modifiées.
Les requêtes de transactions :
- connexion.getAutoCommit : retourne un booléean indiquant si les requêtes sont automatiquement commitées.
- connexion.setAutoCommit(boolean)
- Exécuter x requetes
- ok : commit(); sinon rollback(); (SQLException retournée sur une des requêtes);
Les requêtes de sélection :
- executeQuery : retourne un ResultSet.
- Parcourir ce ResultSet :
// N'agit pas comme un iterator : le premier next place le pointeur sur le premier élément while result.next() result.getString(noColonne ou nomcolonne); result.getDouble(...); ... // retourne l'index de la colonne (>=1 si elle existe). result.findColumn(nom) result.close();
Grouper un ensemble de commandes :
- statement.addBatch(requete);
- statement.executeBatch(); retourne un tableau d’int représentant le nombre de lignes modifiées par commande.
Les instructions préparées :
- requete paramétrée : Plus performant, le moteur ne la prépare qu’une fois.
- chaque champ modifiable est noté par un “?”
- connexion.preparetatement(requeteParamétrée);
- preparedStatement.setString(index(>=1), valeur);
- .setDouble, .setXXX…
- preparaedStatement.clearParameters();
Les métadonnées :
- Database.getMetaData : founit les meta de la base; ensemble très complet, voir la doc java.
- Resultset.getMetaData : fournit des indications telles que le nombre de colonnes du resultSet, leur Label (titre suggéré), leur nom, etc.
La mise à jour des données
La modification d’un resultSet permet de mettre à jour les donneés en base sans avoir à recréer de requête.
Il faut pour cela définir un type de scrolling, et définir une concurrence lorsqu’on crée un preparedStatement ou un statement.
Les types :
- TYPE_FORWARD_ONLY
- TYPE_SCROLL_SENSITIVE
- TYPE_SCROLL_INSENSITIVE
Les concurrences :
- CONCUR_READ_ONLY
- CONCUR_UPDATABLE
Pour déterminier si des modifications sont possibles il faut que les clauses suivantes existent :
- Database.MetaData.supportsResultSetConcurrency, et Database.MetaData.supportsResultSetType soient ok.
- Aucun retour de Warning sur le resultset (resultSet.getWarnings)
Autrement, la tentavie de modification d’une des données engendrera une SQLException.
Le parcours d’un resultSet peut se faire grâce à :
- first, previous, relative(i), absolute(i), getRow, last, beforeFirst, afterLast, isFirst, isLast ,etc.
Pour insérer un nouvel enregistrement dans un resultSet :
rs.cancelUpdates() rs.moveToInsertRow() rs.updateString(...) rs.updateXXX(...) rs.insertRow(); // retour à l'ancienne position. rs.moveToCurrentRow()
Pour supprimer un enregistrement :
rs.deleteRow();