# Wie auf eine MySql Datenbank zugreifen



## ernst (4. Aug 2009)

Hallo allerseits,
1)
um ein bißchen mit Datenbanken zu experimentieren, habe ich zuerst mit Java auf eine MS-ACCESS-Datenbank zugegriffen.
Das Programm unten funktioniert einwandfrei, ohne dass ich dabei Treiber usw. installieren, konfigurieren oder ähnliches machen musste.

2)
Nun will ich den Datenbankzugriff mit Java auf eine MySQL-Datenbank realisieren.
Leider habe ich im Internet nicht gefunden, wie das realisiert wird.

3) Deswegen meine Frage:
Was muss ich unten in meinem Quellcode abändern, damit der Zugriff funktioniert?
Konkret:
Wie müssen welche Zeilen durch was ersetzt werden?

mfg
Ernst


```
package db10;
import java.sql.*;

public class MainDb10 {
	public static void main(String[] args) {
		String datenQuelle;
		Connection demoDB1Connection;
		Statement StatementSQL;
		ResultSet resultSet;
		String AbfrageSQL;
		Boolean b;
		String nr;
		String bezeichnung;
		int bestand;
		double preis;
		
		try{ 
	    	// Lädt die Klasse mit dem Namen "sun.jdbc.odbc.JdbcOdbcDriver"
	    	Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
	    	// Zugriff auf die DB (Deklaration und Wertzuweisung) wird über 
    		// eine Datenquelle gemacht.
	    	// eine Datenquelle ist wie folgt aufgebaut:
	    	// jdbc:Subprotokoll:Datenquellennamen
	    	// Für ODBC-Datenquellen ist das Subprotokoll obcd
	    	datenQuelle = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/Daten_Austausch/MEINE_SKRIPTE/ProgJava/22_Datenbank/PROG/db10/demoDB1.mdb";
	    	// obenstehender Pfad muss jeweils angepasst werden!
        	// getConnection(...) liefert die Verbindung zur Datenbank zurück.
               // Dazu wird benötigt:
	    	// eine Datenquelle, einen User, ein Passwort
	    	demoDB1Connection = DriverManager.getConnection(datenQuelle,"","");
	    	// Um Anfragen an die Datenbank stellen zu können benötigt man ein
	    	// Objekt der Klasse Statement
	    	StatementSQL = demoDB1Connection.createStatement();
              // Liefere von allen Datensätzen mit Nr = 1000 die 
              // Nr, Bezeichnung, Bestand, Preis.
              // Wichtig: Zeichenketten müssen in SQL-Befehlen in einfachen
              // Hochkommata eingeschlossen werden
	    	AbfrageSQL = "SELECT Nr, Bezeichnung, Bestand, Preis FROM Artikel ";
	    	AbfrageSQL = AbfrageSQL + "WHERE Nr = '1000';";
	    	// AbfrageSQL ist also:
	    	// SELECT Nr, Bezeichnung, Bestand, Preis FROM Artikel WHERE Nr = '1000'; 
			System.out.println("AbfrageSQL="+AbfrageSQL);	    	
	    	// Das Ergebnis der Abfrage befindet sich in resultSet.
	    	// Dieses Ergebnis kann man sich als Tabelle vorstellen, in der 
	    	// die gefundenen Datensätze als Zeilen dargestellt werden.
	    	// Direkt nachdem das Ergebnis in resultSet abgeliefert wird, 
	    	// steht der "Zeilenzeiger" _vor_ der ersten gefundenen Zeile.
	    	// (mit next() wird der Zeilenzeiger dann auf die erste gefundene 
	    	// Zeile positioniert). 
	    	resultSet = StatementSQL.executeQuery(AbfrageSQL);
    		// Bei jedem Aufruf von next() wird der Zeilenzeiger um eine Zeile
	    	// nach unten bewegt. Bei ersten Aufruf von next() zeigt der 
	    	// Zeilenzeiger also auf die erste gefundene Zeile.
	    	// Gibt es keine gefundene Zeile, liefert next() den Wert
	    	//false zurück.
		b = resultSet.next();
		if(b==true){
			nr = resultSet.getString("Nr");
			bezeichnung = resultSet.getString("Bezeichnung");
			bestand = resultSet.getInt("Bestand");
			preis = resultSet.getDouble("Preis");				
			System.out.println("nr="+nr);
			System.out.println("bezeichnung="+bezeichnung);
			System.out.println("bestand="+bestand);				
			System.out.println("Preis="+preis);				
		}
		else{
			System.out.println("Datensatz wurde nicht gefunden");
		}
	    	
	    	resultSet.close();
	    	StatementSQL.close();
	    	demoDB1Connection.close();	    
		}
	    catch (ClassNotFoundException fehler){
	    	System.out.println("Treiber existiert nicht");	    	
	    	fehler.printStackTrace();
	    }
	    catch (SQLException fehler){
	    	System.out.println("DB konnte nicht geöffnet werden");	    	
	    	fehler.printStackTrace();
	    }
	}
}
```


