Partage
  • Partager sur Facebook
  • Partager sur Twitter

insertion avec methode ajoutClient

    14 janvier 2019 à 11:17:21

    Bonjour,

    Je suis actuellement en train de réaliser un logiciel dans le but de mon stage de BTS SIO.

    Je vous explique mon interrogation.

    J'ai une base de données relationnelle qui contient un certains nombres de tables.

    Celles qui m'intéressent dans ce cas sont les tables "Client" et "Coordonnees".

    Voici leur modélisation:

    en java la classe Client, contient:

    package envie.modele;
    
    public class Client {
    	protected int numClient;
    	protected String nomCli;
    	protected String prenCli;
    	protected String dateNaissCli;
    	protected String numPieceId;
    	protected String centreInterets;
    	protected String observations;
    	protected Coordonnees laCoordonnee;
    	
    	public Client() {
    		//Raccord de constructeur auto-généré
    	}
    
    	public Client(int numClient, String nomCli, String prenCli, String dateNaissCli, String numPieceId,
    			String centreInterets, String observations, Coordonnees laCoordonnee) {
    		this.numClient = numClient;
    		this.nomCli = nomCli;
    		this.prenCli = prenCli;
    		this.dateNaissCli = dateNaissCli;
    		this.numPieceId = numPieceId;
    		this.centreInterets = centreInterets;
    		this.observations = observations;
    		this.laCoordonnee = laCoordonnee;
    	}
    
    }
    

    (je n'ai pas montré les get et set (sans intérêts ici)

    et la classe coordonnee contient:

    package envie.modele;
    
    public class Coordonnees {
    	protected int numLocalite;
    	protected String adresse;
    	protected String codePostal;
    	protected String ville;
    	protected String pays;
    	protected String telephone;
    	protected String mail;
    	
    	public Coordonnees() {
    		//Raccord de constructeur auto-généré
    	}
    	
    	public Coordonnees (int numLocalite, String adresse, String codePostal, String ville, String pays, String telephone, String mail) {
    		this.numLocalite=numLocalite;
    		this.adresse=adresse;
    		this.codePostal=codePostal;
    		this.ville=ville;
    		this.pays=pays;
    		this.telephone=telephone;
    		this.mail=mail;
    	}
    
    }
    

    pareil, je ne montre pas les get & set

    Lorsque, je souhaite créer une méthode ajoutClient() qui ajoute un Client et son adresse, je ne sais pas comment m'y prendre.

    En effet, l'adresse étant dans une table différente, je ne sais pas comment cela se modélise niveau du code.

    Merci d'avance pour le coup de pouce.


    • Partager sur Facebook
    • Partager sur Twitter
      14 janvier 2019 à 14:34:47

      Bonjour,

      Si j'ai bien compris ton problème, tu souhaites faire référence à l'adresse d'un client mais cette dernière est un attribut d'un objet Coordonnee. La solution est d'utiliser les getter comme ceci:

      public void ajoutClient(Client client) {
      		String adresse = client.getLaCoordonnees().getAdresse();
      	}


      Dis moi si c'est bien cela que tu cherches.

      • Partager sur Facebook
      • Partager sur Twitter
        14 janvier 2019 à 14:50:36

        Faut-il donc que je fasse deux requetes SQL (l'une qui ajoute adresse, cp, ville, pays, telephone, mail dans Coordonnees et l'autre qui ajoute nom,prenom,dateNaiss...etc et qui affecte l'idLocalite qui vient d'être enregistrée dans la table Coordonnees au champ idLocalite de Client)?
        • Partager sur Facebook
        • Partager sur Twitter
          14 janvier 2019 à 15:24:39

          Si tu as deux tables SQL, l'une pour les clients et l'autre pour les coordonnées, il faut faire deux requets pour mettre à jour chacune des tables. Cependant, si tu as une relation 1:1 entre tes clients et tes coordonnées (un client n'a qu'une seule coordonnée), il serait judicieux de fusionner les tables clients et coordonnées. En java, les données localité, adresse, CP, etc. deviennent alors des attributs de Client et une seule méthode est nécessaire pour mettre à jour les clients dans la base.
          • Partager sur Facebook
          • Partager sur Twitter
            14 janvier 2019 à 15:43:04

            Je ne veux pas fusionner les deux tables puisque Coordonnees est aussi liée à Partenaire, j'ai fait ceci pour éviter des redondances de données.
            • Partager sur Facebook
            • Partager sur Twitter
              14 janvier 2019 à 16:20:55

              ... après, tu peux faire deux requets l'une derrière l'autre
              • Partager sur Facebook
              • Partager sur Twitter
                14 janvier 2019 à 16:44:20

                J'ai fait quelque chose, je sais pas si c'est bien. Dis-moi ce que tu en penses?

                public static void ajouterClient(Client unClient) {
                		ConnexionMysql.connecterBd();
                		
                		String nomCli = unClient.getNomCli();
                		String prenCli = unClient.getPrenCli();
                		String dateNaissCli = unClient.getDateNaissCli();
                		String numPieceId = unClient.getNumPieceId();
                		String centreInterets = unClient.getCentreInterets();
                		String observations = unClient.getObservations();
                		int laCoordonnee=unClient.getLaCoordonnee().getIdLocalite();
                		String adresse = unClient.getLaCoordonnee().getAdresse();
                		String cp = unClient.getLaCoordonnee().getCodePostal();
                		String ville = unClient.getLaCoordonnee().getVille();
                		String pays = unClient.getLaCoordonnee().getPays();
                		String telephone = unClient.getLaCoordonnee().getTelephone();
                		String mail = unClient.getLaCoordonnee().getMail();
                		
                		String reqCoor = ("INSERT INTO Coordonnees (idLocalite, adresse, codePostal, ville, pays, telephone, mail) VALUES (null, "+adresse+","+cp+","+ville+","+pays+","+telephone+","+mail+")"); //on met null car il est en auto-increment dans la base de données
                		String reqCli = ("INSERT INTO Client (numCli,nomCli,prenomCli,dateNaissCli, numPieceId, centreInterets, observations, idLocalite) VALUES (null,"+nomCli+","+prenCli+","+dateNaissCli+","+numPieceId+","+centreInterets+","+observations+","+laCoordonnee+")"); //idem: null car c'est en auto-increment dans la base
                		
                		try
                		{
                			if(!nomCli.equals("") && !prenCli.equals("") && !dateNaissCli.equals("") && !adresse.equals("") && !ville.equals("") &&!pays.equals("")) {
                				prepared = cnx.prepareStatement(reqCoor);
                				prepared.execute();
                				prepared = cnx.prepareStatement(reqCli);
                				prepared.execute();
                				
                				ConnexionMysql.fermerConnexionBd();
                				JOptionPane.showMessageDialog(null," Insertion réussie ! ");//Boite de dialogue qui affiche que l'insertion a reussi
                			}
                			else {
                				JOptionPane.showMessageDialog(null," Les champs obligatoires ne sont pas tous remplis ! "); //affiche une boîte de dialogue pour dire que certains champs obligatoires ne sont pas remplis
                			}
                		}
                		catch (Exception e)
                		{
                			System.out.println("Echec lors de la requête d'insertion");
                		}
                	}
                }


                -
                Edité par Varliche 14 janvier 2019 à 16:49:39

                • Partager sur Facebook
                • Partager sur Twitter
                  14 janvier 2019 à 17:31:04

                  Je ne peux pas tester mais ça m'a l'air bien.

                  Je te conseilles d'utiliser setString(), setInt(), etc. de la PreparedStatement ce qui va te simplifier la gestion des erreurs de saisies.

                  Il est également possible de faire de la gestion d'erreurs de façon un peu plus élégante mais dans l'idée c'est OK.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 janvier 2019 à 9:29:48

                    Je pensais au début utiliser les setString mais dans les requêtes SQL j'ai directement proposé les variables concernées.

                    C'est ici une première épure, je vais bien-sûr perfectionner ceci.

                    Mais la question qui me restait, c'est est-ce que, comme, j'insère tout d'abord les coordonnées en base, est ce que je récupèrerais la clé primaire de la bonne coordonnée en clé étrangère de la table client pour le client ajouté?

                    -
                    Edité par Varliche 15 janvier 2019 à 9:34:43

                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 janvier 2019 à 10:15:47

                      Mais la question qui me restait, c'est est-ce que, comme, j'insère tout d'abord les coordonnées en base, est ce que je récupèrerais la clé primaire de la bonne coordonnée en clé étrangère de la table client pour le client ajouté?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 janvier 2019 à 10:32:34

                        Non, je craint qu'il faille procéder ainsi:

                        1/. Ajouter le client à ta base de données

                        2/. Récupérer l'id que la base lui a attribué

                        3/. Ajouter les coordonnées à ta base avec l'id client que tu viens de récupérer.

                        Peut être peux tu revoir la structure de ta base et de tes objets java. Par exemple, tu pourrais créer une classe Personne dont hériteraient Client et Partenaire. Pour tes tables, tu ajoutes alors une colonne de booléen "is_client" dont la valeur t'indique si la personne est un client ou un partenaire.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 janvier 2019 à 12:05:33

                          Ou alors je pourrais tout simplement changer, passer la clé primaire de coordonnées en un champ à saisir et qui serait donc ajouté manuellement et donc pas besoin de passer par cela.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 janvier 2019 à 12:35:10

                            Oui, c'est possible. Cependant, il faut t'assurer que la clef primaire que tu créé en java soit unique. Il te faut faire un test sur l'intégralité de ta base ... ce qui n'est pas très optimisé.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 janvier 2019 à 13:40:12

                              Du coup, j'ai changé le type de données de la clé primaire de Coordonnees, ce sera un VARCHAR(64) et la clé primaire sera la concaténation de coord+nom+prenom du client

                              String idLocalite="Coord" + "+nomCli+" + "+prenCli+" ;

                              -
                              Edité par Varliche 15 janvier 2019 à 15:55:06

                              • Partager sur Facebook
                              • Partager sur Twitter

                              insertion avec methode ajoutClient

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown