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

avec Java Discussion :

Optimisation d'un requête dynamique


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Points : 12
    Points
    12
    Par défaut Optimisation d'un requête dynamique
    Bonjour,

    Comme dit le titre,
    je viens de créer une requête mais le code de celle-ci me semble bien moche...
    Je dois mal m'y prendre ou autre. Quelqu'un aurrait t'il des conseils SVP.

    Je vous remercie d'avance.

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    public ArrayList<Contrat> findListContrat(int numContrat, String nomContrat, String prenomContrat, Date dateNaissanceContrat, int codePostalContrat){
     
    		// déclaration
    		ArrayList<Contrat> listeContrat = new ArrayList<Contrat>(); 
    		int argRequete = -1;
    		String sql = "SELECT * FROM Contrat"; 
     
    		// recupération du nombre de d'argument
    		if (numContrat != 0)argRequete++;
    		if (nomContrat != null)argRequete++;
    		if (prenomContrat != null)argRequete++;
    		if (dateNaissanceContrat != null)argRequete++;
    		if (codePostalContrat != 0)argRequete++;
     
    		// création de la requête
    		if ((numContrat != 0) || (nomContrat != null) || (prenomContrat != null) || (dateNaissanceContrat != null) || (codePostalContrat != 0)){
    			sql = sql + " WHERE";
    		}
    		if (numContrat != 0){
    			sql = sql + " numContrat = " + numContrat;
    			if (argRequete != 0){
    				sql = sql + " AND";
    				argRequete--;
    			}
    		}
    		if (nomContrat != null){
    			sql = sql + " nomContrat = '" + nomContrat + "'";
    			if (argRequete != 0){
    				sql = sql + " AND";
    				argRequete--;
    			}
    		}
    		if (prenomContrat != null){
    			sql = sql + " prenomContrat = '" + prenomContrat + "'";
    			if (argRequete != 0){
    				sql = sql + " AND";
    				argRequete--;
    			}
    		}
    		if (dateNaissanceContrat != null){
    			sql = sql + " dateNaissanceContrat = " + dateNaissanceContrat;
    			if (argRequete != 0){
    				sql = sql + " AND";
    				argRequete--;
    			}
    		}
    		if (codePostalContrat != 0){
    			sql = sql + " codePostalContrat = " + codePostalContrat;
    			if (argRequete != 0){
    				sql = sql + "AND";
    				argRequete--;
    			}
    		}
     
    		System.out.println(sql);
     
                              //...
    }

  2. #2
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    idée comme ça en passant utilise MessageFormat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Object[] args = {  numContrat!=0?numContrat: null, 
                               nomContrat,
                               prenomContrat,
                               // etc. etc.
                            } ;
     
    for(int ix=0; ix < args.length, ix++ ) {
       // construire un pattern pour Message format
       // quand un object manque son numero n'est pas dans le pattern
       // on gère where et AND en fonction d'un booléen
    }
      MessageFormat.format(pattern, args) ;
      //sachant que le pattern ne mentionne pas les numeros de objets manquants
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  3. #3
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,

    Il est à éviter de faire des concaténations de String, utilise un StringBuilder.

    A+.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    En gros je travaillerais avec un map + preparedStatement, c'est plus clair et ça évite l'injection sql
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    StringBuilder query = new StringBuilder();
    Map<String,Object> parametres = new HashMap<String,Object>();
    if (numContrat != 0)
     parametres.put("numContrat",(Integer)numContrat);
    if (nomContrat != null){
     parametres.put("nomContrat",nomContrat);
    //...
    for (Map.Entry<String,Object> entry : parametres.entrySet()){
       if (query.length()>0)
         query.append(" AND ");
       query.append(entry.getKey).append(" = ? ");
    }
    String sqlQuery = null;
    if (query.length()>0)
       sqlQuery = "SELECT * FROM Contrat WHERE "+query; 
    else
       sqlQuery = "SELECT * FROM Contrat"; 
    PreparedStatement ps = connection.prepareStatement(sqlQuery);
    int i=0;
    for (Map.Entry<String,Object> entry : parametres.entrySet())
       ps.setObject(++i);
    }
    ResultSet rs = ps.executeQuery();
    //...

  5. #5
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Bonjour,

    Pourquoi ne pas utiliser l'API criteria ? Ce serait beaucoup plus simple/sûr à gérer que des concaténations de Strings.

    Cordialement,
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par v4np13 Voir le message
    Bonjour,

    Pourquoi ne pas utiliser l'API criteria ? Ce serait beaucoup plus simple/sûr à gérer que des concaténations de Strings.

    Cordialement,
    Criteria c'est du hibernate, je ne pense pas qu'il va installer tout le bordel d'hibernate juste pour faire une query sql

  7. #7
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Bah, ce sera plus simple à maintenir.

    Là, il y a beaucoup de sources d'erreur possibles. Le code présenté s'apparente plus à du code spaghetti (il manque juste un goto ).

    Si sa query porte sur une table, le mapping sera très rapide puis son code business sera simplifié.

    Autant partir sur de bonnes bases, je croirai, sans vouloir être méchant, relire du code d'il y a 10-20 ans...

    Cordialement,
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 8
    Points : 12
    Points
    12
    Par défaut
    Merci pour toutes ces indications je vais arrenger tous sa.

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

Discussions similaires

  1. Erreur de conversion et requête dynamique dans une procédure
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/08/2005, 15h12
  2. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45
  3. [Procs stockées] [Débutant] Requête dynamique
    Par stailer dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2005, 14h29
  4. Requête dynamique en pagination
    Par pascal_fluck@hotmail.com dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/03/2005, 16h04
  5. [DB2] Optimisation d'une requête
    Par ahoyeau dans le forum DB2
    Réponses: 7
    Dernier message: 11/03/2005, 17h54

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