----------



## sparrow (4. Aug 2009)

Eigentlich ist das ein Geheimnis, aber jemand hat das in den FAQs einfach ausgeplaudert!

http://www.java-forum.org/java-faq-beitraege/1351-datenbank-verbindung-zu-mysql.html


----------



## ernst (4. Aug 2009)

Danke für die Infos.
I) Zitat deines Links:
"als erstes musst man sich von MySQL :: MySQL Downloads eine aktuelle version des jdbc treibers herunterladen. 
dann das enthaltene jar-file dem classpath hinzufügen."

Zum classpath habe ich mir folgendes irgendwann mal notiert:
classpath:
Wie kann der Klassenpfad gesetzt werden?
a) durch das Setzen einer CLASSPATH Umgebungsvariablen (es wird empfohlen, darauf zu verzichten. Oft wird sie nicht angelegt und existiert deshalb nicht ). 
In der Umgebungsvariable CLASSPATH stehen das (oder die Verzeichnisse), ab denen die packages gesucht werden, die mit import ... angegeben wurden.

b) durch die Angabe des Klassenpfad (d.h. eines Verzeichnisse) nach Angabe des Schaltes -cp in dem Programm (wie z.B. javac).

Frage:
Wie setze ich den classpath in Netbeans?
(Das musste ich noch nie machen)

II)
Warum muss ich beim Zugriff auf eine MS-ACCESS Datenbank _nicht_ einen Treiber runterladen und in den classpath aufnehmen?
Warum ist das bei mysql so kompliziert?

mfg
Ernst


----------



## eRaaaa (4. Aug 2009)

ich benutze zwar kein netbeans, aber sollte ja auch ähnlich wie bei eclipse in den properties gehen --> libraries -> add library oder so (google sollte helfen)
-------

in der insel ist der jdbc treiber und ähnliches sehr gut erklärt, lies dich dort mal ein(das beantwortet auch deine ms-access frage) zudem wir dort auch auf das statement objekt eingegangen, welches nötig ist und leider in dme link von sparrow nicht erwähnt wird weils dort ja lediglich um die verbindungsherstellung geht.

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 23.3 JDBC und Datenbanktreiber


gruß


----------



## ernst (4. Aug 2009)

eRaaaa hat gesagt.:


> ich benutze zwar kein netbeans, aber sollte ja auch ähnlich wie bei eclipse in den properties gehen --> libraries -> add library oder so (google sollte helfen)
> -------
> 
> in der insel ist der jdbc treiber und ähnliches sehr gut erklärt, lies dich dort mal ein(das beantwortet auch deine ms-access frage) zudem wir dort auch auf das statement objekt eingegangen, welches nötig ist und leider in dme link von sparrow nicht erwähnt wird weils dort ja lediglich um die verbindungsherstellung geht.
> ...





