Java-SQL: Unterschied zwischen den Versionen

Aus SibiWiki
Zur Navigation springen Zur Suche springen
Zeile 21: Zeile 21:
Die '''Datenbank-Abfrage''', die das ermöglicht, ist die folgende - hier aufgezeigt für den Schauspieler "Depp":
Die '''Datenbank-Abfrage''', die das ermöglicht, ist die folgende - hier aufgezeigt für den Schauspieler "Depp":


<code>
SELECT h.name AS hauptdarstellername, f.name AS filmname, f.oscars AS oscars
FROM film f, film_has_hauptdarsteller fh, hauptdarsteller h
WHERE f.id = fh.film_id
AND h.id = fh.hauptdarsteller_id
AND h.name LIKE '%<font color='red'>Depp</font>%'
LIMIT 10
</code>
==Strategie==
''Die möglichen Fehlerbehandlungen werden in der Strategie nicht berücksichtigt.''
# Es gibt ein Attribut <code>connector</code> vom Typ <code>DatabaseConnector</code>
# Im Konstruktor wird der <code>connector</code> erzeugt.
# In der Methode <code>zehnFilmeMit(String pDarsteller)</code> geht man so vor:
## SQL-Statement "zusammenbauen": <br/><code>String sqlStatement = " SELECT ..."</code>
## SQL-Statement ausführen: <br/><code>connector.executeStatement(sqlStatement);</code>
## Das Ergebnis der SQL-Abfrage ermitteln: <br/><code>QueryResult queryResult = connector.getCurrentQueryResult()</code>
## Die Daten des Ergebnisses ermitteln: <br/><code>String[][] data = queryResult.getData();</code><br/>Man erhält ein 2-dimensionales Array. <br/>Dabei ist die erste Dimension für die Zeilen, die zweite Dimension für die Spalten.
## Die Zeilen werden mit einer <code>for</code>-Schleife durchlaufen: <br/><code>for (int i = 0; i < data.length; i++)</code>
## Jetzt liest man die einzelnen Werte nach Spaltennummer aus, z.B. für die Oscars<br/><code>String oscarsString = data[i][2];</code>
## Man erhält grundsätzlich Objekte vom Typ <code>String</code>. <br/>Evtl. muss man sie noch in einen richtigen Datentyp konvertieren, z.B. mit<br/><code>int oscars = Integer.parseInt(oscarsString);</code>


==Java-Code==
==Java-Code==

Version vom 14. Januar 2018, 15:17 Uhr


Auf dieser Seite wird erklärt, wie man aus Java heraus SQL-Abfragen auf einer Datenbank ausführen kann.

Einschränkung der Allgemeingültigkeit dieser Seite:
Hier werden die Klassen DatabaseConnector.java und QueryResult.java verwendet, deren Schnittstelle vom Zentralabitur NRW vorgegeben ist

Schnittstelle des Zentralabitur

Datei:DatabaseConnector QueryResult Abi 2018.pdf

Beispiel

Vorüberlegungen

Das folgende Beispiel bezieht sich auf die Video-Datenbank, die auch im Unterricht häufig zum Einsatz kommt.
Das Datenbank-Modell kann man unten auf dieser Seite anschauen.

Es soll jetzt eine Java-Methode entwickelt werden, die 10 Filme zu einem Schauspieler zurückgibt. Den Schauspieler soll man als Parameter angeben können.

Die Datenbank-Abfrage, die das ermöglicht, ist die folgende - hier aufgezeigt für den Schauspieler "Depp":

SELECT h.name AS hauptdarstellername, f.name AS filmname, f.oscars AS oscars
FROM film f, film_has_hauptdarsteller fh, hauptdarsteller h
WHERE f.id = fh.film_id
AND h.id = fh.hauptdarsteller_id
AND h.name LIKE '%Depp%'
LIMIT 10

Strategie

