Personnalisation de l'ensemble de résultats

L'API JDBC moderne vous permet de personnaliser considérablement les objets.DéclarationEtensemble de résultats. Par exemple, en utilisantensemble de résultatsvous pouvez modifier les lignes de la base de données.

Lors de la création d'un objet de déclaration, nous pouvons y transmettre un tas de nos souhaits. Ces souhaits peuvent être divisés en trois groupes :

  • Type de connexion de base
  • Contrôle d'accès simultané
  • Persistance et transactions

Ces paramètres peuvent être passés lors de la création d'un objetDéclarationouAffirmation préparée. Exemple:

Statement statement = connection.createStatement(
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT );

PreparedStatement statement = connection.prepareStatement(sql,
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT);

Nous n'étudierons pas ces choses en profondeur, mais je veux que vous sachiez que cela est possible si vous rencontrez quelque chose de similaire dans le code de quelqu'un d'autre.

Types d'ensembles de résultats

ResultSet peut être d'un type spécifique. Le type définit certaines des caractéristiques et capacités du ResultSet.

Tous les types ne sont pas pris en charge par toutes les bases de données et les pilotes JDBC. Vous devrez vérifier votre base de données et votre pilote JDBC pour voir s'il prend en charge le type que vous souhaitez utiliser. La méthode DatabaseMetaData.supportsResultSetType(int type) renvoie true ou false selon que le type donné est pris en charge ou non.

Au moment de la rédaction, il existe trois types de ResultSet :

  • Jeu de résultats.TYPE_FORWARD_ONLY
  • Jeu de résultats.TYPE_SCROLL_INSENSITIVE
  • Jeu de résultats.TYPE_SCROLL_SENSITIVE

Le type par défaut est TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY signifie que le ResultSet ne peut être déplacé que vers l'avant. Autrement dit, vous ne pouvez vous déplacer qu'à partir de la ligne 1, de la ligne 2, de la ligne 3, etc. Dans un ResultSet, vous ne pouvez pas revenir en arrière : vous ne pouvez pas lire les données de la 9e ligne après avoir lu la dixième.

TYPE_SCROLL_INSENSITIVE signifie que le ResultSet peut être déplacé (défilé) vers l'avant ou vers l'arrière. Vous pouvez également vous déplacer vers une position relative à la position actuelle ou vers une position absolue.

Un ResultSet de ce type est insensible aux modifications apportées à la source de données sous-jacente lorsque le ResultSet est ouvert. Autrement dit, si une entrée du ResultSet est modifiée dans la base de données par un autre thread ou processus, elle ne sera pas reflétée dans le fichier déjà ouvert.ensemble de résultatsde ce type.

TYPE_SCROLL_SENSITIVE signifie que le ResultSet peut être déplacé (défilé) vers l'avant ou vers l'arrière. Vous pouvez également vous déplacer vers une position relative à la position actuelle ou vers une position absolue.

Un ResultSet de ce type est sensible aux modifications de la source de données sous-jacente lorsque le ResultSet est ouvert. Autrement dit, si une entrée dans le ResultSet est modifiée dans la base de données par un autre thread ou processus, elle sera reflétée dans le déjà ouvertensemble de résultatsde ce type.

Concurrence

La concurrence d'un ResultSet détermine si le ResultSet peut être mis à jour ou seulement lu.

Certaines bases de données et pilotes JDBC prennent en charge la mise à jour d'un ResultSet, mais pas tous. La méthode DatabaseMetaData.supportsResultSetConcurrency(int concurrency) renvoie true ou false selon que le mode de concurrence donné est pris en charge ou non.

ResultSet peut avoir l'un des deux niveaux de simultanéité :

  • Jeu de résultats.CONCUR_READ_ONLY
  • Jeu de résultats.CONCUR_UPDATABLE

CONCUR_READ_ONLY signifie que le ResultSet ne peut être lu qu'en lecture.

CONCUR_UPDATABLE signifie que le ResultSet peut être lu et modifié.

Un exemple de changement de données dans la base de données

Avec ces paramètres, vous pouvez contrôler le Statement généré et son ResultSet.

Par exemple, vous pouvez créer un ResultSet pouvant être mis à jour et l'utiliser pour modifier la base de données. Lors de la création d'un Statement, il est important de respecter les conditions suivantes :

  • une seule table est spécifiée
  • ne contient pas de clauses join ou group by
  • les colonnes de requête doivent contenir une clé primaire

Lorsque les conditions ci-dessus sont remplies, le ResultSet mis à jour peut être utilisé pour mettre à jour une table dans la base de données. Lors de la création d'un objet Statement, vous devez spécifier les paramètres suivants :

Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)

Le résultat de l'exécution d'une telle instruction est un ensemble de résultats pouvant être mis à jour. La méthode de mise à jour consiste à déplacer le curseur ResultSet sur la ligne que vous souhaitez mettre à jour, puis à appeler la méthode updateXXX() .

La méthode updateXXX fonctionne de la même manière que la méthode getXXX() . La méthode updateXXX() a deux paramètres. Le premier est le numéro de la colonne mise à jour, qui peut être un nom de colonne ou un numéro de série. Le second est les données qui doivent être mises à jour, et ce type de données doit être le même que XXX.

Pour réellement mettre à jour la ligne dans la base de données, vous devez appeler la méthode updateRow() avant que le curseur ResultSet ne quitte la ligne modifiée, sinon les modifications n'entreront pas dans la base de données.

Vous pouvez également ajouter de nouvelles lignes au tableau :

Vous devez d'abord déplacer le curseur sur une ligne vide. Pour ce faire, appelez la méthode moveToInsertRow() .

Ensuite, vous devez remplir cette ligne avec des données à l'aide de la méthode updateXXX() .

Ensuite, vous devez appeler la méthode inserterRow() pour ajouter la ligne à la base.

Et enfin, vous devez renvoyer le curseur en appelant la méthode moveToCurrentRow() .

Important! Tous les SGBD ne prennent pas en charge ces options pour la déclaration étendue. En cas de problème, consultez la documentation officielle d'un SGBD particulier.