# Connection bleibt null



## nieselfriem (24. Jan 2011)

Hallo!

In meiner kleine Loginklasse kann ich die Verbidnungsvariable nicht mittels einer get-Methode weitergeben. Das heist, in der Methode ist die conn-Variable mit den verbidnungsdaten initialisiert. In der get-Methode ist sie wieder null, obwohl sie global in der Klasse initialisiert ist.

```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logintest;

/**
 *
 * @author georg
 */
import java.sql.*;

public class Login {

    private Connection conn;
    private String password;
    private String user;

    public Login() {
    }
    //Soll einfach nur den Login durchführen und wenn alles ok ist ein Verbidnugs erzeugen
    public void login(String user, String password) throws SQLException, ClassNotFoundException {
        this.user = user;
        this.password = password;
        Class.forName("com.mysql.jdbc.Driver");
        this.conn = DriverManager.getConnection("jdbc:mysql://localhost/jahbtest?user=" + this.user + "&password=" + this.password);
        System.out.println("conn in login" + conn);//conn hat die Verbindung zu DB hergerstell
    }//login
    //Zugriffsmöglichkeit für andere Klassen, die auf die Connectio-Variable zugreifen wollen ohne immer ein login durchführen zu müssen
    public Connection getConnection() {
//conn bleibt immer null
        if (this.conn != null) {
            System.out.println("conn in getConnection bei login" + this.conn);
            return this.conn;
        } else {
            return null;
        }
    }//getCoonnection
}//class
```


```
public class SQLConnect  {
    protected Connection conn;
    /**
     * Dieser Kontruktor ist die Basis aller DAO-Klassen in diesem System
     * Alle DAO-Klassen rufen durch vererbung den Kontruktor auf und laden dabei
     * den Datenbanktreiber und erhalten die Verbindung
     * @throws SQLException
     * @throws ClassNotFoundException
     */

    public SQLConnect() throws SQLException, ClassNotFoundException  {

            Login log = new Login();
            conn = log.getConnection();//Verbindungsdaten beziehen
            System.out.println("Connect in SQLConnect="+conn);

    }//Konstruktor
}
```


```
public class GetDatasDAO extends SQLConnect {
	public GetDatasDAO() throws ClassNotFoundException, SQLException{
		super();//Verbindungsdaten aufrufen
	}

	public void getDatas() throws SQLException, ClassNotFoundException {
		if (conn != null) {
			 PreparedStatement stmt = conn.prepareStatement("SELECT `Name`.`AN-ID` FROM `Arbeitnehmer");
			 ResultSet rs=stmt.executeQuery();
                           System.out.println("getdata");
			 while(rs.next()) {
				System.out.println("Name = "+rs.getInt(2)+" AN-ID = "+rs.getString(1));
			 }
			 conn.close();
		}//if
                else System.out.println("Conn="+conn);
	}//getDatas
}//class
```


```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logintest;

import java.sql.*;
import java.lang.ClassNotFoundException;

/**
 *
 * @author georg
 */
public class Main {

    private static String user = "root";
    private static String password = "passwort";

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Login log = new Login();
        try {
            log.login(user, password);//login durchführen
        } catch (ClassNotFoundException ce) {
            ce.printStackTrace();
        }//catch
        catch (SQLException ex) {
            ex.printStackTrace();
        }//catch

        try {
            GetDatasDAO getDatas = new GetDatasDAO();//daten abrufen 
            getDatas.getDatas();

        } catch (ClassNotFoundException ce) {
            ce.printStackTrace();
        }//catch
        catch (SQLException ex) {
            ex.printStackTrace();
        }//catch
    }
}
```

Was läuft dabei schief. Bzw. wie mach ich es besser?

Gruß niesel


----------



## tfa (24. Jan 2011)

Dein Login-Objekt in der main()-Methode wird zwar erzeugt aber nicht verwendet. Das GetDatasDAO-Objekt hat zwar ein Login-Objekt, das wird aber nie initialisiert (login wird nie aufgerufen).
Grundsätzlich solltest du deine Klassenhierarchie überdenken. Ein DAO ist sicherlich keine Connection, es hat vielleicht eine. Also keine Vererbung sonder eher Komposition.


----------



## daNny (24. Jan 2011)

Wo genau ist jetzt das Problem? Das habe ich nicht ganz verstanden.

Was mir auffällt: In deiner Main-Methode rufst du log.login() auf, aber das Login-Objekt wird nicht weiter verwendet.
Ich der Oberklasse SQLConnect erzeugst du im Konstruktor ein neues Login() Object (ein anderes als in deiner Main-Methode), dort wird aber kein log.login() aufgerufen, also auch keine Connection erzeugt.

Kommt das in etwa so hin?

Edit: Zu langsam


----------



## nieselfriem (24. Jan 2011)

Die Connection soll eigentlich nur einmal erzeugt werden und zwar mit dem aufruf log.login() in der Main. In der SQLConnect soll dann mittels des Kontrutkors das voher durch log.login() erzeugt conn-Object mit den Verbindungsdaten aufgerufen und verwendet werden. So der Plan....

Gruß niesel


----------



## nieselfriem (24. Jan 2011)

tfa hat gesagt.:


> Dein Login-Objekt in der main()-Methode wird zwar erzeugt aber nicht verwendet. .


doch hier

```
Login log = new Login();
        try {
            log.login(user, password);//login durchführen
        }
```

Gruß niesel


----------



## daNny (24. Jan 2011)

nieselfriem hat gesagt.:


> doch hier
> 
> ```
> Login log = new Login();
> ...



Danach passiert damit aber auch nichts mehr! Entweder du übergibst diese Instanz deinem danach erzeugten Dao, oder führst die login() Methode im Konstruktor des DAOs aus.
Generell ist dein Design, wie tfa aber sagte, etwas unschön


----------



## nieselfriem (25. Jan 2011)

Ist es nun besser die Daten wie benutzername im Kontrukor einer Klasse zu übergeben, oder es an die Methode direkt

also

GetDatasDAO get = new GetDatasDAO(use,passw,Log)
get.getDatas();
oder besser 
GetDatasDAO get = new GetDatasDAO
get.getDatas(user,passw,Log)

Gruß niesel


----------



## daNny (25. Jan 2011)

Naja... was besser ist, das ist immer Ansichtssache

Aber gerade dein DAO soll die Datenbankkommunikation "verstecken". Es macht also kein sinn, jeder Methode die Zugangsdaten mit zu übergeben...


----------

