# Problem mit JDBC



## megachucky (3. Jan 2005)

habe folgendes problem:


habe eine gui, und möchte über einen button eine sql abfrage machen. es kommt aber immer folgende nullpointer exception in dieser zeile:



```
stmt = conn.createStatement();
```

allerdings hab ich ja vorher wie in meinem tut beschrieben:


```
Statement stmt = null
```
 gemacht, was fehlt hier noch?

= new Statement() ist ja nicht möglich.


vorher hatte ich eine nullpointer exception an dieser stellen:


```
conn = dataBaseConnection.getConn();
```

hab dann einfach:


```
dataBaseConnection = new DataBaseConnection();
```
 davor gemacht, dann kam der fehler nicht mehr.

ich nehme aber an, das ist schon nicht ok, oder? aber wie löse ich das sonst?



ich habe die datenbank connection in einer anderen klassen als das statement, ich nehme an es liegt irgendwie da dran, finde aber keine lösung (die datenbankverbindung klappt übrigens einwandfrei).

evtl geht dass mit der getConn() methode nicht, aber wenn das der grund ist, warum geht es so nicht, und wie muss ich es machen? ich möchte auf jeden fall die connection und die selects in unterschiedliche klassen machen, das geht ja sicher, oder?

hier die nötigen klassen:



```
package version1_1;

/**
 * DataBaseConnection connects to the MYSQL Database and opens a SQL Window if the
 * connection was done successfully.
 * 
 * @author CHUCKY
 * @version 1.1 Build 02.01.2005
 * 
 */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DataBaseConnection 
{
	private Connection conn = null;
	private SQLWindow sqlWindow;
	
	public DataBaseConnection()
	{
		
	}
	/**
	 * Connects to the MYSQL DataBase and opens a SQLWindow
	 * if the connection was done successfully.
	 *
	 */
	public void connectToDataBase()
	{
		String driver = "com.mysql.jdbc.Driver";
		
		try
		{
			Class.forName(driver).newInstance();
			System.out.println("Class Loaded.");
		}
		catch (Exception e)
		{
			System.out.println("Class not found.");
			e.printStackTrace();
		}
		
		String password = "dummies";
		String url = "jdbc:mysql://localhost:3306/";
		String dataBase = "coffeebreak";
		String user = "root";
		
		try 
		{
			conn = DriverManager.getConnection(url+dataBase, user, password);
			System.out.println("Connection done.");
			sqlWindow = new SQLWindow("SQL Window");
		}
		catch (SQLException sqle)
		{
			System.err.println("Connection failed with: " + url + dataBase + " "
					+ user + " " + password);
			System.err.println("Error message: " + sqle.getMessage());
		}
	}
	
	
	/**
	 * @return Returns the conn.
	 */
	public Connection getConn() {
		return conn;
	}
}
```




```
package version1_1;

/**
 * DataBaseOperationsImpl implements the functions from the DataBaseOperations
 * Interface.
 * 
 * @author CHUCKY
 * @version 1.1 Build 03.01.2005
 */

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DataBaseOperationsImpl implements DataBaseOperations
{
	private Connection conn;
	
	private DataBaseConnection dataBaseConnection;
	
	public DataBaseOperationsImpl()
	{
		
	}
	/**
	 *  Does the first query in this application. (only for test purposes)
	 */
	public void doQuery()
	{
		dataBaseConnection = new DataBaseConnection();
		conn = dataBaseConnection.getConn();
		Statement stmt = null;
		ResultSet rset = null;
		String doQuery = "SELECT COF_NAME FROM COFFEES";
		String cof_name = "";
		
		try 
		{
			stmt = conn.createStatement();
			
			rset = stmt.executeQuery(doQuery);
			
			while (rset.next())
			{
				rset.getString("COF_NAME");
				System.out.println(cof_name + " ");
			}
		}
		catch (SQLException sqle)
		{
			System.err.println("SQL Exception: ");
			System.err.println(sqle.getMessage());
		}
	}
}
```


```
package version1_1;

/**
 * Creates a new Window where you can make queries and manipulations to the
 * connected database.
 * 
 * @author CHUCKY
 * @version 1.1 Build 02.01.2005
 */

import java.awt.Container;
import java.awt.FlowLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;



public class SQLWindow extends JFrame implements ActionListener
{
	private JButton doQueryButton;
	private DataBaseOperationsImpl dataBaseOperationsImpl;
	private String doQuery = "doQuery";
	
	public SQLWindow(String title)
	{
		super(title);
		
		JFrame.setDefaultLookAndFeelDecorated(true);
		
		Container contentPane = getContentPane();
		contentPane.setLayout(new FlowLayout());
		
		addButtons();
		
		contentPane.add(doQueryButton);
		
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		pack();
		setSize(1000, 600);
		setResizable(false);
		setVisible(true);
	}
	
	public void addButtons()
	{
		doQueryButton = new JButton("Do a Query");
		doQueryButton.setActionCommand(doQuery);
		doQueryButton.addActionListener(this);
	}
	
	public void actionPerformed(ActionEvent e)
	{
		if (e.getActionCommand().equals(doQuery))
		{
			dataBaseOperationsImpl = new DataBaseOperationsImpl();
			dataBaseOperationsImpl.doQuery();
		}
	}
	
}
```


----------



## Bleiglanz (3. Jan 2005)

diese Helper sind so schlecht, lern lieber die Grundlagen von JDBC und schreib den Code ohne solche Hilfsklassen!


----------



## megachucky (3. Jan 2005)

welche hilfsklassen meinst du?

