Datenbankstruktur im JTree darstellen

mariusbopp

Bekanntes Mitglied
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:
 
Zuletzt bearbeitet von einem Moderator:

Michael...

Top Contributor

mariusbopp

Bekanntes Mitglied
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 :
Java:
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...

Top Contributor
Code:
getInstance()
ist definitiv falsch. Die Klasse Class kennt höchstens eine Methode
Code:
newInstance()
, ob das bei mySQL notwendig ist kann ich nicht sagen. Bei Oracle reicht einfach nur Class.forName(...).
 

mariusbopp

Bekanntes Mitglied
okay ja ich habe es jetzt hinbekommen :)
nur was mir noch unklar ist wie kann ich denn daten hinzufügen
Java:
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?

Java:
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
SQL:
INSERT INTO `filme`.`test_tabelle` (
`nr` ,
`name` ,
`sonstiges`
)
VALUES (
'3', 'Willy', 'wieder nix'
);
 

Michael...

Top Contributor
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

Bekanntes Mitglied
okay das mit den statements hab ich ja halb kapiert die benutze ich ja schon
Java:
Statement abfrage = null;

nur dann hier
Java:
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...

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

Java:
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

Bekanntes Mitglied
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:D
 

mariusbopp

Bekanntes Mitglied
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

Bekanntes Mitglied
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...?
 

mariusbopp

Bekanntes Mitglied
moin
wieder ne frage die ich mir grade gestellt hab:
und zwar hab ich die matadaten abgerufen
Code:
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)??
 

mariusbopp

Bekanntes Mitglied
naja ich hab noch recht wenig ahnung von dem ganzen:oops: 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...

Top Contributor
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

Bekanntes Mitglied
hey hey,

ich hab das mal versucht mit dem getTables usw aber bei mir kommt dann immmer sowas wie :
Code:
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 -.-
 

Ähnliche Java Themen


Oben