# Datenbankverbindungsklasse



## tom223 (11. Feb 2008)

Hallo,

ich möchte gerne eine Klasse erstellen, die mir eine verbindung zur datenbank aufbaut.
Hintergrund ist, dass ich mit dem ibm functionaltester testscripts erstelle, welche unsere applikation testet.
Damit ich die einzelnen felder mit daten füttern kann benötige ich den datenabnkzugriff auf oracle. 
Das hat soweit auch alles geklappt... nur eben nicht das ausglidern in eine klasse. 
Wie macht man sowas am geschicktesten?


```
import java.sql.*;

public class DatabaseConnect {
	
	
	//Datenbanktreiber laden
	try {
		Class.forName("oracle.jdbc.driver.OracleDriver");
	}
	catch (Exception e) {
		System.out.print("Datenbanktrieber konnte nicht geladen werden");
	}
	
	
	
	//Datenbank Variablen initialisieren
	try {
		
	
		String url = "jdbc:oracle:thin:@ip:port:DB";
		String user = "test";
		String password = "test";
		
		
		//Variablen für den Driver Manager
		
		Connection zugang = null;
		Statement sqlquery = null;
		
		//Aufbau der Verbindung zur Datenabnk via Driver Manager
		
		zugang = DriverManager.getConnection(url,user,password);
		sqlquery = zugang.createStatement();
		
	}
	catch (Exception ex) {
		System.out.print("Verbindung zur Datenabnk konnte nicht ausgeführt werden.");
	}
	
		public static void main(String[] args) {
			System.out.print("test");
		}
	
		
}
```
[/code]


----------



## Joker (11. Feb 2008)

so wird es nicht funktionieren. In deiner url fehlen ja noch die Angaben. Du musst da Werte für ip, port und den DB Namen angeben damit der Treiber sich verbinden kann.

Dazu kommt, das dein gesamter Klassenaufbau falsch ist. Der Code gehört innerhalb der Klasse in eine Methode.

z.B. so


```
public class DBConnection {
	private final static String driver = "oracle.jdbc.driver.OracleDriver";
	private final static String url = "jdbc:oracle:thin:@ip:port:DB";
	private final static String user = "test";
	private final static String pass = "test";
	
	private static Connection connection;
	
	public static Connection openConnection() {
		if(connection != null) {
			return connection;
		} else {
			 try { 
			      Class.forName(driver); 
			      connection = DriverManager.getConnection(url, user, pass);
				  return connection;
			   } 
			   catch (SQLException e) { 
			      System.out.print("Datenbanktrieber konnte nicht geladen werden"); 
			   } 
			   catch (ClassNotFoundException cnfe) {
				   System.err.println(cnfe.getMessage());
			   }
		}
		return null;
	}
}
```


----------



## tom223 (11. Feb 2008)

Sorry.. die Datenbankverbindungsdaten hab ich einfach rausgelöscht.. die hab ich antürlich eingetragen..

ich habe zwischen zeitlich mein problem auch insofern lösen können, als das ich mir eine klasse datenbank geschrieben habe, die ein objekt vom typ datenbank erzeugen kann wo ich dme konstruktor den sql befehl mitgeben kann und er mir dann eine Ausgabe macht.

Mein Rpoblem ist jedoch jetzt, wie ich diese Klasse in einer anderen klasse nutzen kann...

mit import hole ich mir packages und mit extend leite ich von einer bestehendne klasse ab.



```
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 

public class Datenbank { 
    
   String url; 
   String user; 
   String pass; 
   Statement befehl; 
   Connection verbindung; 
   ResultSet datenmenge; 
   String username; 
    
   public Datenbank() 
   { 
      url = "jdbc:oracle:thin:@bekannt:bekannt:DB"; 
      user = "***"; 
      pass = "***"; 
       
      try 
      { 
         Class.forName("oracle.jdbc.driver.OracleDriver"); 
         } 
      catch (Exception e) 
      { 
         System.err.println("Fehler beim Laden des Treibers."); 
       
         return; 
      } 
       
       
       
      try 
      { 
         verbindung = DriverManager.getConnection 
                  (url,user,pass); 
         befehl = verbindung.createStatement(); 
      } 
      catch (Exception e) 
      { 
         System.err.println("Verbindung zu "+ url +" fehlgeschlagen"); 
      } 
      
            
   } 
   
   public void datenauslesen(String query){
	   try 
	      { 
	         datenmenge = befehl.executeQuery 
	         (query); 
	          
	         while (datenmenge.next()) 
	         { 
	         username = datenmenge.getString("username"); 
	         System.out.println(username); 
	         }	         
	         verbindung.close(); 
	      } 
	      catch (Exception e) 
	      { 
	         System.err.println("Fehler beim Laden des Datensatzes"); 
	      }  
   }
    

   public static void main (String[] args) 
   { 
      //Datenbank eins = new Datenbank();
      //eins.datenauslesen("SELECT id,username FROM test");
   } 
}



Wie binde ich diese klasse jetzt in eine andere ein
und erzeuge dort ein neues objekt?



[quote]
public class Extendtest extends Datenbank {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Automatisch erstellter Methoden-Stub
		Datenbank eins = new Datenbank ();

	}

}

Eclipse sagt mir natürlich das der konstruktor fehlt...

Wie mach ichdas? muss das ganze eine schnittstelle sein?[/quote]
```


----------



## HLX (11. Feb 2008)

