Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > JDBC
JDBC Forum d'entraide sur l'API JDBC (Java Database Connectivity) et l'accès aux bases de données. Avant de poster -> FAQ JDBC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/11/2012, 02h40   #1
alfhcg
Membre du Club
 
Homme Alf Cedano
Inscription : septembre 2010
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme Alf Cedano
Localisation : France, Cher (Centre)

Informations forums :
Inscription : septembre 2010
Messages : 116
Points : 54
Points : 54
Par défaut Créer une requête d'ajout dynamique avec des contraintes optionnelles

Bonjour à tous.

Je suis débutant dans le monde java, je viens de VBA.

Dans le post numéro 3 de cette discussion, http://www.developpez.net/forums/d42...tere-java-sql/
on arrive à créer une requête avec des SELECT... WHERE et/ou AND, selon le cas.

J'ai essayé de modifier un peu le code pour créer une requête de insertion de données dans ma base. J'ai une fenêtre avec plusieurs JTextFields, mais certains d'entre eux pourraient rester vides. Je me suis dit qu'avec une classe comme celle citée ci-dessus je pourrais simplifier mon code et éviter de mettre dans ma liste de colonnes à insérer celles qui sont vides.

Exemple, si j'ai trois JTextFields (Prenon, NomPaternel, NomMaternel)
Il se peut que dans certains cas le champ NomPaternel soit vide, donc je voudrais faire:
Code :
INSERT INTO maTable (Prenom, NomMaternel) VALUES (...)
L'idée c'est de parcourir tous mes JTextFields parce qu'ils sont plus d'une quinzaine, avec quelque chose comme cela:

Code :
1
2
3
4
5
6
7
8
 
//C'est ce que je fait pour construire une requête dynamique avec WHERE ou AND selon le cas...
 
		for (Controleur c : controleurs){
			strLike = "%"+ c.getTxtValeur()+"%";
			gen.and(!"".equals(c.getTxtValeur()),	"upper ("+ c.getTxtNom()+") "+" like ?",	strLike);
		}
		PreparedStatement stmt = gen.createStatement(cn);
Merci d'avance si vous pouvez me donner quelque idées...
alfhcg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2012, 18h32   #2
fraco
Membre chevronné
 
Avatar de fraco
 
Inscription : juin 2006
Messages : 739
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 739
Points : 761
Points : 761
Salut !
un truc de ce genre...
rudimentaire bien sûr, à adapter, et même améliorer avec un preparedStatement par exemple

Code :
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
 
        String[] valeurs = {"","",""};                               // pas de valeur nulle
        if (!jTextField1.getText().isEmpty()) valeurs[0] = jTextField1.getText();
        if (!jTextField2.getText().isEmpty()) valeurs[1] = jTextField2.getText();
        if (!jTextField3.getText().isEmpty()) valeurs[2] = jTextField3.getText();
        int nb = 0;        
        StringBuilder sql = new StringBuilder(" INSERT INTO MATABLE ( ");   
        if (!valeurs[0].isEmpty()) {       // il y a quelque chose dans jTextField1
            sql.append("NOM"); 
            nb++;
        }
        if (!valeurs[1].isEmpty()) {
            if (nb > 0) sql.append(",");   // si ce n'est pas le premier, le précéder d'une virgule
            sql.append("PRENOM"); 
            nb++;
        }
        if (!valeurs[2].isEmpty()) {
            if (nb > 0) sql.append(",");
            sql.append("LOCALITE"); 
            nb++;
        }
        nb = 0;
        sql.append(") VALUES ("); 
        if (!valeurs[0].isEmpty()) {  
            sql.append("'").append(valeurs[0]).append("'");         // les valeurs entre apostrophes
            nb++;
        }
        if (!valeurs[1].isEmpty()) {  
            if (nb > 0) sql.append(",");
            sql.append("'").append(valeurs[1]).append("'"); 
            nb++;
        }
        if (!valeurs[2].isEmpty()) {  
            if (nb > 0) sql.append(",");
            sql.append("'").append(valeurs[2]).append("'"); 
            nb++;
        }     
        sql.append(")");                                    // fermer la parenthèse
        String s = String.valueOf(sql);           // de stringBuilder à String         
        jLabel1.setText(s);                              // afficher le résultat
fraco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/11/2012, 14h11   #3
alfhcg
Membre du Club
 
Homme Alf Cedano
Inscription : septembre 2010
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme Alf Cedano
Localisation : France, Cher (Centre)

