JDBC - Statements, PreparedStatement et CallableStatement

Une fois la connexion établie, nous pouvons interagir avec la base de données. Les interfaces JDBC Statement, CallableStatement et PreparedStatement définissent les méthodes et les propriétés qui vous permettent d'envoyer des commandes SQL ou PL / SQL et de recevoir des données de votre base de données.

Ils définissent également des méthodes qui aident à combler les différences de type de données entre les types de données Java et SQL utilisés dans une base de données.

Le tableau suivant fournit un résumé de l'objectif de chaque interface pour décider de l'interface à utiliser.

Interfaces Utilisation recommandée
Déclaration Utilisez-le pour un accès général à votre base de données. Utile lorsque vous utilisez des instructions SQL statiques au moment de l'exécution. L'interface Statement ne peut pas accepter de paramètres.
Affirmation préparée Utilisez cette option lorsque vous prévoyez d'utiliser les instructions SQL plusieurs fois. L'interface PreparedStatement accepte les paramètres d'entrée lors de l'exécution.
CallableStatement Utilisez cette option lorsque vous souhaitez accéder aux procédures stockées de la base de données. L'interface CallableStatement peut également accepter les paramètres d'entrée d'exécution.

Les objets de déclaration

Création d'un objet Statement

Avant de pouvoir utiliser un objet Statement pour exécuter une instruction SQL, vous devez en créer une à l'aide de la méthode createStatement () de l'objet Connection, comme dans l'exemple suivant -

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

Une fois que vous avez créé un objet Statement, vous pouvez l'utiliser pour exécuter une instruction SQL avec l'une de ses trois méthodes d'exécution.

  • boolean execute (String SQL): Renvoie une valeur booléenne de true si un objet ResultSet peut être récupéré; sinon, il renvoie false. Utilisez cette méthode pour exécuter des instructions SQL DDL ou lorsque vous avez besoin d'utiliser un SQL vraiment dynamique.

  • int executeUpdate (String SQL): Renvoie le nombre de lignes affectées par l'exécution de l'instruction SQL. Utilisez cette méthode pour exécuter des instructions SQL pour lesquelles vous prévoyez d'obtenir un certain nombre de lignes affectées - par exemple, une instruction INSERT, UPDATE ou DELETE.

  • ResultSet executeQuery (String SQL): Renvoie un objet ResultSet. Utilisez cette méthode lorsque vous prévoyez d'obtenir un jeu de résultats, comme vous le feriez avec une instruction SELECT.

Objet de l'instruction de clôture

Tout comme vous fermez un objet Connection pour enregistrer les ressources de la base de données, pour la même raison, vous devez également fermer l'objet Statement.

Un simple appel à la méthode close () fera l'affaire. Si vous fermez d'abord l'objet Connection, il fermera également l'objet Statement. Cependant, vous devez toujours fermer explicitement l'objet Statement pour garantir un nettoyage correct.

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   stmt.close();
}

Pour une meilleure compréhension, nous vous suggérons d'étudier le didacticiel Déclaration - Exemple .

Les objets PreparedStatement

L' interface PreparedStatement étend l'interface Statement, qui vous offre des fonctionnalités supplémentaires avec quelques avantages par rapport à un objet Statement générique.

Cette instruction vous donne la flexibilité de fournir des arguments de manière dynamique.

Création d'un objet PreparedStatement

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

Tous les paramètres de JDBC sont représentés par le ?symbole, appelé marqueur de paramètre. Vous devez fournir des valeurs pour chaque paramètre avant d'exécuter l'instruction SQL.

le setXXX() méthodes lient les valeurs aux paramètres, où XXXreprésente le type de données Java de la valeur que vous souhaitez lier au paramètre d'entrée. Si vous oubliez de fournir les valeurs, vous recevrez une exception SQLException.

Chaque marqueur de paramètre est référencé par sa position ordinale. Le premier marqueur représente la position 1, la position suivante 2, et ainsi de suite. Cette méthode diffère de celle des indices de tableau Java, qui commence à 0.

La totalité de la Statement object'sLes méthodes d'interaction avec la base de données (a) execute (), (b) executeQuery () et (c) executeUpdate () fonctionnent également avec l'objet PreparedStatement. Cependant, les méthodes sont modifiées pour utiliser des instructions SQL qui peuvent entrer les paramètres.

Fermer l'objet PreparedStatement

Tout comme vous fermez un objet Statement, pour la même raison, vous devez également fermer l'objet PreparedStatement.

Un simple appel à la méthode close () fera l'affaire. Si vous fermez d'abord l'objet Connection, il fermera également l'objet PreparedStatement. Cependant, vous devez toujours fermer explicitement l'objet PreparedStatement pour garantir un nettoyage correct.

PreparedStatement pstmt = null;
try {
   String SQL = "Update Employees SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   pstmt.close();
}

Pour une meilleure compréhension, étudions Prepare - Example Code .

Les objets CallableStatement

Tout comme un objet Connection crée les objets Statement et PreparedStatement, il crée également l'objet CallableStatement, qui serait utilisé pour exécuter un appel à une procédure stockée de base de données.

Création d'un objet CallableStatement

Supposons que vous deviez exécuter la procédure stockée Oracle suivante -

CREATE OR REPLACE PROCEDURE getEmpName 
   (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END;

NOTE: La procédure stockée ci-dessus a été écrite pour Oracle, mais nous travaillons avec la base de données MySQL donc, écrivons la même procédure stockée pour MySQL comme suit pour la créer dans la base de données EMP -

DELIMITER $$

DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName` 
   (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END $$

DELIMITER ;

Il existe trois types de paramètres: IN, OUT et INOUT. L'objet PreparedStatement utilise uniquement le paramètre IN. L'objet CallableStatement peut utiliser les trois.

Voici les définitions de chacun -

Paramètre La description
DANS Un paramètre dont la valeur est inconnue lors de la création de l'instruction SQL. Vous liez les valeurs aux paramètres IN avec les méthodes setXXX ().
EN DEHORS Un paramètre dont la valeur est fournie par l'instruction SQL qu'il renvoie. Vous récupérez les valeurs des paramètres OUT avec les méthodes getXXX ().
INOUT Un paramètre qui fournit à la fois des valeurs d'entrée et de sortie. Vous liez des variables avec les méthodes setXXX () et récupérez les valeurs avec les méthodes getXXX ().

L'extrait de code suivant montre comment utiliser le Connection.prepareCall() méthode pour instancier un CallableStatement objet basé sur la procédure stockée précédente -

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}

La variable String SQL, représente la procédure stockée, avec des espaces réservés de paramètre.

L'utilisation des objets CallableStatement est très similaire à l'utilisation des objets PreparedStatement. Vous devez lier des valeurs à tous les paramètres avant d'exécuter l'instruction, sinon vous recevrez une exception SQLException.

Si vous avez des paramètres IN, suivez simplement les mêmes règles et techniques qui s'appliquent à un objet PreparedStatement; utilisez la méthode setXXX () qui correspond au type de données Java que vous liez.

Lorsque vous utilisez les paramètres OUT et INOUT, vous devez utiliser une méthode CallableStatement supplémentaire, registerOutParameter (). La méthode registerOutParameter () lie le type de données JDBC au type de données que la procédure stockée est censée renvoyer.

Une fois que vous appelez votre procédure stockée, vous récupérez la valeur du paramètre OUT avec la méthode getXXX () appropriée. Cette méthode convertit la valeur récupérée du type SQL en un type de données Java.

Fermer l'objet CallableStatement

Tout comme vous fermez un autre objet Statement, pour la même raison, vous devez également fermer l'objet CallableStatement.

Un simple appel à la méthode close () fera l'affaire. Si vous fermez d'abord l'objet Connection, il fermera également l'objet CallableStatement. Cependant, vous devez toujours fermer explicitement l'objet CallableStatement pour garantir un nettoyage correct.

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   cstmt.close();
}

Pour une meilleure compréhension, je suggère d'étudier Callable - Example Code .