Danke für die Infos,
1)
laut der Insel sollte es auch ohne properties gehen.
Zitat:
"Vor Java 6 und bei nicht vorbereiteten Datenbanken ist die Treiberklasse von Hand einzubinden. Zwei Möglichkeiten sind populär:
Die Property jdbc.drivers enthält den Namen des Datenbanktreibers. Auf der Kommandozeile lässt sich die Variable mit dem Schalter -D einfach setzen:
$ java -Djdbc.drivers=org.hsqldb.jdbcDriver <Javaklasse>
Die zweite Möglichkeit bietet die Funktion Class.forName(), die eine Treiberklasse lädt. Sie trägt sich automatisch beim Treiber-Manager ein."

2) Die Datenquelle muss man bei Mysql wie folgt angeben:
jdbc:mysql://host/database

Konkret bei mir:
datenQuelle = "jdbc:mysql://localhost//demoLV1DB";
Nur:
Muss ich den gesamten Pfad 
C:\Daten_Austausch\MEINE_SKRIPTE\ProgJava\22_Datenbank\PROG\db12\demolv1db
angeben, oder nur die Datei demolv1db ??
Woher weiss man, wo sich die oberste Directory auf dem localhost befindet?

mfg
Ernst


----------



## sparrow (4. Aug 2009)

ernst hat gesagt.:


> Frage:
> Wie setze ich den classpath in Netbeans?
> (Das musste ich noch nie machen)



File
Project Properties
Libraries
Add Jar/Folder




ernst hat gesagt.:


> II)
> Warum muss ich beim Zugriff auf eine MS-ACCESS Datenbank _nicht_ einen Treiber runterladen und in den classpath aufnehmen?
> Warum ist das bei mysql so kompliziert?



Bisher hast du die JDBC/ODBC-Bridge verwendet. Die sollte heute nach Möglichkeit nicht mehr verwendet werden und sollte nur die Zeit überbrücken als noch keine JDBC-Treiber zur Verfügung standen.
Der JDBC-Treiber wird direkt von den Entwicklern gepflegt. Kompliziert ist das nicht. Als Entwickler wirst du immer wieder in die Situation kommen externe Bibliotheken zu nutzen.


----------



## ernst (4. Aug 2009)

sparrow hat gesagt.:


> File
> Project Properties
> Libraries
> Add Jar/Folder
> ...



Danke für die Infos,
1) Heißt das, dass ich auf eine MS-ACCESS Datenbank _ohne_ die JDBC/ODBC-Bridge zugreifen kann?
2) Davon steht aber in:
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 23.5 Mit Java an eine Datenbank andocken
nichts. Oder habe ich da etwas überlesen?

mfg
Ernst


----------



## sparrow (4. Aug 2009)

ernst hat gesagt.:


> Danke für die Infos,
> 1) Heißt das, dass ich auf eine MS-ACCESS Datenbank _ohne_ die JDBC/ODBC-Bridge zugreifen kann?


Nein.



ernst hat gesagt.:


> 2) Davon steht aber in:
> Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 23.5 Mit Java an eine Datenbank andocken
> nichts. Oder habe ich da etwas überlesen?


Wovon?


----------



## L-ectron-X (4. Aug 2009)

Das geht, steht im folgenden Link beschrieben.

Hier gibt es hier noch weitere Praxisbeispiele: Datenbankverbindung (Java) - Byte-Welt Wiki


----------



## ernst (4. Aug 2009)

L-ectron-X hat gesagt.:


> Das geht, steht im folgenden Link beschrieben.
> 
> Hier gibt es hier noch weitere Praxisbeispiele: Datenbankverbindung (Java) - Byte-Welt Wiki



Danke für die Infos,
1) Der Link liefert die Info:
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://Hostort/Datenbank","Benutzer","Passwort")

Dann habe ich aber das oben beschriebene Problem:
2) Die Datenquelle muss man bei Mysql wie folgt angeben:
jdbc:mysql://host/database

Konkret bei mir:
datenQuelle = "jdbc:mysql://localhost//demoLV1DB";
Nur:
Muss ich den gesamten Pfad 
C:\Daten_Austausch\MEINE_SKRIPTE\ProgJava\22_Daten bank\PROG\db12\demolv1db
angeben, oder nur die Datei demolv1db ??
Woher weiss man, wo sich die oberste Directory auf dem localhost befindet?

