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 :

problèmes entre classe


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 40
    Points
    40
    Par défaut problèmes entre classe
    Bonjour,

    Problème encore de débutant !

    J'ai fait un projet test où j'ai une classe ConnectMysql qui comporte une méthode connect, une méthode close et une autre qui retourne un Resulset d'une requête passée en paramètre.

    Dans ce projet j'ai fait une autre classe main qui me teste la connexion et une requête et tout va bien.

    Mais comme cette classe connexion me servira à différents projets, je l'ai mise dans un répertoire fr/pl/mysql dans le répertoire de l'espace de travail.

    J'ai commencé un autre projet de gestion d'une table qui me permet de voir la programmation java sur pas mal de fonctionnalités.

    Dans une classe TableTest, j'ai un constructeur avec tous les champs de la table, ainsi que tous les getters et setters.

    Puis j'ai une méthode InsertTable qui m’insère un enregistrement dans ma table.


    Ma méthode connect de ma classe ConnectMysql

    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
     
    public class ConnectMysql {    
    	   private String base = "";
    	   private String user = "";
    	   private String pwd = "";
    	   private Connection dbConnect = null;
    	   private Statement dbStatement = null;
    ...
     public Boolean connect() {
        try {
    	Class.forName("com.mysql.jdbc.Driver");
    	System.out.println("Driver Mysql trouvé");
        }
         catch (ClassNotFoundException e) {
            System.err.print("ClassNotFoundException: ");
            System.err.println(e.getMessage());
            return false;
        } 	
        try {
           this.dbConnect = DriverManager.getConnection("jdbc:mysql://localhost/" + this.base, this.user, this.pwd);
                                    // note la base, user et pwd viennent des paramètres du constructeur 
           System.out.println("Base " + this.base + " connectée");
           this.dbStatement = this.dbConnect.createStatement();
           return true;
        } 
        catch(SQLException ex) {
           System.err.println("SQLException: " + ex.getMessage());
        }
        return false;
     }

    Ma classe tableTest pour gérer ma 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     
    public class TableTest {
        private int id;
        private String nom;             // Nom
        private String prenom;          // Prenom
        .....
     
        public TableTest(int id, String nom, String prenom, .....) {
           super();
           this.id = id;
           this.nom = nom;
           this.prenom = prenom;
           .....
        }
        public String getNom() {
           return nom;
        }
        public void setNom(String nom) {
           this.nom = nom;
        }
        ......
     
        public void insertTable() {
            String sqlTmp = "";
            sqlTmp += "insert into tabletest values (";
            sqlTmp += "'" + this.getNom() + "', ";
            sqlTmp += "'" + this.getPrenom() + "', ";
            ....
            sqlTmp += "'" + this.getDivers() + "' )";
            try {
               dbStatement.executeUpdate(sqlTmp);     // erreur dbStatement cannot be resolved
            } catch (SQLException e) {
                e.printStackTrace();
            }
       }
    }

    J'ai incorporé ma classe ConnectMysql dans mon projet de gestion de table avec Link source où j'ai mis le chemin de Linker Folder location, donc fr/pl/mysql sous mon workspace et m'a donc donné mon folder name : mysql où se trouve ma classe ConnectMysql.

    Et j'ai une erreur "dbStatement cannot be resolved" sur la ligne dbStatement.executeUpdate(sqlTmp);

    J'ai un import java.sql.* dans les deux fichiers java.
    J'ai essayé de mettre un import fr.pl.mysql ou rajouter la classe, essayé aussi de mettre package fr.pl.mysql, et j'ai toujours cette erreur.

    Pouvez vous me dire ce qui se passe ??
    Merci d'avance.
    Cordialement.

  2. #2
    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
    Tu n'a défini nulle part dans ta classe TableTest de variable dbStatement. Les champs des classes que tu importe n'apparaissent pas miraculeusement dans la classe qui fait l'import. L'import sert juste à voir la classe, pas à fusionner les classes ou que sais-je que tu imagine

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    J'ai donc rajouté la ligne "Statement dbStatement = dbConnect.createStatement();" avant ma ligne d'erreur "dbStatement.executeUpdate(sqlTmp);", mais c'est maintenant cette ligne rajoutée qui est en erreur "dbConnect cannot be resolved".

    Faut il redéclarer toutes les variables de connexion ? et si oui comment celles ci peuvent elles faire alors référence à la connexion effective de ma classe ConnectMysql ??

    Merci de vos réponses.
    Cordialement.

  4. #4
    Inactif  
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mars 2014
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Dans TableTest t'as pas de Connection dbConnect donc logique qu'il te dise qu'il ne la trouve pas ...

    Fais comme ça :


    private Connection dbConnect;
    public TableTest(Connection dbConnect, ....){
    this.dbConnect = dbConnect;
    }

    et dans ton autre classe TableTest t = new TableTest(dbConnect , ..)

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 40
    Points
    40
    Par défaut
    En faisant ce que tu m'as dit :

    private Connection dbConnect;
    public TableTest(Connection dbConnect, ....){
    this.dbConnect = dbConnect;
    }

    Je n'ai plus d'erreur sur ma ligne "Statement dbStatement = dbConnect.createStatement();"

    Mais que veux tu dire par "dans ton autre classe TableTest" ? je n'ai qu'une seule classe TableTest !!

    En définitive, pouvez vous m'expliquer que faut il déclarer dans deux classes qui sont sur 2 fichiers séparés :

    Une classe de connexion à Mysql qui me servira pour tous les projets utilisant Mysql
    et dans chaque classe utilisant cette classe connexion pour chacun de mes projets ??

    Merci d'avance.

  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
    Ce que tu ne comprends pas c'est que les variable sont dans l'autre classe (ici MYsqlConnect) restent dans cette classe. JeanClude te propose une solution (pas propre à mon sens) qui consiste à passer les information de connexion à TableTest. Mais d'une manière général, c'est à toi d'adapter MysqlConnect pour que soit il rendre les variable dont tu as besoin visible (getters) soit qu'il contienne directement la méthode insertTable, plutot que de la foutre dans TableTest soit encore faire une méthode a mi chemin dans MysqlConnect qui prend le sql en paramètre et l'exécute.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class ConnectMysql { 
    //....
     
    public void executeSQLUpdate(String sql) throws SQLException {
         dbStatement.executeUpdate(sqlTmp);
    }

    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
    public class TableTest {
        private int id;
        private String nom;             // Nom
        private String prenom;          // Prenom
        private ConnectMysql connectMysql;
        .....
     
        public TableTest(int id, String nom, String prenom, ....., ConnectMysql  connectMysql ) {
           ....
           this.connectMysql  = ConnectMysql ;
           .....
        }
     
        public void insertTable() {
            String sqlTmp = "";
            sqlTmp = .....;
     
            try {
               connectMysql.executeSQLUpdate(sqlTmp);     
            } catch (SQLException e) {
                e.printStackTrace();
            }
       }
    }
    Accessoirement c'est aussi un très mauvaise idée de réaliser des requetes SQL à la volée en concaténant des String avec des valeurs probablement soumises par l'utilisateur. Qu'arrivera-t-il le jour où l'utilisateur tapera
    "; drop database;
    comme prénom? utilise des preparedStatement pour éviter les attaques par injection SQL

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 40
    Points
    40
    Par défaut
    Merci de cette réponse et de cet exemple.

    Je dois donc rajouter cette méthode executeSQLUpdate dans ma classe ConnectMysql et l'appeler dans ma méthode insertTable, c'est çà ?
    et cela me servira alors pour toutes les maj : insert, update et delete, c'est encore çà ?

    Désolé de toutes ces questions qui doivent vous paraître basiques, mais pour moi c'est tout nouveau et je m'y perds encore un peu.

    Merci de vos réponses.

  8. #8
    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
    par exemple oui.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 40
    Points
    40
    Par défaut
    Merci à tous et bonne soirée.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/08/2011, 13h44
  2. Réponses: 6
    Dernier message: 17/12/2007, 16h16
  3. Réponses: 6
    Dernier message: 19/04/2007, 15h03
  4. Problème entre jsp et bean impossible de trouver la classe
    Par red210 dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 15/01/2007, 06h43
  5. [c#] probléme de communication entre classe
    Par OpenGG dans le forum C#
    Réponses: 1
    Dernier message: 24/09/2006, 21h54

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