Article n° 24

En ligne: 8 mai 2010
Modifié le: 8 mai 2010
Popularité: 13
Nb visites: 5948

mots clés

Java , langages , SGBD

Java

Se connecter à une base de données via JDBC

Par: Chris

Il est courant aujourd’hui d’avoir à développer des applications bases de données relationnelles. En java c’est l’API et les drivers JDBC qui fournissent les fonctionnalités permettant de se connecter et d’exécuter des requêtes SQL sur une base de données. L’intérêt de cette API est de fournir une méthodes d’accès standard quelque soit le SGBD utilisé.

 8. Ensemble résultats défilant et vivants

Depuis la version 2 de JDBC, il est possible d’avoir des résultats de requêtes défilant. C’est à dire que vous pourrez non seulement avancer mais aussi reculer dans la source de données. Cela peut être utile si vous désirez relier votre ResultSet à un JTable dans le but de visualiser le résultat dans une interface graphique. Il pourra être également intéressant de pouvoir modifier une ligne du ResultSet et que cela entraine la mise à jour de la base de données ou au contraire, si les données de la base évoluent que le ResultSet reflète ces changements pour mettre à jour l’affichage. Pour préciser ses options nous utiliserons l’une des méthodes suivantes :

Statement st = connection.createStatement( type, concurrency );

ou pour une requête préparée :

PreparedStatement st =
                connection.prepareStatement( requête, type, concurrency );

Grace aux 2 paramètres types et concurrency vous pourrez spécifier le comportement du ResultSet. Les tableaux suivant résument les différentes options possibles. Les valeurs pour type :

Constante
TYPE_FORWARD_ONLY Pas de possibilité de défilement
TYPE_SCROLL_INSENSITIVE On peut faire défiler l’ensemble de résultat mais ne se met pas à jour automatiqument en cas de changement dans la base.
TYPE_SCROLL_SENSITIVE On peut faire défiler l’ensemble résultat et ce dernier est mis à jour en cas de changement dans la base.

Les valeurs pour concurrency :

Constante
ONCUR_READ_ONLY L’ensemble résultat ne peut être utilisé pour mettre à jour la base de données.
CONCUR_UPDATABLE L’ensemble résultat peut être utilisé pour mettre à jour la base de données.

Par exemple, si vous désirez faire défiler un ensemble résultat en lecture seule vous pourriez utiliserer le code suivant :

Statement st = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,
                                                 ResultSet.CONCUR_READ_ONLY );

Vous pouvez maintenant vous déplacer dans votre ensemble de données en utilisant les méthodes suivantes :

Pour aller à l’enregistrement suivant :

if ( resultset.next() ) …

Pour aller à l’enregistrement précédent :

if ( resultset.previous() ) …

Déplacement relatif vers l’avant ou l’arrière :

resultset.relative( n );

Déplacement absolut :

resultset.absolute( n );

Les précédentes méthodes renvoient true si après la tentative de déplacement elles se trouvent sur un enregistrement. Si ce n’est pas possible, le curseur se positionne avant le premier enregistrement ou après le dernier et renvoi false.

Il est également possible de récupérer le n° de ligne actuelle à avec la méthode suivante :

int n = resultset.getRow();

La première ligne a la valeur 1. Si la méthode renvoi 0 c’est que le curseur ne se trouve pas sur une ligne.

Un certains nombre de méthodes existent pour se déplacer directement sur le premier ou dernier enregistrement et pour tester si c’est le cas :

first(), last(), beforeFirst(), afterLast(), isFirst(), isLast()...

Pour utiliser un ensemble de données actualisables, vous devrez utiliser d’abord les méthodes suivantes pour mettre à jour les champs :

resultset.updateString( champ, valeur );
resultset.updateDouble( champ, valeur );

Vous trouverez une méthode updateXXX pour tous les types de dnnées. Comme pour les méthodes get et set, vous pouvez spécifier le champ par son nom ou son nuyméro.

Ensuite vous devrez valider (enregistrement dans la base) la mise à jour de la ligne en cours avec la méthode :

resultset.updateRow();

ou annuler cette mise à jour avec :

resultset.cancelRowUpdate();

Exemple de code de mise à jour :

Statement st = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,
                                                  ResultSet.CONCUR_UPDATE );

ResultSet rs = st.executeQuery( requeteSql );

rs.updateString( "CMP_NOM", "BACH" );
rs.updateRow();

Pour passer en mode ajout d’un enregistrement vous devrez utiliser la méthode suivante :

resultset.moveToInsertRow();

Initialisez les champs avec des méthodes updateXxxx puis validez avec la méthode :

resultset.insertRow();

Vous pourrez repositionner le curseur sur la ligne courante avec :

resultset.moveToCurrentRow();

Pour supprimer la ligne courante de la base utilisez :

resultset.deleteRow();

Remarques et limites des requêtes lives

Les ensembles de résultats vivants demandent à ce que la connexion soit permanente. Vous ne devrez donc pas utiliser cette méthode pour une application Web. Il existe également une interface nommée RowSet qui permet d’avoir un ensemble de lignes défilantes sans pour autant être connecté à une source de données.

Il y a plusieurs niveaux de drivers qui vont supporter ou pas l’ensemble des possibilités du ResultSet selon que vous aurez des drivers de type JDBC1, JDBC2 ou JDBC3.

Indépendamment du niveau de driver, il est également possible que vous ne puissiez pas mettre à jour des données à partir un ensemble de résultats s’il s’agit d’une requête complexe ou comportant des jointures.

SPIP |