Informations forums :
Inscription : septembre 2010
Messages : 116
Points : 54
Points : 54
Merci pour la réponse Fraco. Justement je voulais éviter 15 ou 20 if... un pour chaque JTextField ou JComboBox de mon formulaire.

Avec cette methode je crée dynamiquement mes JTextFields et je les mets dans un array:
Code :
1
2
3
4
5
6
7
8
9
	public void addTexto(String cNom, String txtPos){
		CtrlSoloStr model = new CtrlSoloStr ();
		final JTextField text = new JTextField (model, "", 15);	
		text.setToolTipText("Sólo puede introducir letras y espacios");
		text.setName(cNom);
		this.add(text, txtPos);
                //Array
		controleurs.add(new TextoControl(text));
	    }
Puis, je prépare mon statement:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
/*Pour l'exemple j'ajoute seulement 5 colonnes dans ma table, mais il y en a beaucoup plus, 
il s'agit d'un formulaire pour ajouter tous les données d'une personne...*/
 
PreparedStatement stmtInsert= cn.prepareStatement("INSERT INTO tblpersona+ " +
						"(nombres,apaterno,amaterno, idciudad, idb) +" +
						"VALUES (?,?,?,?,?)");
				int x =1;
/*Je suppose que dans le boucle for le premier JTextField sera toujours le premier 
que j'ai mis dans mon array et ainsi de suite, sinon ça sera la catastrophe!*/
				for (TextoControl c : controleurs){
					stmtInsert.setString(x, c.getTxtValeur());
					x++;
				}
/*Ensuite les valeurs récupérées des JComboBox... plus compliqué puisque 
ce sont des valeurs numériques qui font des clés étrangères dans ma base de données...*/
					stmtInsert.setLong(4, lngIdCiudad);
					stmtInsert.setLong(5, lngIdB);
 
					stmtInsert.executeUpdate();
Avec cela j'évite d'avoir plein de if... mais je demande d'insérer certaines colonnes vides (s'il y en a) dans ma table. Je ne sais pas si cela affecte en quelque chose? Si un expert JDBC passe par ici
alfhcg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 12h18   #4
fraco
Membre chevronné
 
Avatar de fraco
 
Inscription : juin 2006
Messages : 739
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 739
Points : 761
Points : 761
Citation:
je demande d'insérer certaines colonnes vides (s'il y en a) dans ma table.
? un insert ne peut pas ajouter des colonnes dans une table !
en revanche, si tu parles de valeur vide (ou nulle) on les ignore simplement dans le query (comme on le voit dans mon code ).

un site précieux : http://sqlpro.developpez.com/
fraco est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2012, 13h16   #5
alfhcg
Membre du Club
 
Homme Alf Cedano
Inscription : septembre 2010
Messages : 116
Détails du profil
Informations personnelles :
Nom : Homme Alf Cedano
Localisation : France, Cher (Centre)

Informations forums :
Inscription : septembre 2010
Messages : 116
Points : 54
Points : 54
Bonjour,

Je parle de valeurs vides ou null dans les JTextFields.

Je vois bien qu'on les ignore dans ton code. Mais moi, je dois vérifier 15 ou 20 JTextFields, alors imagine la longueur du code si je le fais avec des if. Voilà pourquoi je voulais tout mettre dans une boucle for... ou générer une requête dynamique INSERT INTO qu'ignore les colonnes dont les JTextFields que lui correspondent seraient vides ou nulles. Mon boucle for... fait l'affaire mais il n'ignore pas ces JTextFields vides et ma question était si cela affecte à quelque chose lorsque je demande par exemple:

Code :
stmtInsert.setString(x, c.getTxtValeur());
et le getTxtValeur de x (la valeur d'un JTextField quelconque de ma fenêtre) est vide ou null?

En cherchant je suis tombé sur Hibernate. Cela a l'air intéressant. A suivre...
alfhcg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2012, 12h52   #6
fraco
Membre chevronné
 
Avatar de fraco
 
Inscription : juin 2006
Messages : 739
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 739
Points : 761
Points : 761
Citation:
Mais moi, je dois vérifier 15 ou 20 JTextFields, alors imagine la longueur du code si je le fais avec des if.
Tout à fait ! mon exemple était rudimentaire, juste pour illustrer la fabrication de la requête. En fait il faut avoir un tableau de string pour les 15 ou 20 titres de colonne, et un tableau d'objets (par exemple) pour les valeurs. Après tu passes en revue les tableaux et si la valeur n'est pas vide ni nulle tu complètes le texte de la requête...
Plus de if en cascade.
fraco est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h56.


 
 
 
 
Partenaires

Hébergement Web