Java : Connection Mysql vers une autre class

Résolu/Fermé
madeinloveyou - 6 mai 2009 à 13:33
 ultrarich - 8 août 2012 à 13:48
Bonjour,

Je suis en train de faire une application Java. J'ai créer une connection Mysql dans une class : ConnectionMySQL, je me connect bien !!
Mon probleme est que dans la fonction getConnection qui retourn la Connection, celle-ci est null ???
Comme si l'affectation se fesai en local mais pas d'impact sur la variable globale ???
Voici le code :

...
private java.sql.Connection con;
...

public void actionPerformed (ActionEvent e) {
Object source = e.getSource();
if(source == valid){
con = connect2MySQL(login.getText(),password.getText());
// ici la connection est non null
}
}

public java.sql.Connection getConnection() {
// MAIS ICI LA CONNECTION EST NULL...... POURQUOI ????
return con;
}

public Connection connect2MySQL(String u, String p) {
String user = u;
String pass = p;

try{
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost/",user,pass);
this.dispose();
return con;
} catch(Exception e){
String s = e.getMessage();
JOptionPane.showMessageDialog(null, s, "Connection Error", JOptionPane.ERROR_MESSAGE);
return null;
}
}


Aidez-moi s'il vous plait .... c'est hyper urgent .... je suis coincée !!!!!!!!!!!!!!!!


Merci d'avance.
A voir également:

16 réponses

sandul Messages postés 3927 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 723
6 mai 2009 à 13:48
En fait, je réécrirais getConnection() genre
public java.sql.Connection getConnection() {
  if (con == null) {
    // ici le code de connect2MySQL
  }
return con;
}
et du coup le code est plus clair et connect2MySQL() devient inutile...

++
1
sandul Messages postés 3927 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 723
7 mai 2009 à 12:17
Non, pas trop...

Il n'est pas exécutable (c'est juste un fragment), il n'est pas formaté & je devrais mettre 3 plombes à comprendre de quoi il s'agit. Désolé, mais pas le temps pour ce faire :(
1
Bonjour ,moi c'est ultrarich et vous m'excuez mais j'ai un serieux souci par rapport a java et ma base de donnee sandul tu peux me help j'en suis o point mort .......
0
sandul Messages postés 3927 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 723
6 mai 2009 à 13:45
Salut,

Tu appelles probablement getConnection() avant d'appeler une première fois connect2MySQL(), non ?

++
0
madeinloveyou Messages postés 61 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 avril 2010
6 mai 2009 à 14:32
Ok merci pour la rapidité de la réponse , je v essayer !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
madeinloveyou Messages postés 61 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 avril 2010
6 mai 2009 à 14:35
Mais le probleme c ke j'utilise onnect2MySQL dans action performed :

public void actionPerformed (ActionEvent e) {
Object source = e.getSource();
if(source == valid){
con = connect2MySQL(login.getText(),password.getText());
}
}
Alors je fais koi dans if(source == valid){ ... ? ... }
j'appell getConnection ??
0
sandul Messages postés 3927 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 723
6 mai 2009 à 14:52
Heu, non, pas vraiment... Tu as une boite de dialogue pour rentrer l'utilisateur et le mot de passe, je n'avais pas fait gaffe ==> getConnection() sans paramètres ne saura pas créer la connexion la première fois. Du coup,
1. Ta solution initale peut être OK à condition de t'assurer que connect2MySQL() est appelé avant le premier appel à getConnection()
2. Ou bien de gérer le fait que getConnection() peut te retourner null
3. Ou bien (si tu peux te permettre d'avoir un GUI dans connect2MySQL():
public java.sql.Connection getConnection()) {
  if (con == null) {
    // con à null ==> demander l'user et le password à l'utilisateur
    // via un JOptionPane par exemple
    // Par la suite, le code de connect2MySQL
  }
  return con;
}

M'enfin, il y a plein de possibilités :)

++
0
madeinloveyou Messages postés 61 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 avril 2010
6 mai 2009 à 15:04
excuse moi je suis pas super douée ta du le remarqué, et suis un peu tétu !!!
je reste un peu buté sur mon code, je comprend pas pourkoi :
si dans

public void actionPerformed (ActionEvent e) {
Object source = e.getSource();
if(source == valid){
con = connect2MySQL(login.getText(),password.getText());
System.out.println("1==> "+con);
// ICI C PAS NULL
}
}

et dé kon sort de la fonction c null

paske dans 1 otre class (Menu) g :

public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == Connex){
ConnectionMySQL connect = new ConnectionMySQL(); // pour créer la connection
con = connect.getConnection();
// MAI LA DU COUP JE LA RECUPERE PAS !!!!
System.out.println("==> "+con);
}
alors ke la variable con a été déclaré en "global", et non en local !!!!
0
sandul Messages postés 3927 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 723
6 mai 2009 à 15:19
J'essaie de redire avec en d'autres mots ce que j'ai dit avant:

Tu as une variable con de type membre de la classe X.
1. con n'est pas déclarée avec "static", donc, une fois"X" instanciée et "con" initialisée, il faudra t'assurer de ne pas appeler "con" d'une autre instance de"X".
Exemple:
x1 = new X();
x1.con = new ConnectionMySQL().getConnection();
// ici x1.con sera != null
x2 = new X();
// ici x2.con sera == null

2. Si ce n'est pas ça ton souci (à savoir, pas de nouvelle instance de X créée), l'unique idée qui me trotte par les méninges est la suivante:

Tu as un endroit dans ton code qui fait appel à "con" et "con" est null. Cela signifie tout simplement que la partie de code qui initialise "con" ne s'est pas encore exécutée.

Il m'est difficile de t'en dire plus, car je ne vois pas très bien dans ton code qui fait quoi et ce que tu veux réaliser =)

++
0
madeinloveyou Messages postés 61 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 avril 2010
6 mai 2009 à 15:28
con est déclaré tel kel : private java.sql.Connection con = null;

dans mon interface je clique sur "se connecter à la base de données"
ensuite une fenetre apparait pour rentre login + pass ... je valid
=> ca appel la fonction actionPerformed qui appel connect2MySQL ...
là cette fonction renvoie la connection là ya pas de soucis ... mais après plus rien !!!
pi j'ai kune seule connection !!!
0
sandul Messages postés 3927 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 723
6 mai 2009 à 15:37
=> ca appel la fonction actionPerformed qui appel connect2MySQL ...
là cette fonction renvoie la connection là ya pas de souci


1. Cherche dans ton code les occurrences "con = " et assure-toi qu'il n'y a pas d'autre initialisation (pas d'effet de bord)
2. Crée une paire getConnection() et setConnection(). Remplace toutes les utilisations directes de "con" (à part celles dans les méthodes get et set) par des appels à ces deux méthodes. Utilise des breakpoints dans les 2 méthodes pour voir quand "con" est initialisée / accédée / changée.

Good luck,
++
0
madeinloveyou Messages postés 61 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 avril 2010
7 mai 2009 à 10:08
C'est bon ... j'ai trouvé !!! oufff
en fait, ce qui posait problème c l'ordre des instructions !
mon programme executait :

1: if (source == Connex){
2: ConnectionMySQL connect = new ConnectionMySQL(); // pour créer la connection
3: con = connect.getConnection();

Seulement lorque j'appel getConnection(); je n'ai pas encore tapé le login et mot de pass
Et lors d'une seconde tentative de connection c bon puisque con a été changé à la fin de l'appel d'avant !

Merci de m'avoir eguillé, tte une après pour ça !! les boules !!!
0
sandul Messages postés 3927 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 723
7 mai 2009 à 10:20
:-)

heureux de t'avoir aidé
0
madeinloveyou Messages postés 61 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 avril 2010
7 mai 2009 à 11:22
mai par contre je c tjs pa commen faire pour tapez une seule fois le mot de pass
paske un while ca me fait beuger le fenetre de connection => peut pas taper login + pwd

???
0
sandul Messages postés 3927 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 723
7 mai 2009 à 11:44
Heu... Difficile de dire de que tu souhaites par là (pas d'exemple avec un while dans ton code posté dans ce thread). Poste un code exécutable et complet de préférence (bon, tu élagues les parties inutiles et gardes la partie qui te pose souci).

++
0
madeinloveyou Messages postés 61 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 avril 2010
7 mai 2009 à 12:12
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == Connex){
ConnectionMySQL connect = new ConnectionMySQL();
// ici le programme pass directement à :
connexion = connect.getConnexion();
// ya pas moyen de faire : tant que connect est "ouvert" (kon a pa fait .dispose(); )
// on attend ....(d'avoir login + pass => getConnection qui retourne 1 valeur et non : NULL )
}

getConnection retourn la connection créer dans la class ConnectionMySQL

ça va comme code ?!?
0
madeinloveyou Messages postés 61 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 22 avril 2010
2 juin 2009 à 17:09
du coup pour faire simple g fait une boite de dialog
avec un JTextField et un JPasswordField
la voici pour ceux que ça intéresse :
public void Connect2BD(){
		String login = null, pwd = null;
		Object[] message = new Object[4];
		message[0] = "Login";
		message[1] = new JTextField();
		message[2] = "Password"; //Message apparaissant dans le corps du dialog
		message[3] = new JPasswordField();

		// Options (nom des boutons)
		String option[] = {"Connection", "Cancel"};

		int result = JOptionPane.showOptionDialog(
			null,message,"Connection to MySQL",
			JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE,
			new ImageIcon("./logo-inra-small.gif"),option,message[1]);

		if(result == 0){
		pwd = ((JPasswordField)message[3]).getText().toString();
		login = (((JTextField)message[1]).getText()).toString();
		connect2MySQL(login,pwd);
		if(!connexion.equals(null)){}
		}
	}

Merci à tous ceux qui répondent à nos questions ;)
0