IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

PreparedStatment : conseils pour optimiser mon code


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut PreparedStatment : conseils pour optimiser mon code
    Bonsoir,

    Je fais un formulaire, dont les valeurs des champs sont insérées (ou consultées) dans une BD SQL Server.
    Or, quand l'utilisateur tape un nom avec une apostrophe, cela créé un problème car cela "déforme" la requête SQL résultant de la saisie (injection SQL).

    On m'a dit que le preparedStatement évite ces désagréments. J'ai donc lu la FAQ JDBC concernant les PreparedStatement :
    http://java.developpez.com/faq/jdbc/...paredstatement

    J'aurais quelques questions :
    1 - comment le prepared statement évite-t-il ces désagréments ? Suffit-t-il juste d'utiliser la fonction setObject ? Car s'il faut analyser et modifier soit même ce qu'on insère, quel est l'intérêt du PreparedStatement, par rapport à un Statement au niveau de la sécurité ?

    2 - J'ai un champ avec une autocomplétion : à chaque chiffre saisi, on charge les drivers JDBC, on se connecte à la base, on sélectionne les 10 premières villes correspondantes avec un simple Statement, puis on referme la connexion.
    S'affiche alors en pré-saisie une liste de villes de la BD dont le code postal commence par la saisie.
    Y a-t-il moyen d'optimiser ça ?


    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    1) Le PreparedStatement évite ça tout simplement parce qu'on utilise un setter typé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PreparedStatement pstmt = connection.prepareStatement("select ... from table1 where col1String = ? and col2Date = ? and col3Int = ?");
    pstmt.setString(1, leParametreString);
    pstmt.setDate(2, leParametreDate);   // <--- java.sql.Date
    pstmt.setInt(3, leParametreInt);
    ResultSet rs = pstmt.executeQuery();
    ...

    Au niveau sécurité, il n'y a pas de possibilité d'injection.
    Au niveau des paramètres String, on ne se préoccupe plus de doubler les ' à l'intérieur du texte
    Un autre gros avantage est que la requête est "pré-compilée" et donc plus rapide dans le cadre d'une ré-utilisation ou d'une boucle d'utilisation.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    PreparedStatement pstmt = connection.prepareStatement("update table1 set col1=? where uid=?");
    for (UnObjet obj : listObjets)
    {
       pstmt.setString(1, obj.getValeur1());
       pstmt.setInt(2, obj.getUid());
       pstmt.executeUpdate();
    }
    psmt.close();
    ...
    2) Avec un PreparedStatement, tu devrais déjà optimiser le traitement (pré-compilation)
    Ensuite, il faudrait passer par un pool de connexions (l'établissement d'une connexion à la base étant gourmand et lent)
    Il serait peut-être judicieux de passer par un autre mécanisme comme par exemple une liste de sélection multi-critères avec rapatriement de la valeur sélectionnée.

    Quel est le type de client (Swing, AWT, HTML...) ?

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Bonjour et merci pour tes indications.
    Donc si je comprends bien, la méthode setString s'assure automatiquement qu'il n'y a pas d'injection. C'est pratique alors.

    Pour le type de client, c'est du JSP.
    En fait j'hésitais entre :
    - à chaque lettre saisie, faire une requête sur la table des communes.
    ou
    - lors du chargement, on récupère tout dans une variable de type arrayList par exemple, puis à chaque lettre saisie on parcourt l'arrayList.

    La critère multisélection que tu me conseilles, ça serait par exemple une liste déroulante de départements ?
    Encore merci.

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Monkey_D.Luffy Voir le message
    La critère multisélection que tu me conseilles, ça serait par exemple une liste déroulante de départements ?
    Non, ce serait l'ouverture d'une fenêtre de sélection (en cliquant sur un bouton à côté du champ par exemple) qui affiche la liste des départements (avec des filtres si besoin)
    Quand tu cliques (ou double-clique) sur une ligne, la page te retourne la valeur sélectionné dans la page appelante

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Ah d'accord je vois.
    Mon responsable veut que ça soit un formulaire très simple à utiliser. Je vais donc réfléchir à un moyen pour mettre en oeuvre ta suggestion en réduisant le nombre d'accès à la BD.

    Merci et bonne journée.

  6. #6
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    J'aurais une dernière question si possible.

    Dans le formulaire, à chaque validation de saisie, il y a un chargement des drivers, une connexion à la BD, des requête, puis la fermeture de connexion.

    Est-il possible de ne faire qu'une seule connexion lors de la connexion à la page d'accueil ?
    En gros, le programme charge les drivers et se connecte pendant le chargement de la page d'accueil. Ensuite, l'utilisateur reste connecté à la BD durant tout le temps de la navigation sur le site. Le script ne fait donc qu'exécuter les requêtes directement.

    Est-ce possible avec les sessions ou cookies ?

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    C'est possible, mais pas conseillé du tout

    Comme dit précédemment, si tu veux optimiser cet aspect, il faudra passer par un pool de connexions.
    Dans la pratique, on prend une connexion, on l'utilise et on la ferme.
    L'usage de blocs try - catch - finally est vivement conseillé...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Connection connection = null;
    try
    {
       connection = ConnectionUtils.getConnection(); // <-- il est judicieux de créer une classe avec méthode statique pour l'acquisition d'une connexion
       ...
    }
    catch (Exception e)
    {
       ...
    }
    finally
    {
       if ( connection != null ) connection.close();
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Ok, d'accord, je m'en tiens alors aux try - catch - finally.
    Merci beaucoup pour tes conseils OButterlin.

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Mais je t'en prie

    (ne pas oublier le bouton si c'est OK pour toi, merci)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conseils pour eclaircir mon code
    Par zbew13 dans le forum Ruby
    Réponses: 7
    Dernier message: 26/11/2013, 10h42
  2. Réponses: 2
    Dernier message: 26/07/2011, 09h19
  3. demande de conseil pour optimiser mon script
    Par seb.garcia dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 11/05/2011, 16h03
  4. Conseil pour réduire mon code
    Par Triwis dans le forum Windows Forms
    Réponses: 7
    Dernier message: 17/08/2007, 16h17
  5. Y a-t-il une solution pour optimiser mon petit code ?
    Par pierre987321 dans le forum Delphi
    Réponses: 20
    Dernier message: 14/06/2007, 10h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo