Derby/JavaDB Zugriff auf DB mit exportiertem Programm

Tassimmo

Mitglied
Hallo zusammen,

ich beschäftige mich aktuell während meiner Ausbildung mit dem Zugriff auf Datenbanken.
In der Schule hab ich bisher nur mit MySQL-Datenbanken und xampp gearbeitet. Nun möchte ich jedoch, dass ich auch das Programm exportieren kann und trotzdem auf die Datenbank zugreifen kann.

Ich habe mit Derby eine eingebettete Datenbank gefunden, mit der das möglich sein soll.

Jetzt aber eine Frage, bevor ich den Java-Code für den Zugriff usw. schreibe:
Wie krieg ich die Derby-DB in mein Projekt, sodass es sicher (inkl. DB) exportiert wird? Denn bislang find ich die Datenbank nur in meinem Data Source Explorer, daher bin ich mir nicht sicher, wie sie exportiert werden kann.

Ich hoffe, meine Schilderung war irgendwie verständlich.

Bereits vielen Dank im Voraus für alle Antworten 🙂

Grüße
Tassimmo
 
Es existieren mehre Java-DB, die eingebettet laufen können (Derby, H2, HSLDB und selbst mySQL kann embedded laufen, obwohl ich mySQL nicht kenne.

Auf jeden Fall ist bei allen Szenarien gleich, das dein Programm lediglich eine Verbindung (Connection) zur DB aufbauen muss. Die DB wird im Dateisystem des Rechners abgelegt und du musst "nur" den JDBC-Treiber zur Datenbank integrieren. Daher ist eine Weitergabe des Programms möglich, wenn auch die DB mit geliefert wird.

Also, ist ein Export der DB möglich, aber du überbügelst Dinge in der vorhandenen DB, wenn du einfach dieser mit deiner Version überschreibst.

Das kann der Benutzer aber einfach anpassen, indem er den Connection-String zur DB anpasst.

Ich lege daher häufig zur Entwicklung die DB in einem Subordner des Projektes ab. Dort findet sich ja dein Java-Code, wahrscheinlich unter src-Zweig und daneben gibt es dann noch den Ordner db, in dem die DB steht.
 
Okay, schonmal vielen Dank für deinen Ratschlag.

Allerdings kann ich meine Datenbank aktuell scheinbar nicht einfach in den src-Folder reinkopieren. Einen derartigen Befehl finde ich leider gar nicht bei meiner Datenbank...

Ich hab aktuell nur meine Datenbank mit einer Tabelle drin. Das SQL-Script kann ich im src-Folder abspeichern, mehr aber auch nicht... Es macht ja auch keinen Sinn, den CREATE-Befehl im SQL-Script zu speichern, und dieses jedes Mal bei Programmstart auszuführen, oder?

Aber wie krieg ich tatsächlich meine DB in das Projekt rein? Dafür hab ich bislang noch nichts gefunden...

Edit:
Eine andere Möglichkeit, die ich grade gesehen habe, wäre es, die Datenbank offline zu speichern. Nur kann ich die DB so als Datei speichern, damit ich sie verschieben kann? :bahnhof:
 
Zuletzt bearbeitet:
Redest du hier von der mySQL-Datenbank?

Wenn ja, musst du die Datenbank in eine Datei exportieren (mit mysqldump) und in der embedded-DB wieder einspielen (Tabelle anlegen und Daten importieren).
 
Nein, ich hab die Datenbank bereits in Eclipse angelegt.
Sie besitzt schon ein paar Beispieldatensätze. Allerdings sehe ich aktuell nicht, wie ich die Datenbank exakt in das Projekt reinkriege. Momentan ist mein Projekt ganz normal im Paket-Explorer, während ich die Datenbank nur im Data Source Explorer aufrufen kann.

Oder kann ich später beim Exportieren auch aus dem Data Source Explorer aussuchen, was ich mitexportieren möchte? 🙁
 
Laut meinen DB-Properties hab ich die Datenbank aktuell unter
C:\Users\<Benutzername>\MyDB
gespeichert.

Wenn ich den Pfad jetzt auf meinen Workspace umlege
E:\Eclipse_Workspace\<Projektname>\db
kann ich diese DB nicht anpingen.

Verstehe ich also richtig, dass ich die Datenbank von Anfang an in dieser Location errichten muss? Aber wenn ja, wie krieg ich es dann hin, dass die Datenbank von hier genauso funktioniert wie von seiner bisherigen Adresse?
 
Nein, das ist nicht der Connection-String, den ich meine.

Du musst ja eine JDBC-verbindung zur Datenbank aufbauen. und die muss, weil es mySQL ist, so ähnlich heißen wie "jdbc:mysql:<xxx>".
 
Okay. Ich poste mal die Methode, die den Datenbankzugriff öffnet:
Java:
public class DBVerbindung 
{
	Connection mdbHangman = null;	//Verbindungsobjekt
	Statement stmtSQL = null;		//Hier wird das "SQL-Statement-Objekt" deklariert
	ResultSet rs;
	
	public void oeffneDB()
	{
		try
		{
			//Folgende Zeilen stellen eine Verbindung zu MySQL her:+
			Class.forName("com.mysql.jdbc.Driver");
			mdbHangman = DriverManager.getConnection("jdbc:mysql://C:/Users/<Username>/MyDB", "<Benutzer>", "<Passwort>");
			stmtSQL = mdbHangman.createStatement(); 
		}
		catch(ClassNotFoundException cnfe)
		{
			System.err.println(cnfe);
			System.out.println("Fehler bei ClassNotFoundException!");
			System.out.println(cnfe.toString());
		}
		catch(SQLException sqle)
		{
			System.err.println(sqle);
			System.out.println("Fehler bei SQLException!");
			System.out.println(sqle.toString());
		}
	}

Bis jetzt hab ich wie beschrieben immer mit MySQL und xampp gearbeitet, daher war der jdbc-String immer "localhost/DB-Name". Daher bin ich mir bei dem oben genannten String nicht sicher. Ich muss erst noch eine Funktion einbauen, die die DB nutzt, um zu testen, ob sie so funktioniert.
 
Zuletzt bearbeitet:
Okay...
Ich hab den Code jetzt mithilfe eines Kollegen soweit umbauen können, dass er wenigstens einen Datenbankzugriff macht. Wenn ich meinen Code debugge, komm ich immerhin schonmal zum ResultSet.
Hier bekomme ich jedoch den Fehler, dass das Schema, dass ich aufrufen möchte, nicht existiert. Das heißt, er greift irgendwie auf eine DB zu (denn die existiert ja scheinbar, hier gibts ja keinen Fehler mehr), nur auf die von mir höchstselbst erzeugte Derby-DB, die schon das aufgerufene Schema und auch Tabellen mit Datensätzen enthält, ruft er nicht auf. :autsch:

Daher meine Frage: Wie kann ich herausfinden, wo sich die Datenbank, die das Programm ansteuert, befindet?
Ich hoffe, meine Schilderung war verständlich. Bereits im Voraus vielen Dank.

Gruß
Tassimmo
 
Nun gut, wir scheinen eine passende Lösung gefunden zu haben:
Ein Kollege hat mir geholfen, das Projekt in ein Maven-Projekt umzuwandeln. Es ist uns gelungen, in den Run Configurations von Eclipse das Programm so zu starten, dass es sowohl in Eclipse als auch exportiert auf die entsprechende Datenbank zugreifen kann.
Allerdings mussten wir die Zieldatei dazu erst manuell in den Ordner mit der Datenbank kopieren.

War zwar mit Sicherheit nicht die beste Lösung, aber wenigstens eine funktionierende.
 
Derby!=MySQL -> Verwende den entsprechenden Treiber für Derby und nicht [c]Class.forName("com.mysql.jdbc.Driver");[/c]
Darüber hinaus ist der Class#forName-Ansatz, glaub ich zumindest, auch Outdated...
 

Neue Themen


Zurück
Oben