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.
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.
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. |
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(); |
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(); |
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); |
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 çaLes 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 © 2024 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.