Freitag, 25. Mai 2012


Artikel

Juli 2010 | Artikel

MySQL und Java: Datenabfrage

(Link zum Artikel: http://www.entwickler-magazin.de/jaxenter//003236)

Teil 3 der MySQL-Serie

Text: Christian Barthel
  • Teilen
  • kommentieren
  • empfehlen
  • Bookmark and Share
Lernen Sie in dieser Serie Schritt für Schritt den Zugriff auf eine MySQL-Datenbank mit Java. Neben dem Erstellen der Syntax der SQL-Abfrage geht es auch um das Einbinden eines JDBC-Treibers und das Schreiben geeigneter Abfrageklassen.
Teil 1   Teil 2   Teil 3   

Einfache Datenabfrage

Da wir nun unsere Verbindung aufgebaut haben, können wir uns nun erste Datensätze aus der MySQL-Tabelle holen. Die gesamte Methode befindet sich hier unterhalb, die Erklärung folgt nach dem Listing.

  1. public Vector loadCustomers(String table)
  2. { Statement stmt = null;
  3. ResultSet result = null;
  4. try {
  5. stmt = connection.createStatement();
  6. result = stmt.executeQuery("SELECT * FROM " + table);
  7. result.first(); // <- first entry of the result set
  8. // STEP 2: copy the data from the result set into the vector
  9. Vector customers = new Vector();
  10. while(! result.isAfterLast()) // as long as valid data is in the result set
  11. {
  12. int id = result.getInt("kid");
  13. String name = result.getString("name");
  14. String vorname = result.getString("vname");
  15. Kunde kunde = new Kunde(id, name, vorname);
  16. customers.add(kunde);
  17. result.next(); // go to next line in the customer table
  18. }
  19. // STEP 3: return the vector containing the customer data
  20. return customers;
  21. } catch (Exception ex) {
  22. System.out.println("Error during access + " + table + "\n" + ex.getMessage());
  23. return null;
  24. }
  25. }

Das Prinzip dieser Abfragemethode kann in sechs einfachen Schritten erklärt werden:

  • Die Methode loadCustomers wird mit dem Parameter "Tabellenname" (Tabelle, die unsere Kunden enthält) aufgerufen.
  • Wir bauen die Verbindung auf und stellen unser SQL-Statement (ganz am Anfang wurde kurz darüber gesprochen, wie dieses aussehen muss, damit wir einfache Abfragen erstellen können)
  • Diese Abfrage wird ausgeführt und die Datensätze werden in einem "Resultset" gespeichert.
  • Um nun einen Zugriff auf die tatsächlichen Datensätze aus dem Resultset zu bekommen, müssen wir in eine WHILE-Schleife den kompletten Datenbestand aus dem Resultset-Objekt "herausziehen"; in diesem Fall speichern wir diese "herausgezogenden" Datensätze“ in einem Vektor ab
  • Ein Vector dient dazu – wie Arrays oder ArrayLists – Daten abzuspeichern
  • Den gesamten Vektor mit den Datensätzen geben wir als Rückgabewert der Methode zurück.

Gehen wir noch kurz den Code im Detail durch. Bevor wir den TRY/CATCH-Block initialisieren, legen wir zunächst unsere benötigten Variablen ab. Wir benötigen ein Statement (Variablenname stmt), auf dessen wir unsern SQL-Query ausführen können. Zusätzlich wollen wir die vom Datenbankserver gelieferten Daten auch abspeichern, dies geschieht innerhalb des ResultSet-Objekts.

  1. Statement stmt = null;
  2. ResultSet result = null;

Im nächsten Schritt benötigen wir einen TRY/CATCH-Block, um eventuell auftretende Ausnahmen abfangen zu können (falscher SQL-Query, Verbindungsabbruch, nicht vorhandene Datenfelder, …). Von der Instanzvariablen "connection" lassen wir uns zunächst ein Statement geben. Die "connection"-Variable besitzt die Verbindungsdaten und baut mit diesen eine Verbindung auf.

  1. try {
  2. stmt = connection.createStatement();

Als Rückgabewert erhalten wir ein Statement-Objekt, auf dem wir unseren SQL-Query ausführen können. Der Methode executeQuery wid ein SQL-String übergeben, mit der wir entweder Daten abfragen, einfügen oder modifizieren können. In diesem Fall übergeben wir die statischen Schlüsselwörter "SELECT * FROM", gefolgt von der Variable "table", die den Tabellennamen der zu abfragenden Tabelle enthält. Eine deutsche Übersetzung dieses Befehls könnte in etwa so lauten: Gib mir alle Spalten aus der Tabelle "table" ohne Einschränkung (keine WHERE-Dinge…). Der Tabellenname wird beim Methodenaufruf als Parameter initialisiert.

  1. stmt = connection.createStatement();
  2. result = stmt.executeQuery("SELECT * FROM " + table);

Das Rückgabeobjekt von "executeQuery" ist ein ResultSet und beinhaltet alle zurückgelieferten Datensätze der Abfrage. Um es später benutzen zu können, speichern wir dieses ResultSet in der Variable "result" ab.

Nun können wir mit dem Erstellen der Kundenobjekte beginnen. Zunächst wird der aktuelle Zeiger auf den ersten Datensatz gesetzt.

  1. result.first(); // <- first entry of the result set
  2. Vector customers = new Vector();

Danach können wir mit einer While-Schleife das ResultSet durchlaufen. Die Schleifenbedingung "isAfterLast" läuft solange, bis der letzte Datensatz ausgeführt wurde.

Teil 1   Teil 2   Teil 3   

andere Artikel dieser Serie

Kommentare

Gravatar Michael Vitz 21.07.2010
um 11:50 Uhr
An für sich finde ich die Artikel Serie gut, aber ist es beabsichtigt, dass die verwendeten Klassen teilweise alt sind?
[z.B. Vector (und dann noch ohne Generics) anstelle von List oder, while(! result.isAfterLast()) anstelle von while(result.next()) oder auch der verwendete Klassenname des JDBC Drivers (das war im letzen Artikel)]
#zitieren
Gravatar as 21.07.2010
um 13:05 Uhr
Dank Garbage Collection braucht man sich in Java fast nie ums Aufräumen kümmern - bei JDBC (insbesondere ResultSets) ist das anders. Viele Objekte müssen explizit und auch im Fehlerfall freigegeben werden (close()), um die dahinterliegenden Ressourcen (Cursor, etc.) freizugeben. Leider hat es bislang keines der mir bekannte Tutorials geschafft, das nötige Exception Handling zu zeigen - so auch dieses. Schade ums "Papier"! #zitieren