du meinst connection aufbauen und abfragen machen in einer klasse?

würde trotzdem gerne wissen was hier falsch ist. thx


----------



## thE_29 (3. Jan 2005)

Im falschen Forum isses, soviel is klar 

Und weg damit 

desweitern würde ich in den Konstruktor 

```
public DataBaseConnection()
   {
      connectToDataBase() ;
   }
```
 was reinschreiben 

so hab keine Zeit mehr, musst halt schauen was falsch ist


----------



## megachucky (3. Jan 2005)

hm, dacht dass anfängerfragen immer hier rein kommen 

in den konstruktor soll eigentlich hier nix, die methode wird ja woanders aufgerufen. 

also ich habs mittlerweile etwas weiter geschafft: ich muss natürlich in der methode doQuery noch zuerst die methode 
connectToDataBase aufrufen.
wenn ich dann beiden methoden in der klasse DataBaseConnection habe,läuft nun auch alles und die abfrage klappt.

wenn ich es allerdings eben in 2 klassen probiert, also eine für die connection und eine für das select, dann klappt es nicht.

kann mir bitte jemand sagen wie ich das mache?

ich muss ja irgendwie das stmt und conn in die andere klasse "bringen", damit ich dort dann


```
dataBaseConnection = new DataBaseConnection();
dataBaseConnection.connectToDataBase()
```

innerhalb der doQuery methode aufrufen kann ?!?


----------



## thE_29 (4. Jan 2005)

Hast du der 2ten Klasse die Verbindung irgendwo mitübergeben?

Soweit ich sehe net, oder?

dataBaseConnection = new DataBaseConnection();
      conn = dataBaseConnection.getConn(); 

da fehlt wieder verbinden!

Oder du übergibst sie mit!


----------



## megachucky (4. Jan 2005)

> Hast du der 2ten Klasse die Verbindung irgendwo mitübergeben?



hatte es mit der getConn() methode probiert, aber das ging ja irgendwie nicht?!? wie übergebe ich die conn an die zweite klasse?
[/code]


----------



## allievo (6. Jan 2005)

thE_29 hat gesagt.:
			
		

> Im falschen Forum isses, soviel is klar
> 
> Und weg damit
> 
> ...



Habe in den Buchbeispielen auch schon diese Vorgehensweise gesehen, aber warum ist das sinnvoll?

Gruß
Allievo


----------



## allievo (7. Jan 2005)

Hi,

mich verwundert es, dass noch keiner auf meine Frage geantwortet hat. Ist sie zu trivial oder hat sich obige Vorgehensweise einfach nur eingebürgert? Für Antworten schon mal vielen dank!

bye
A. :lol:


----------



## thE_29 (10. Jan 2005)

Für was gibts halt nen Konstruktor wenn du drin nix tust!

Wäre ja sinnlos wenn du jedes mal sagen musst, verbinde dich jetzt erst wieder, außer es ist eine statische Verbindung die du net immer verbunden haben willst oder halt eine normale Verbindung die du net immer verbunden haben willst!


----------



## bellmann29 (11. Jan 2005)

Hallo Chucky,

Natürlich gehören Deine Fragen hier hin. Wo denn sonst?

Also ich habe noch mal Deinen Code angesehen. 

Du erzeugst in der Klasse "DatabaseOperationImpl" zwar ein neues Objekt vom Typ "DatabaseConnection" in der Methode "doQuery()", aber Du stellst die Verbindung nicht her. Es fehlt einfach noch die Zeile "conn = databaseConnection.connectToDatabase()".
Also:


```
...
DatabaseConnection databaseConnection = new DatabaseConnection(); // ok.
databaseConnection.connectToDatabase(); // verbinden
conn = databaseConnection.getConn(); // jetzt bekommst Du sie auch
...
```
Vorher hast Du "null" zurückbekommen, da die Connection von Dir mit "null" initialisiert wurde.


```
...
private Connection conn = null; // in DatabaseConnection
...
```

Übrigens hast Du in einem späteren Beitrag die Antwort schon selbst richtig hingeschrieben. Nur nicht in Deiner App benutzt.  

Noch ein Tipp:

Wenn es ein Interface "DatabaseOperations" gibt und Du eine Implementierung schreibst. Ist es nicht schön, wenn es nicht benutzt wird.
siehe SQLWindow:

```
...
private DataBaseOperationsImpl dataBaseOperationsImpl; 
//besser wäre
private DataBaseOperations dataBaseOperations; // Dein Implementierung paßt da ja
```

Bis dann.


----------



## bellmann29 (11. Jan 2005)

Hey man, Du hattest es ja schon allein gefunden.

Aber trotzdem noch Probleme? 

Was soll die Zeile

```
...
sqlWindow = new SQLWindow("Window");
...
```
die gehört da nicht rein. 

und dann noch mal "doQuery()"

```
stmt = conn.createStatement();
rset = stmt.executeQuery(doQuery);
while(rset.next()){
  String derKaffeeName = rset.getString("COF_NAME"); //Ergebnis holen
  System.out.println("Der Name des Kaffee lautet: " + derKaffeeName); //Ergebnis ausgeben
}


// und nicht vergessen Connection zu schließen:
con.close();
```

Und wo ist eigentlich die main() ?


----------



## KSG9|sebastian (11. Jan 2005)

Also, nochmal zum Beitrag von bleiglanz...

an deiner stelle würd ich mich ne Klasse machen, die ne Verbindung zur DB aufbaut und sqls ausführt. Meiner Meinung nach ist es wenig sinnvoll die Datenbankconnection auf 3 Klassen zu verteilen.


----------

