# Datenbankstruktur im JTree darstellen



## mariusbopp (29. Mrz 2011)

Hey hey,

der Titel verrät ja schon um was es geht! die Strucktur einer Datenbank als Tree darstellen...:bahnhof:
leider hab ich keine ahnung wie ich das anstellen sol gestern hab ich es geschaft den Tree meines OS dazustellen das hat gut geklappt aber mit Dbs hab ich keine ahnung
hier mal ein bild wie es aussehen sollte:


----------



## Michael... (29. Mrz 2011)

Eine Möglichkeit Informationen zum Aufbau einer DB zu bekommen ist die jeweilige Implementierung des Interfaces DataBaseMetaData, welche man über die Connection bekommt Connection.getMetaData()
Darüber könnte man z.B. die Tabellen ermitteln: DatabaseMetaData.getTables(java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
Viele DB Systeme besitzen aber auch Systemtabellen (z.B. Oracle) aus denen man einfach per Statement die benötigten Informationen abfragen kann.


----------



## mariusbopp (29. Mrz 2011)

okay das gut ich mir schonmal an danke
ich hab eine einfache mysql datenbank angelegt, eine tabelle 3 spalten....

jetzt will ich darauf mittels java zugreifen aber irgendwie mach ich was falsch mim driver glaube ich

hab bis jetzt :
	
	
	
	





```
import java.sql.*;
public class MeineErsteAbfrage {
	Connection con=null;
	Statement stmt=null;
	ResultSet rs=null;
	
	public static void Main(String args[]){
		try{
			Class.forName("com.mysql.jdbc.Driver").getInstance();
		}
		catch(ClassNotFoundException e){
			e.printStackTrace();
			System.exit(1);
		}
		
	}

}
```

und eclipse meckert mit getInstance(); an

was is da falsch?? benutze connector/j


----------



## Michael... (29. Mrz 2011)

Wozu das getInstance()? Die Methode gibt's in dem Fall doch gar nicht.


----------



## mariusbopp (29. Mrz 2011)

zur bekannt machung des treibers in dem fall...

ich habe es aus einem bsp aus dem internet...

hier der link dazu datenbankzugriff mit java(JDBC)
is das was dort erklärt is misst? habe bis jetzt noch nichts mit DB gemacht deswegen kann ich es nicht beurteilen


----------



## Michael... (29. Mrz 2011)

```
getInstance()
```
 ist definitiv falsch. Die Klasse Class kennt höchstens eine Methode 
	
	
	
	





```
newInstance()
```
, ob das bei mySQL notwendig ist kann ich nicht sagen. Bei Oracle reicht einfach nur Class.forName(...).


----------



## mariusbopp (29. Mrz 2011)

okay ja ich habe es jetzt hinbekommen 
nur was mir noch unklar ist wie kann ich denn daten hinzufügen

```
ResultSet daten = abfrage.executeQuery("SELECT * FROM test_tabelle;");
	ResultSetMetaData metaDaten = daten.getMetaData();
```
so bekomme ich was ind er DB steht aber wie mache ich es das ich etwas rein schreiben kann??

hab gelesen das es etwas mit executeUpdat ist oder?


```
public static void main(String[] args) {
Connection verbindung = null; Statement abfrage = null;
try {
	Class.forName(DRIVER);
	verbindung = DriverManager.getConnection(URL, USERID, PSWD);
	abfrage = verbindung.createStatement();
	ResultSet daten = abfrage.executeQuery("SELECT * FROM test_tabelle;");
	ResultSetMetaData metaDaten = daten.getMetaData();
	System.out.printf("%-25s %-30s \n", metaDaten.getColumnName(1), metaDaten.getColumnName(2));
while (daten.next())
	System.out.printf("%-25s %-30s \n", daten.getString(1), daten.getString(2));
} catch (Exception e) {e.printStackTrace(); }
finally {
try {
	abfrage.close();
	verbindung.close();
} catch (Exception e) { e.printStackTrace(); }
}
}
```

so hab ich das und geht auch super! nur wie gesagt das hinzufügen von daten will nicht so
das mit sql is kein problem 
	
	
	
	





```
INSERT INTO `filme`.`test_tabelle` (
`nr` ,
`name` ,
`sonstiges`
)
VALUES (
'3', 'Willy', 'wieder nix'
);
```


----------



## Michael... (29. Mrz 2011)

executeQuery ist nur für "Abfragen" - deswegen ...Query ;-)
Es gibt auch noch die Methode execute() um generell Statements an die DB abzusetzen.

Das Interface Statement (Java Platform SE 6) bietet aber auch konkrete Methoden für spezifische Statements.

Noch ein Hinweis auf: PreparedStatement (Java Platform SE 6)
Hier spart man sich den Ärger, den man sich anderweitig beim Zusammenbasteln von Statements per Stringkonkatenation einhandeln kann.


----------



## mariusbopp (29. Mrz 2011)

okay das mit den statements hab ich ja halb kapiert die benutze ich ja schon
	
	
	
	





```
Statement abfrage = null;
```

nur dann hier 
	
	
	
	





```
abfrage = verbindung.createStatement();
			ResultSet daten = abfrage
					.executeQuery("SELECT * FROM test_tabelle;");
			ResultSetMetaData metaDaten = daten.getMetaData();
```
hab ich meine probleme ich kann ja dann nicht für das "insert...." kein ResultSet benutzen 

