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 :

Ma mannière de procéder est-elle exacte ?


Sujet :

JDBC Java

  1. #1
    Membre actif
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Septembre 2009
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Septembre 2009
    Messages : 458
    Points : 237
    Points
    237
    Par défaut Ma mannière de procéder est-elle exacte ?
    Bonsoir,

    J'ai deux formulaires sur ma page Web (codé en Java), l'un est issu de la table ecole (id_ecole, nom_ecole)
    Et l'autre table se nomme eleve avec un (id,eleve, nom_eleve, prenom_eleve)

    Pour pouvoir ajouter des informations dans le formulaire, il faut faire une requête SQL, j'ai donc crée une classe EcoleBD et je me suis connecté à mysql.
    La requête est exacte, le formulaire ecole enregistre bien dans la base de donnée les informations de l'utilisateur

    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
     
     
    public static Connection getConnection(){
            Connection con=null;
            try{
                Class.forName("com.mysql.jdbc.Driver");
                con=DriverManager.getConnection("jdbc:mysql://localhost:3306/maBase","root","");
            }catch(Exception e){System.out.println(e);}
            return con;
        }
     
    public static int enregistrement(Ecole v){
            int status=0;
            try{
                Connection con=getConnection();
                PreparedStatement ps=con.prepareStatement(
                        "insert into ecole(nom_ecole) values(?)");
                ps.setString(1,v.getNom_ecole());
                status=ps.executeUpdate();
            }catch(Exception e){System.out.println(e);}
            return status;
        }
    Pour le cas de ma deuxième table eleve dois-je encore créer une classeBD, et me connecter à la BD ??? Y a-t-il moyen de taper les 2 tables sur la première requête et utiliser seulement une classe ???

    Merci pour votre réponse

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Pas sûr de comprendre la question...
    Ton problème est où au juste ? La duplication du code d'acquisition d'une connexion ou le partage d'une même connexion pour la mise à jour de 2 tables ?

    D'un point de vue général, il est d'usage d'avoir 1 DAO (pattern Data Access Object) par table.
    Il est souvent conseillé d'utiliser le pattern Facade pour grouper des opérations liées à la base de données ET à l'application.
    L'obtention de la connexion est un autre problème, généralement confié à une classe utilitaire ou alors à l'injection (en fonction du type d'application).

    On aura donc :
    - la couche cliente appelle la façade pour une modification d'un objet de transfert (DTO)
    - la façade acquiert une connexion à la DB et l'injecte aux DAO
    - la façade enchaine les différents appels aux DAO
    - la façade commit ou rollback la connexion et renvoie au client un message si besoin

    Bref, avec ce genre d'architecture, on peut combiner différentes DAO qui font toujours le même boulot en fonction des besoins propres à une application.

    Ça, c'est la théorie, ou la bonne pratique...
    Rien ne t'empêche de faire une classe simple qui va directement cumuler tes opérations (à 1 seul niveau)...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre actif
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Septembre 2009
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Septembre 2009
    Messages : 458
    Points : 237
    Points
    237
    Par défaut
    Bonsoir,

    Merci pour vos précisions, j'aimerais en fait traiter deux tables dans ma requête. Je sais le faire pour une table mais pas pour deux. Avez-vous une idée svp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String sql = "INSERT INTO tbl (col1, col2, col3) VALUES (?, ?, ?)";
    preparedStatement = connection.prepareStatement(sql);
    preparedStatement.setString(1, col1);
    preparedStatement.setString(2, col2);
    preparedStatement.setString(3, col3);
    preparedStatement.executeUpdate();

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Il suffit de faire 2 PreparedStatement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Connection connection = ...
     
    PreparedStatement pstmt1 = connection.prepareStatement("insert into table1  (col1, col2) values(?, ?)");
    pstmt1.setString(1, "value1");
    pstmt1.setString(2, "value2");
    pstmt1.executeUpdate();
     
    PreparedStatement pstmt2 = connection.prepareStatement("insert into table2  (col1) values(?)");
    pstmt2.setString(1, "value1");
    pstmt2.executeUpdate();
    ...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre actif
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Septembre 2009
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Septembre 2009
    Messages : 458
    Points : 237
    Points
    237
    Par défaut
    Bonjour OButterlin;

    Merci pour ton aide, je ne savais pas que c'était possible de faire ça. j'ai une dernière question.

    Comment récupérer tous les enregistrements avec un arrayList sur deux tables ??? Sur internet, il y a des explications pour une table mais pas deux.
    Par exemple, je veux que dans ma fonction getEnregistrement j'ai la liste des enregistrements pour ma classe ecole et ma classe eleve;
    Ce code, fonctionne pour la table ecole, mais est-il possible de l'adapter et ajouter une seconde table ???

    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
    public static List<Ecole> getEnregistrement(){
            List<Ecole> list=new ArrayList<Ecole>();
     
            try{
                Connection con=getConnection();
                PreparedStatement ps=con.prepareStatement("select * from ecole");
                ResultSet rs=ps.executeQuery();
                while(rs.next()){
                    Ecole u=new Ecole();
                    u.setId(rs.getInt("id"));
                    u.setName(rs.getString("name"));
                    list.add(u);
                }
     
            }catch(Exception e){System.out.println(e);}
     
            return list;
        }
    Je pourrais résoudre mon problème en créant une autre fonction getEnregistrement2 et en mettant toutes les infos de ma table en question mais je trouve pas ça propre.

    Merci pour une éventuelle réponse de ta part.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 311
    Points : 9 524
    Points
    9 524
    Billets dans le blog
    1
    Par défaut
    Désolé pour la réponse tardive, j'étais absent...

    Pour faire ce genre de chose avec un seul appel, le mieux est de passer par un objet intermédiaire qui encapsule les 2 autres.
    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
     
    public class Table1Table2
    {
        private Table1 table1;
        private Table2 table2;
    ...
    }
     
    public List<Table1Table2> rechercheInformations(...)
    {
       List<Table1Table2> result = new ArrayList<>();
       PreparedStatement pstmt1 = connection.prepareStatement("...");
       PreparedStatement pstmt2 = connection.prepareStatement("...)";
     
       ResultSet rs1 = pstmt1.executeQuery();
       while (rs1.next())
       {
          Table1Table2 t1t2 = new Table1Table2();
     
          t1t2.getTable1().setKey(rs1.getString(1));
          t1t2.getTable1().setLibelle(rs1.getString(2));
          ...
          pstmt2.setString("keyTable1", t1t2.getTable1().getKey());
          ResultSet rs2 = psmt2.executeQuery();
          if (rs2.next())
          {
             t1t2.getTable2().setKey(rs2.getString(1));
             t1t2.getTable2().setNom(rs2.getString(2));
             t1t2.getTable2().setPrenom(rs2.getString(3));
             ...
          }
     
          result.add(t1t2);
       }
       return result;
    }
    A noter qu'on pourrait passer par un Map plutôt qu'un objet spécialisé, ça irait aussi
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre actif
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Septembre 2009
    Messages
    458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ressources humaines

    Informations forums :
    Inscription : Septembre 2009
    Messages : 458
    Points : 237
    Points
    237
    Par défaut
    Bonjour OButterlin,

    Merci pour ton aide, ça m'a l'air d'être encore assez compliqué pour ce que j'essaye de faire. Je vais me contenter de ce que je sais déjà faire pour le moment et m'améliorer par la suite.

    Merci encore pour ton aide.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 12/12/2004, 11h55
  2. une interpolation de forme est elle possible
    Par tetsuo chima dans le forum Flash
    Réponses: 3
    Dernier message: 07/10/2003, 16h31
  3. Réponses: 5
    Dernier message: 25/03/2003, 17h27
  4. C'est quoi exactement un générateur d'états
    Par Henry Cesbron Lavau dans le forum Outils de restitution et d'analyse
    Réponses: 0
    Dernier message: 02/04/2002, 19h15

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