mfg
Ernst


----------



## ernst (4. Aug 2009)

1) Heißt das, dass ich auf eine MS-ACCESS Datenbank _ohne_ die JDBC/ODBC-Bridge zugreifen kann?
Nein.
--------
Aber du schreibst doch, dass man diese JDBC/ODBC-Bridge heute nach Möglichkeit nicht mehr verwenden soll.
Wie soll ich also auf eine MS-ACCESS Datenbank zugreifen, wenn ich diese JDBC/ODBC-Bridge nicht verwende?

mfg
Ernst


----------



## sparrow (4. Aug 2009)

Da musst du dich mit mySQL beschäftigen. Da verbindest du dich nicht auf ein "Verzeichnis" sondern auf einen Netzwerksocket
Das ganze schreibt man dann in eine URL. Daher gibt es kein "oberstes Directory".

Angenommen du hast einen Server der heißt dabaserver und darauf eine Datenbank mit dem Namen "meineDatenbank". Du hast dafür gesorgt, dass es den Benutzer "nutzer" mit dem Passwort "meinPass" gibt:

Connection con = DriverManager.getConnection("jdbc:mysql://dabaserver/meineDatenbank","nutzer","meinPass")

Die mySQL-Datenbank ist also keine einfache Datei sondern ein Dienst der läuft.


----------



## eRaaaa (4. Aug 2009)

sparrow hat gesagt.:


> Die mySQL-Datenbank ist also keine einfache Datei sondern ein Dienst der läuft.



daher sollte eig. ein einfaches localhost in den meisten fällen doch ausreichen ?! (in seinem fall wahrscheinlich auch oder?)


----------



## ernst (4. Aug 2009)

sparrow hat gesagt.:


> Da musst du dich mit mySQL beschäftigen. Da verbindest du dich nicht auf ein "Verzeichnis" sondern auf einen Netzwerksocket
> Das ganze schreibt man dann in eine URL. Daher gibt es kein "oberstes Directory".
> 
> Angenommen du hast einen Server der heißt dabaserver und darauf eine Datenbank mit dem Namen "meineDatenbank". Du hast dafür gesorgt, dass es den Benutzer "nutzer" mit dem Passwort "meinPass" gibt:
> ...



Ich benutzte den xampp.
D.h. ich rufe das xampp Control Panel auf.
Dort starte ich den appache und mysql.
Wie bekomme ich den Namen des Servers raus (also die konkrete Bezeichnung statt dabaserver) ?

mfg
Ernst


----------



## sparrow (4. Aug 2009)

ernst hat gesagt.:


> Wie bekomme ich den Namen des Servers raus (also die konkrete Bezeichnung statt dabaserver) ?



Das ist der Hostname des Rechners.
Sind Client und Server identisch? Dann localhost bzw. 127.0.0.1


----------



## ernst (4. Aug 2009)

sparrow hat gesagt.:


> Das ist der Hostname des Rechners.
> Sind Client und Server identisch? Dann localhost bzw. 127.0.0.1



Client und Server sind identisch.
Deswegen habe ich wie folgt programmiert:
datenQuelle = "jdbc:mysql://localhost/demoLV1DB";
Aber wo (unter welchem Directory auf meiner Festplatte) sucht dann der Server diese Datenbank demoLV1DB (dies ist übrigens auch ein Ordner)?
Bei mir auf der Festplatte ist nämlich diese Datenbank demoLV1DB wie folgt abgespeichert:
C:\Daten_Austausch\MEINE_SKRIPTE\ProgJava\22_Daten bank\PROG\db12\demolv1db

mfg
Ernst


----------



## sparrow (4. Aug 2009)

Keine Ahnung, da kümmert sich mySQL drum.
Dein Programm sucht diese Datenbank gar nicht.
Wofür brauchst du denn das Verzeichnis?


----------



## ernst (4. Aug 2009)

sparrow hat gesagt.:


