English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JDBC Statement, PreparedStatement et CallableStatement

Une fois la connexion obtenue, nous pouvons interagir avec la base de données. Les interfaces JDBC Statement, CallableStatement et PreparedStatement définissent des méthodes et des propriétés qui vous permettent d'envoyer des SQL ou des PL/Commandes SQL et reçoivent des données de la base de données.

Elles définissent également des méthodes utiles pour combler les différences de types de données entre les types de données Java et SQL utilisés dans la base de données.

Le tableau suivant résume l'utilisation de chaque interface pour déterminer l'interface à utiliser.

Interface
Recommandé
Statement

Utilisez-le pour accéder de manière générale à la base de données. Il est très utile lorsque vous utilisez des instructions SQL statiques au moment de l'exécution. L'interface Statement ne peut pas accepter de paramètres.

PreparedStatement

Utilisez cette option lorsque vous prévoyez d'utiliser plusieurs fois des instructions SQL. L'interface PreparedStatement accepte des paramètres d'entrée au moment 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 des paramètres d'entrée au moment de l'exécution.

Objet Statement

Créer l'objet Statement

Avant de pouvoir utiliser l'objet Statement pour exécuter des instructions SQL, vous devez créer une instruction SQL à 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 l'objet Statement créé, vous pouvez utiliser l'une des trois méthodes d'exécution pour exécuter des instructions SQL.

  • boolean execute (String SQL):Retourne une valeur booléenne true si l'objet ResultSet peut être récupéré, sinon retourne false. Utilisez cette méthode pour exécuter des instructions SQL DDL dynamiques.

  • int executeUpdate (String SQL):Retourne le nombre de lignes affectées par l'instruction SQL. Vous pouvez utiliser cette méthode pour exécuter des instructions SQL qui affectent le nombre de lignes, telles que les instructions INSERT, UPDATE ou DELETE.

  • ResultSet executeQuery (String SQL):Retourne un objet ResultSet. Utilisez cette méthode pour obtenir un ensemble de résultats, comme avec une instruction SELECT.

Fermer l'objet Statement

Comme fermer l'objet Connection pour économiser les ressources de la base de données, pour les mêmes raisons, vous devriez également fermer l'objet Statement.

Il suffit d'appeler la méthode close() de manière simple. Si vous fermez d'abord l'objet Connection, il fermera également l'objet Statement. Cependant, vous devriez toujours fermer explicitement l'objet Statement pour vous assurer d'une nettoyage correct.

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

Pour mieux comprendre, nous vous recommandons de suivreTutoriel d'exemple Statement.

Objet PreparedStatement

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

Cette instruction vous permet de fournir des paramètres de manière flexible et dynamique.

Créer 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 dans JDBC sont créés par?les symboles représentent, ce symbole s'appelle un marqueur de paramètre. Vous devez fournir une valeur pour chaque paramètre avant d'exécuter l'instruction SQL.

CessetXXX()La méthode lie des valeurs aux paramètres, oùXXXReprésente le type de données Java que vous souhaitez lier à un paramètre d'entrée. Si vous oubliez de fournir une valeur, une SQLException sera lancée.

Chaque marqueur de paramètre est référencé par son positionnement ordinal. Le premier marqueur représente une position1La deuxième représente une position2Et ainsi de suite. Cette méthode est différente de la méthode d'indexage des tableaux Java, qui commence à 0.

Les méthodes de tous les objets Statement utilisés pour interagir avec la base de données (a) execute (), (b) executeQuery () et (c) executeUpdate () peuvent également être utilisées avec des objets PreparedStatement. Cependant, ces méthodes sont modifiées pour utiliser des requêtes SQL pouvant accepter des paramètres.

Fermer l'objet PreparedStatement

Comme pour fermer l'objet Statement, pour les mêmes raisons, vous devriez également fermer l'objet PreparedStatement.

Un simple appel à la méthode close() suffit. Si vous fermez d'abord l'objet Connection, il fermera également l'objet PreparedStatement. Cependant, vous devriez toujours fermer explicitement l'objet PreparedStatement pour vous assurer d'une 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 mieux comprendre, apprenonsExemple de code PreparedStatement.

Objet CallableStatement

Comme l'objet Connection crée des objets Statement et PreparedStatement, il crée également des objets CallableStatement, qui seront utilisés pour exécuter des appels aux procédures stockées de la base de données.

Créer un objet CallableStatement

Supposons que vous deviez exécuter le procédure stockée Oracle suivant-

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: Le procédure stockée ci-dessus a été écrite pour Oracle, mais nous utilisons une base de données MySQL, donc, écrivons le même procédure stockée pour MySQL, comme suit, afin de le 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. Les objets PreparedStatement ne utilisent que les paramètres IN. Les objets CallableStatement peuvent utiliser les trois.

Voici la définition de chacun-

PortéeDescription
IN

Les paramètres pour lesquels la valeur n'est pas connue lors de la création de l'expression SQL. Utilisez la méthode setXXX () pour lier la valeur à IN something.

OUT

Sa valeur est fournie par les paramètres du SQL retourné. Utilisez la méthode getXXX () pour récupérer les valeurs des paramètres.

INOUT

Il fournit à la fois des valeurs d'entrée et de sortie pour les paramètres. Vous pouvez lier les variables en utilisant la méthode setXXX () et récupérer les valeurs en utilisant la méthode getXXX ().

Le code suivant montre comment utiliser la méthode Connection.prepareCall () pour obtenir le procédure stockée précédente-Instanciation de l'objet CallableStatement

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

La variable de chaîne SQL, représentant le procédure stockée avec des placeholders de paramètres.

L'utilisation de l'objet CallableStatement est très similaire à celle de PreparedStatement. Vous devez lier les valeurs à tous les paramètres avant d'exécuter la phrase, sinon vous recevrez une SQLException.

Si l'IN paramètre est fourni, il suffit de suivre les mêmes règles et techniques appliquées aux objets PreparedStatement; utilisez la méthode setXXX () correspondant au type de données Java lié.

Lorsque vous utilisez des paramètres OUT et INOUT, vous devez utiliser des méthodes supplémentaires de CallableStatement, à savoir registerOutParameter(). La méthode registerOutParameter() lie le type de données JDBC au type de données attendu par la procédure stockée.

Après l'appel de la procédure stockée, vous pouvez utiliser des méthodes getXXX() appropriées pour extraire des valeurs à partir des paramètres OUT. Cette méthode convertit les valeurs de type SQL récupérées en types de données Java.

Fermeture de l'objet CallableStatement

Comme pour fermer d'autres objets Statement, pour les mêmes raisons, vous devriez également fermer l'objet CallableStatement.

Il suffit de called close() pour fermer. Si vous fermez d'abord l'objet Connection, il fermera également l'objet CallableStatement. Mais, vous devriez toujours fermer explicitement l'objet CallableStatement pour vous assurer d'une nettoyage correct.

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

Pour mieux comprendre, je recommande d'apprendreCode d'exemple CallableStatement.