FAQ JDBCConsultez toutes les FAQ

Nombre d'auteurs : 8, nombre de questions : 162, dernière mise à jour : 3 juin 2015  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.


SommaireLes instructions - StatementLes instructions paramétrées - PreparedStatement (5)
précédent sommaire suivant
 

L'interface PreparedStatement étend Statement et représente une instruction paramétrée. Cette interface diffère de Statement sur deux points principaux :

  • les instances de PreparedStatement contiennent une instruction SQL déjà compilée. D'où le terme prepared. Cela améliore notamment les performances si cette instruction doit être appelée de nombreuses fois ;
  • les instructions SQL des instances de PreparedStatement contiennent un ou plusieurs paramètres d'entrée, non spécifiés lors de la création de l'instruction. Ces paramètres sont représentés par des points d'interrogation (?). Ces paramètres doivent être spécifiés avant l'exécution.

L'exécution des PreparedStatement est identique à celle des simples Statement, à la différence près qu'il n'y a pas d'argument aux méthodes executeXXX.

Mis à jour le 11 avril 2013 Ioan

L'instanciation de PreparedStatement se fait à partir de la classe Connection, grâce aux méthodes prepareStatement. Voici quelques exemples :

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
Connection connection = ...; 
PreparedStatement prep1 = connection.prepareStatement("SELECT * FROM Annuaire WHERE nom = ?"); 
//requête paramétrée pour rechercher un nom dans un Annuaire 
PreparedStatement prep2 = connection.prepareStatement("UPDATE Annuaire SET noTel = ? WHERE nom = ?"); 
//requête paramétrée pouvant servir à mettre à jour le numéro de tél. d'un abonné donné 
PreparedStatement prep3 = connection.prepareStatement("SELECT Attribut1, Attribut2 FROM MaTable"); 
// il peut ne pas y avoir de paramètres : sélection de deux attributs de la table MaTable 
  
//etc.
Une fois l'instance de PreparedStatement récupérée, il ne reste plus qu'à définir la valeur des paramètres et à l'exécuter.

Mis à jour le 11 avril 2013 Ioan

Le passage des paramètres d'entrée des PreparedStatement se fait grâce à l'ensemble des méthodes setXXX. Il est important de connaître les correspondances entre les types SQL et les types java (cf. Tableau de relations ).

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
String sql = "UPDATE Stocks SET prix = ?, quantite = ? WHERE nom = ?"; 
//préparation de la requête 
PreparedStatement preparedStatement = connection.prepareStatement(sql); 
//on assigne un décimal au premier paramètre 
preparedStatement.setBigDecimal(1,15.6); 
//on assigne un entier au second paramètre 
preparedStatement.setInt(2,256); 
//on assigne une chaîne de caractères au troisième 
preparedStatement.setString(3,"café"); 
//exécution de la requête 
preparedStatement.executeUpdate();
Pour vider un paramètre, on peut utiliser la méthode setXXX correspondante, cela a pour effet d'écraser la valeur passée précédemment. Pour vider tous les paramètres, vous pouvez utiliser la méthode clearParameters().

Mis à jour le 11 avril 2013 Ioan

La méthode setObject permet de passer n'importe quel type d'argument. Cette méthode, en plus de l'index du paramètre et de la valeur de celui-ci, peut prendre en argument un entier définissant le type SQL.

L'objet Java, passé comme valeur, sera converti dans le type SQL indiqué avant d'être envoyé au SGBD. Si ce dernier implémente SQLData, le driver appellera la méthode writeSQL pour l'écrire dans la base de données.

Code java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
String sql = "INSERT INTO Annuaire (nom, prenom, tel) VALUES(?,?,?)"; 
PreparedStatement statement = connection.prepareStatement(sql); 
//en spécifiant bien les types SQL cibles 
statement.setObject(1,"toto", Types.VARCHAR); 
statement.setObject(2,"titi",Types.VARCHAR); 
statement.setObject(3,new Integer(123),Types.INTEGER); 
statement.executeUpdate(); 
//on peut ne pas spécifier le type sql 
statement.setObject(1,"bobo"); 
statement.setObject(2,"bibi"); 
statement.setObject(3,new Integer(456)); 
statement.executeUpdate(); 
//certains types seront automatiquement convertis, d'autres non 
statement.setObject(1,"nono"); 
statement.setObject(2,"nini"); 
statement.setObject(3,"789",Types.INTEGER); 
statement.executeUpdate();
Une dernière méthode setObject prend en argument un entier définissant le nombre de chiffres après la virgule pour Types.NUMERIC et Types.DECIMAL. En cas de types incompatibles, une SQLException sera levée lors de l'exécution.

Mis à jour le 11 avril 2013 Ioan

Si la méthode setXXX prend en argument un Object java, on peut passer directement null. Sinon, pour les types primitifs, on peut utiliser les méthodes setNull de PreparedStatement. Par exemple :

Code java : Sélectionner tout
1
2
3
4
5
String sql = "INSERT INTO MaTable (unString, unInt, uneDate) VALUES (?, ?, ?)"; 
PreparedStatement statement = connection.prepareStatement(sql); 
statement.setObject(1,null, Types.VARCHAR); 
statement.setNull(2); 
statement.setDate(3,null);

Mis à jour le 11 avril 2013 Ioan

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Responsables bénévoles de la rubrique Java : Mickael Baron - Robin56 -