ich hab jetzt ein neues Statement erzeugt und dann komm ich nicht weiter welchen wert muss das denn haben? ???:L


----------



## Michael... (29. Mrz 2011)

Ein Statement ist eher eine "Anweisung" als eine Abfrage.


```
Statement stmt = connection.createStatement();
// Eine Abfrageanweisung
ResultSet rs = stmt.executeQuery("Select * from tabelleXY");
while(rs.next()) {
    System.out.println(rs.getString(1));
    ...
}

// Eine Einfügeanweisung
stmt.executeUpdate("Insert into tabelleXY (id, name) values (123, 'heinz') ");
```
Speziell für Update und Insert Statements möchte ich nochmal auf PreparedStatments verweisen. Hier kann man schon im Code besser kontrollieren, dass gültige Datentypen übergeben werden.


----------



## mariusbopp (29. Mrz 2011)

ja das habe ich mir auch schon durchgelesen :toll: wollte jetzt aber nicht meine ganzen mühen von heute morgen einfach mal so über den haufen werfen das werde ich dann morgen oder so mal machen


----------



## mariusbopp (29. Mrz 2011)

super hab es so hinbekommen  aber wie du schon geschrieben hast ist es mit dem PreparedStatments übersichtlicher

puhhh dann bin ich ja froh das ich da ganz alleine drauf gekommen bin :lol: danke dir nochmal:toll:


----------



## mariusbopp (29. Mrz 2011)

Michael... hat gesagt.:


> Eine Möglichkeit Informationen zum Aufbau einer DB zu bekommen ist die jeweilige Implementierung des Interfaces DataBaseMetaData, welche man über die Connection bekommt Connection.getMetaData()
> Darüber könnte man z.B. die Tabellen ermitteln: DatabaseMetaData.getTables(java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
> Viele DB Systeme besitzen aber auch Systemtabellen (z.B. Oracle) aus denen man einfach per Statement die benötigten Informationen abfragen kann.



das hier is das nächste was ich angehen muss... ich benutze mysql kann mand a dann einfach per statement die infos raus holen oder über die getMetaDaten...?


----------



## Michael... (29. Mrz 2011)

Hab nur mit Oracle zu tun. Aber das MySQL Handbuch sollte Antworten liefern. z.B. hier:
MySQL :: MySQL 5.1 Referenzhandbuch :: 22 Die Datenbank INFORMATION_SCHEMA


----------



## mariusbopp (30. Mrz 2011)

moin
wieder ne frage die ich mir grade gestellt hab:
und zwar hab ich die matadaten abgerufen
	
	
	
	





```
com.mysql.jdbc.ResultSetMetaData@85af80 - Field level information: 
	com.mysql.jdbc.Field@c51355[catalog=filme,tableName=test_tabelle,originalTableName=test_tabelle,columnName=nr,originalColumnName=nr,mysqlType=3(FIELD_TYPE_LONG),flags=, charsetIndex=63, charsetName=US-ASCII]
	com.mysql.jdbc.Field@787171[catalog=filme,tableName=test_tabelle,originalTableName=test_tabelle,columnName=name,originalColumnName=name,mysqlType=253(FIELD_TYPE_VAR_STRING),flags=, charsetIndex=8, charsetName=Cp1252]
	com.mysql.jdbc.Field@15fea60[catalog=filme,tableName=test_tabelle,originalTableName=test_tabelle,columnName=sonstiges,originalColumnName=sonstiges,mysqlType=253(FIELD_TYPE_VAR_STRING),flags=, charsetIndex=8, charsetName=Cp1252]
```

kann ich dann anhand dieser infos den tree dann "automatisch" erstellen (also mit automatisch meine ich das wenn ich jetzt eine andere DB nehme das die stucktur dann der neuen DB entspricht)??


----------



## ARadauer (30. Mrz 2011)

ja bzw ja, warum denn nicht?


----------



## mariusbopp (30. Mrz 2011)

naja ich hab noch recht wenig ahnung von dem ganzen wie würdest du es denn am besten machen also deine vorgehensweise? gibt es noch andere wege den tree dann zu "füllen" und wie splitte ich die metadaten am sinnvollsten?


----------



## Michael... (31. Mrz 2011)

Nicht splitten. Das Interface DataBaseMetaData bietet ja Methoden an um an die gewünschten Informationen zu kommen. z.B. die bereits erwähnte getTables, um an die Tabellen zu kommen und getColumns um an die Felder einer Tabelle zu kommen...

ResultSetMetaData bietet Methoden an um Informationen zum ResultSet zu ermitteln


----------



## mariusbopp (1. Apr 2011)

hey hey,

ich hab das mal versucht mit dem getTables usw aber bei mir kommt dann immmer sowas wie :

```
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	The method getColumns() is undefined for the type ResultSetMetaData

	at DBtree.main(DBtree.java:62)
```

aber meine metadaten sind ja von diesem typ... und wenn ich sie mir ausgeben lasse erhalte ich ja auch alles tabellen namen spalten namen usw...???:L deswegen weiß ich nicht wie ich das anstellen soll -.-


----------



## ARadauer (1. Apr 2011)

mariusbopp hat gesagt.:


> deswegen weiß ich nicht wie ich das anstellen soll -.-


???:L
du musst die doku lesen 
ResultSetMetaData (Java 2 Platform SE 5.0)


----------

