# Zugriff auf MySQL-Datenbank



## jf (20. Mai 2011)

Guten Morgen!

Ich möchte Werte in eine Datenbank schreiben. Ich hatte hierfür einen php-Klasse geschrieben, welche Datenbanken und Tabellen anlegt und diese mit den Werten füllt. Da das Skript aber regelmäßig ausgeführt werden muss und ich keinen Cron-Job dafür verwenden will, bin ich dazu übergegangen, eine Java-Anwendung für diesen Zweck einzusetzen. Allerdings habe ich Probleme meine php-Klasse auf Java umzumünzen.

Ich habe momentan eine Klasse wie folgt implementiert:


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

public class SQL {
    private static Connection m_conn = null;
 

    public SQL(String host, String port, String db, String user, String pwd) {
        try {
            // Datenbanktreiber für ODBC Schnittstellen laden.
            // Für verschiedene ODBC-Datenbanken muss dieser Treiber
            // nur einmal geladen werden.
            Class.forName("com.mysql.jdbc.Driver");
 
            // Verbindung zur ODBC-Datenbank 'sakila' herstellen.
            // Es wird die JDBC-ODBC-Brücke verwendet.
            m_conn = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + 
                                                  db + "?" + "user=" + user + "&" + "password=" + pwd);
        } catch(ClassNotFoundException e) {
            System.out.println("Treiber nicht gefunden");
        } catch(SQLException e) {
            System.out.println("Connect nicht moeglich");
        }
    }
    

    /**
     * Prüft, ob eine Datenbank existiert
     */
    public void existsDatabase(String database) {
        if(m_conn != null) {
            try {
                // Anfrage-Statement erzeugen.
            	Statement query = m_conn.createStatement();
 
                // Ergebnistabelle erzeugen und abholen.
                String sql = "SHOW DATABASES";
                ResultSet result = query.executeQuery(sql);
 
                // ???

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * Erstellt eine neue Datenbank
     */
    public void createDatabase(String database) {
        if(m_conn != null) {
            try {
                // Anfrage-Statement erzeugen.
            	Statement query = m_conn.createStatement();
 
                // Ergebnistabelle erzeugen und abholen.
                String sql = "CREATE DATABASE IF NOT EXISTS " + database;
                ResultSet result = query.executeQuery(sql);     // wirft eine SQLException
                
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
```

Meine konkreten Fragen wären folgende:

* Verwende ich den richtigen Treiber? (ich verwende eine MySQL-Datenbank) - Denn im Javabuch wird der Treiber mit _sun.jdbc.odbc.JdbcOdbcDriver_ initilisiert. Ist die Synthax der SQL-Kommandos abhängig vom Treiber, oder nur von der Datenbank?

* Lässt sich eine Connection auch ohne Angabe eines Datenbanknames erzeugen? Bei php ging dies, hier bei Java erhielt ich leider einen Fehler.


----------



## r.w. (20. Mai 2011)

Hallo jf,

zu Frage 1 schon mal: 
Den mySQL-Treiber findest Du hier: MySQL :: Download Connector/J 

zu Frage 2:
Man kann statt des Datenbanknamens einen Leerstring übergeben. Die Verbindung sollte trotzdem klappen.
Sonst könnte man aus der Applikation heraus ja keine Datenbank anlegen.

Ich hoffe, das hilft Dir weiter.

VG ROlf


----------



## jf (20. Mai 2011)

Hallo Rolf,



r.w. hat gesagt.:


> zu Frage 1 schon mal:
> Den mySQL-Treiber findest Du hier: MySQL :: Download Connector/J


Ja, ich habe die Library schon dem ClassPath hinzugefügt (v5.0.5, weil diese noch alte MySQL-Versionen unterstützt und mit alten Java-Versionen läuft). Allerdings weiß ich gar nicht, ob diese wirklich benötigt wird, da ich nichts aus dieser Bibliothek importiert habe. - Kann es sein, dass der DriverManager auf diese Lib zurückgreift?



> zu Frage 2:
> Man kann statt des Datenbanknamens einen Leerstring übergeben. Die Verbindung sollte trotzdem klappen.
> Sonst könnte man aus der Applikation heraus ja keine Datenbank anlegen.


Ja, deshalb hat es mich ja so gewundert - bei php ging es ja auch.
Ich habe es nun noch einmal probiert und es kam keine Fehlermeldung - evtl. hatte ich bei meinem letzten Versuch diesbezüglich einen Fehler gemacht.



> Ich hoffe, das hilft Dir weiter.


Leider nur minimal, ich scheitere immer noch am Anlegen einer neuen Datenbank:

```
String sql = "CREATE DATABASE IF NOT EXISTS " + database;
                ResultSet result = query.executeQuery(sql);
```

Gruß, Peter


----------



## maki (20. Mai 2011)

Solltest dir das Query Interface genauer ansehen, executeQuery ist nur eine Methode, execute und executeUpdate sind weitere um SQL an die DB zu schicken.


----------



## jf (20. Mai 2011)

maki hat gesagt.:


> Solltest dir das Query Interface genauer ansehen, executeQuery ist nur eine Methode, execute und executeUpdate sind weitere um SQL an die DB zu schicken.


Danke für den Hinweis. Leider bin ich irgendwie immer noch auf dem Holzweg. ;(

In der Doku zum Interface Query finde ich die erwähnten Methoden leider nicht:
Query (Java EE 6 )

Kann es sein, dass ich da das falsche Interface erwischt habe? - Ich habe allerdings unter java.sql kein anderes finden können:
java.sql (Java 2 Platform SE v1.4.2)

???:L


----------



## maki (20. Mai 2011)

Nun gut, wenn du den Unterschied zwischen der JPA Query und der JDBC Query nicht klar ist, würde ich dir erstmal ein JDBC Tutorial empfehlen.

Trail: JDBC(TM) Database Access (The Java™ Tutorials)

Nachtrag: Hab idich auf die flache Fährte gesetzt, mein Fehler, habe Query mit Statement verwechselt 
das Tutorial ist trotzdem gut für dich


----------