```
public class Test { 

   public static void main(String[] args) { 
            Datenbank eins = new Datenbank(); 
   } 
}
```

Wo ist das Problem?


----------



## tom223 (11. Feb 2008)

ok danke..

noch eine Frage:



```
´
String datenauslesen(String query){
	   try 
	      { 
		   	 
	         datenmenge = befehl.executeQuery 
	         (query); 
	          
	         while (datenmenge.next()) 
	         { 
	         username = datenmenge.getString("username"); 
	         System.out.println(username); 
                         return username;
	         
	         }	         
	         verbindung.close(); 
	         
	      } 
	      catch (Exception e) 
	      { 
	         System.err.println("Fehler beim Laden des Datensatzes"); 
	      }  
	      
   }
```


wieso kann ich in der while shcleife keinen usernamen zurckgeben... das ganze geht nur wenn ich das unter dem letten catch block mahce..


----------



## HLX (11. Feb 2008)

Deine Methode hat einen Rückgabewert (String). Daher musst du immer etwas zurückgeben. Tust du dies nur in der Schleife, ist eine Rückgabe jedoch nicht sichergestellt, da die Schleife nicht unbedingt betreten werden muss. Du brauchst für jeden Anwendungsfall eine Rückgabe.

Du kannst allerdings sowohl in der Schleife, als auch am Ende der Methode etwas zurückgeben.


----------



## tom223 (11. Feb 2008)

```
String datenauslesen(String query){
	   
	   try 
	      { 
		   	 
	         datenmenge = befehl.executeQuery 
	         (query); 
	          
	         while (datenmenge.next()) 
	         { 
	         username = datenmenge.getString("username"); 
	         System.out.println(username); 	 
	         return username;
	         
	         }	         
	         verbindung.close(); 
	         
	      } 
	      catch (Exception e) 
	      { 
	         System.err.println("Fehler beim Laden des Datensatzes"); 
	      }  
	      
	      return username;
   }
```

So sieht jetzt mein optimierter code aus.. und dennoch bekomme ich nur einen wert statt drei zurück.


Hier die andere Klasse:


```
name = eins.datenauslesen("SELECT id,username FROM test");
		
		System.out.print(name);
```


----------



## HLX (11. Feb 2008)

Hehe, dacht ich´s mir doch, dass das hier Wunsch und Code etwas auseinander gehen. :wink: 

Mit dem Return brichst du die Schleife ab. Der erste gefundene Wert wird zurückgegeben.

Wenn du alle Werte aus dem ResultSet haben willst, füllst du am Besten eine Liste in der Schleife und gibst diese dann zurück:


```
java.util.List datenauslesen(String query){ 
      java.util.List liste = new java.util.ArrayList(); 
      try { 
             
            datenmenge = befehl.executeQuery 
            (query); 
             
            while (datenmenge.next()) 
            { 
                username = datenmenge.getString("username"); 
                System.out.println(username);     
                liste.add(username);             
            }             
            verbindung.close(); 
             
      } 
      catch (Exception e) 
      { 
         System.err.println("Fehler beim Laden des Datensatzes"); 
      }  
         
      return liste; 
}
```


----------



## ARadauer (11. Feb 2008)

ich würde mal sagen, du bschäftigst dich am Besten mal mit den Grundlagen bevor du großartige Datenbank Anwenungen schreibst


----------



## tom223 (11. Feb 2008)

danke hlx!

hab shcon viele tuts gelesen aber mit mit liste noch gar nichts.

genau das was ich gesucht habe


----------



## Guest (12. Feb 2008)

wenn ich dne code in derselben klasse abrufe:


```
public static void main (String[] args) 
   { 
	  java.util.List test;
      Datenbank eins = new Datenbank();
      test = eins.datenauslesen("SELECT id,username FROM test");
      System.out.println(test);
   }
```
geht es...
nur in einer neuen klasse bekomme ich keine ausgabe
	
	
	
	





```
public class Extendtest extends Datenbank {

	
	public static void main(String[] args) {
		
		java.util.List test;
		Datenbank drei = new Datenbank ();
		test = drei.datenauslesen("SELECT id,username FROM test");
		System.out.print(test);

	}

}
```


----------



## HLX (12. Feb 2008)

Mach das "extends Datenbank" mal weg. Das brauchst du hier nicht.

Gibt´s eine Fehlermeldung?


----------



## Guest (12. Feb 2008)

nein es gibt leider keinen fehler.


```
public class Extendtest {

	
	public static void main(String[] args) {
		
		java.util.List test;
				
		Datenbank drei = new Datenbank ();
		test = drei.datenauslesen("SELECT id,username FROM test");
		System.out.println(test);
		System.out.println(test.size());
		
	}

}
```


----------



## HLX (12. Feb 2008)

Irgendwas muss ausgegeben werden. Was steht in der Konsole? null?

Probier mal ein bisschen rum. Falls du keine IDE verwendest erweitere deine Konsolen-Ausgaben.


----------



## Guest (12. Feb 2008)

ich verwende eclipse. in der konsole wird leider nichts angezeigt.
Es ist einfach alles weiss.


----------



## HLX (12. Feb 2008)

Dann setze eine Brechpunkt in Zeile 8 und gleite durch deinen Code.

Wie das geht? 
- Randleiste deiner geöffneten Klasse (bei Zeile 8) --> rechte Maustaste --> "Toggle Breakpoint"
- Programmstart über den Käfer in der Toolbar


----------