Die möglichen Fehlerbehandlungen werden in der Strategie nicht berücksichtigt.

  1. Es gibt ein Attribut connector vom Typ DatabaseConnector
  2. Im Konstruktor wird der connector erzeugt.
  3. In der Methode zehnFilmeMit(String pDarsteller) geht man so vor:
    1. SQL-Statement "zusammenbauen":
      String sqlStatement = " SELECT ..."
    2. SQL-Statement ausführen:
      connector.executeStatement(sqlStatement);
    3. Das Ergebnis der SQL-Abfrage ermitteln:
      QueryResult queryResult = connector.getCurrentQueryResult()
    4. Die Daten des Ergebnisses ermitteln:
      String[][] data = queryResult.getData();
      Man erhält ein 2-dimensionales Array.
      Dabei ist die erste Dimension für die Zeilen, die zweite Dimension für die Spalten.
    5. Die Zeilen werden mit einer for-Schleife durchlaufen:
      for (int i = 0; i < data.length; i++)
    6. Jetzt liest man die einzelnen Werte nach Spaltennummer aus, z.B. für die Oscars
      String oscarsString = data[i][2];
    7. Man erhält grundsätzlich Objekte vom Typ String.
      Evtl. muss man sie noch in einen richtigen Datentyp konvertieren, z.B. mit
      int oscars = Integer.parseInt(oscarsString);

Java-Code

 public class DatenbankTest {
   private DatabaseConnector connector;
   
   public DatenbankTest() {
       // Die Verbindung zur Datenbank aufbauen
       //                                    ip       port database  user     password
       connector = new DatabaseConnector("localhost", 3306, "demo", "admin", "geheim");
       String errorMessage = connector.getErrorMessage();
       if(errorMessage != null) System.err.println(errorMessage);
   }

   public List<String> zehnFilmeMit(String pDarsteller){
       List<String> ergebnis = new List<String>();

       //Das SQL-Statement zusammenbauen       
       // Der Paramenter pDarsteller wird eingebaut - man muss auf die Leerzeichen achten!!       
       String sqlStatement =
         " SELECT h.name AS hauptdarstellername, f.name AS filmname, f.oscars AS oscars "+
         " FROM film f, film_has_hauptdarsteller fh, hauptdarsteller h "+
         " WHERE f.id = fh.film_id "+
         " AND h.id = fh.hauptdarsteller_id "+
         " AND h.name LIKE '%" + pDarsteller + "%' "+
         " LIMIT 10 ";
       // Zur Kontrolle das SQL-Statement ausgeben       
       System.out.println(sqlStatement);

       // Das SQL-Statement ausführen       
       connector.executeStatement(sqlStatement);

       // Abbruchbedingung für einen Error       
       String errorMessage = connector.getErrorMessage();
       if(errorMessage != null)
       {
            // Die Fehlernachricht ausgeben       
           System.err.println(errorMessage);
           return null;
       }

       // Das Ergebnis der Datenbankabfrae ermitteln:             
       // Man erhält ein Objekt vom Typ QueryResult             
       QueryResult queryResult = connector.getCurrentQueryResult();

       // Die Daten aus QueryResult auslesen             
       // Die Daten werden als 2-dim. Array wiedergegeben:             
       //   1. Dimension: Zeile des Ergebnisses             
       //   2. Dimension: Spalte des Ergebnisses (in der Reihenfolge wie im SQL-Statement        
       String[][] data = queryResult.getData();

       // Die Zeilen durchlaufen              
       for (int i = 0; i < data.length; i++) {
            // Die einzelnen Spalten einer Zeile abfragen              
           String hauptdarsteller = data[i][0];
           String filmName = data[i][1];
            // Daten sind grundsätzlich vom Typ String!          
           String oscarsString = data[i][2];
           //  in int konvertieren          
           int oscars = Integer.parseInt(oscarsString);

           // alles in einen String zusammenfuegen...         
           String zeile = hauptdarsteller+": "+filmName+" ("+oscars+" Oscars)";
           System.out.println(zeile);

           // ... und an die Liste ergebnis anhaengen         
           ergebnis.append(zeile);
       }
       return ergebnis;
   }
  
   public static void main(String[] args) {
       new GUI(new DatenbankTest());
   }
}

Datenbankmodell

Datenbank-Modell-Videodatenbank.png.