> Keine Ahnung, da kümmert sich mySQL drum.
> Dein Programm sucht diese Datenbank gar nicht.
> Wofür brauchst du denn das Verzeichnis?



Der Server braucht doch die Datenbank, also den Ordner demoLV1DB.
Und den muß er ja konkret auf meiner Festplatte suchen (weil Client = Host).
Und ich habe eben diese Datenbank demoLV1DB Client und Server sind identisch.
C:\Daten_Austausch\MEINE_SKRIPTE\ProgJava\22_Daten bank\PROG\db12\demolv1db
gespeichert.

mfg
Ernst


----------



## sparrow (4. Aug 2009)

Ich steh gerade irgendwie auf dem Schlauch und arbeite selber gar nicht mit mySQL.

Dem Entwickler ist es in der Regel egal wo sich die Datenbank im Dateisystem befindet. Das interessiert nur den Datenbankadministrator damit unter Umständen das Verzeichnis für das Backup.

Eine Datenbank legst du in mySQL mit dem Befehl CREATE DATABSE databasename an. Hast du das schon gemacht?


----------



## ernst (4. Aug 2009)

sparrow hat gesagt.:


> Ich steh gerade irgendwie auf dem Schlauch und arbeite selber gar nicht mit mySQL.
> 
> Dem Entwickler ist es in der Regel egal wo sich die Datenbank im Dateisystem befindet. Das interessiert nur den Datenbankadministrator damit unter Umständen das Verzeichnis für das Backup.
> 
> Eine Datenbank legst du in mySQL mit dem Befehl CREATE DATABSE databasename an. Hast du das schon gemacht?



Ich habe mit phpmyadmin diese Datenbank erzeugt.

mfg
Ernst


----------



## sparrow (4. Aug 2009)

Dann ist doch alles gut, oder?

Oder gibt es Fehlermeldungen?


----------



## ernst (4. Aug 2009)

sparrow hat gesagt.:


> Dann ist doch alles gut, oder?
> 
> Oder gibt es Fehlermeldungen?



Jetzt nicht mehr, _dank_ eurer Hilfe.
Eine Frage noch (das habe ich noch nicht verstanden):
Warum muss ich für den Zugriff auf die MS-ACCESS Datenbank _keinen_ Treiber runterladen und diesen _nicht_ in den Classpath mitaufnehmen, im Gegensatz beim Zugriff auf eine MySql-Datenbank?
Das habe ich auch nicht in "Java ist eine Insel" verstanden.

mfg
Ernst


----------



## Michael... (5. Aug 2009)

ernst hat gesagt.:


> Warum muss ich für den Zugriff auf die MS-ACCESS Datenbank _keinen_ Treiber runterladen und diesen _nicht_ in den Classpath mitaufnehmen, im Gegensatz beim Zugriff auf eine MySql-Datenbank?


Weil Du im Falle von Access die ODBC Schnittstelle des Betriebssystems verwendest und der Java SDK standardmäßig einen ODBC Treiber enthält. Allerdings muss dann das Betriebssystem einen entsprechenden Datenbanktreiber für Access besitzen.
Wenn Du die mySql Datenbank ebenfalls über ODBC einbinden würdest (weiss gar nicht ob's da was gibt) müsstest Du auch hier keinen extra Treiber runterladen.


----------



## sparrow (5. Aug 2009)

Michael... hat gesagt.:


> Wenn Du die mySql Datenbank ebenfalls über ODBC einbinden würdest (weiss gar nicht ob's da was gibt) müsstest Du auch hier keinen extra Treiber runterladen.


Wärst dafür aber in Abhängigkeit zur ODBC-Schnittstelle und zum Betriebssystem.


----------



## maki (5. Aug 2009)

Ganz abgesehen davon, dass die JDBC-ODBC Bridge nicht produktiv verwendet werden sollte.


----------



## ernst (5. Aug 2009)

Dank an alle für eure Beiträge.
Das Thema ist erst mal - für mich - beendet.
Ich fahre jetzt erst mal ein paar Tage in Urlaub.

mfg
Ernst


----------

