Java-SQL: Unterschied zwischen den Versionen

Aus SibiWiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „Kategorie:Datenbanken Kategorie:Informatik-Abitur Kategorie:Informatik Auf dieser Seite wird erklärt, wie man aus Java heraus SQL-Abfragen auf ei…“)
 
 
(18 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 5: Zeile 5:
Auf dieser Seite wird erklärt, wie man aus Java heraus SQL-Abfragen auf einer Datenbank ausführen kann.
Auf dieser Seite wird erklärt, wie man aus Java heraus SQL-Abfragen auf einer Datenbank ausführen kann.


<font color='red'><b>Einschränkung der Allgemeingültigkeit dieser Seite:<br/>Hier werden die Klassen DatabaseConnector.java und QueryResult.java verwendet, deren Schnittstelle vom Zentralabitur NRW vorgegeben ist</b></font>
<b>Einschränkung der Allgemeingültigkeit dieser Seite:</b><br/>
Hier werden die Klassen <code>DatabaseConnector.java</code> und <code>QueryResult.java</code> verwendet, deren Schnittstelle vom Zentralabitur NRW vorgegeben ist
 
=Erklärvideo=
 
[https://youtu.be/2wwpp27AM3s Mit Java auf Datenbanken zugreifen (gemäß Schnittstelle NRW-Zentralabitur)]
 
=Fachbegriffe=
SQL-Abfrage, Parameter, QueryResult, 2-dimensionales Array, Zeile und Spalte(im 2-dim. Array)


=Schnittstelle des Zentralabitur=
=Schnittstelle des Zentralabitur=
[Datei:DatabaseConnector_QueryResult_Abi_2018.pdf]
 
[[Datei:DatabaseConnector_QueryResult_Abi_2018.pdf]]


=Beispiel=
=Beispiel=


<code>
==Vorüberlegungen==
Das folgende Beispiel bezieht sich auf die Datenbank Schule, die auch im Unterricht häufig zum Einsatz kommt. <br/>
Das Datenbank-Modell und alle Daten der Datenbank finden sich hier:
 
'''[[Datenbank#Beispieldatenbank_Schule|Beispieldatenbank Schule]]'''
 
 
Es soll jetzt eine Java-Methode entwickelt werden, die alle Schüler einer Klasse als eine Liste vom Inhaltstyp <code>Person</code> zurückgibt.<br/>Die Klasse soll man als Parameter <code>pKlasse</code> übergeben können.
 
D.h. die Methodenkopf soll wie folgt aussehen:
<code>
  public List<Person> schuelerDerKlasse(String pKlasse)
</code>
 
''(Die Klasse Person hat einen Konstruktor <code>public Person(String pName, String pVorname)</code> - mehr muss man über die Klasse Person hier nicht wissen.)''
 
==Datenbank-Abfrage==
Die '''Datenbank-Abfrage''', die das ermöglicht, ist die folgende - hier aufgezeigt am Beispiel der 8B:
<code>
  SELECT s.name, s.vorname
  FROM schueler s JOIN klasse k
  ON s.klasse_id = k.id
  WHERE k.name = '<font color='red'>8B</font>'
</code>
 
Diese Datenbank-Abfrage sollte man vorab entwickelt und getestet haben.
 
''Es ist besser, wenn man für die SQL-Abfrage <u>einfach Anführungszeichen</u> nimmt!''<br/>
''Die doppelten Anführungszeichen braucht man für Java!''
 
==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>schuelerDerKlasse(String pKlasse)</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 den Namen<br/><code>String name = data[i][0];</code>
## ''Man erhält grundsätzlich Objekte vom Typ <code>String</code>. <br/>Evtl. muss man sie noch in einen richtigen Datentyp konvertieren.''
 
==Java-Code==
<code>
   '''public class DatenbankTest {'''
   '''public class DatenbankTest {'''
     '''private DatabaseConnector connector;'''
     '''private DatabaseConnector connector;'''
Zeile 24: Zeile 77:
     }
     }
   
   
     '''public List<String> zehnFilmeMit(String pDarsteller){'''
     '''public List<Person> schuelerDerKlasse(String <font color='red'>pKlasse</font>){'''
         List<String> ergebnis = new List<String>();
         List<Person> ergebnis = new List<Person>();
   
   
         <font color='blue'><b>//Das SQL-Statement zusammenbauen</b></font>       
         <font color='blue'><b>//Das SQL-Statement zusammenbauen</b></font>       
         <font color='blue'><b>// Der Paramenter pDarsteller wird eingebaut - man muss auf die Leerzeichen achten!!</b></font>       
         <font color='blue'><b>// Der Paramenter <font color='red'>pKlasse</font> wird "eingebaut". - man muss auf die Leerzeichen achten!!</b></font>       
        <font color='blue'><b>// Dabei muss man muss auf die <u>Leerzeichen</u> achten...</b></font>     
        <font color='blue'><b>// ... und die </font><font color='orange'><u>einfachen Anführungszeichen für SQL</u></font><font color='blue'> mitschreiben! </b></font>     
         String sqlStatement =
         String sqlStatement =
           " SELECT h.name AS hauptdarstellername, f.name AS filmname, f.oscars AS oscars "+
           " <font color='grey'>SELECT s.name, s.vorname</font> "+
           " FROM film f, film_has_hauptdarsteller fh, hauptdarsteller h "+
           " <font color='grey'>FROM schueler s JOIN klasse k</font> "+
           " WHERE f.id = fh.film_id "+
           " <font color='grey'>ON s.klasse_id = k.id</font> "+
           " AND h.id = fh.hauptdarsteller_id "+
           " <font color='grey'>WHERE k.name = </font><font color='orange'><b>'</b></font>" +<font color='red'><b> pKlasse </b></font>+ "<font color='orange'><b>'</b></font> ";
          " AND h.name LIKE '%" <b>+ pDarsteller + </b>"%' "+
 
          " LIMIT 10 ";
         <font color='blue'><b>// Zur Kontrolle das SQL-Statement ausgeben</b></font>       
         <font color='blue'><b>// Zur Kontrolle das SQL-Statement ausgeben</b></font>       
         System.out.println(sqlStatement);
         System.out.println(sqlStatement);
Zeile 51: Zeile 106:
         }
         }
   
   
         <font color='blue'><b>// Das Ergebnis der Datenbankabfrae ermitteln:</b></font>             
         <font color='blue'><b>// Das Ergebnis der Datenbankabfrage ermitteln:</b></font>             
         <font color='blue'><b>// Man erhält ein Objekt vom Typ QueryResult</b></font>             
         <font color='blue'><b>// Man erhält ein Objekt vom Typ QueryResult</b></font>             
         QueryResult queryResult = connector.getCurrentQueryResult();
         QueryResult queryResult = connector.getCurrentQueryResult();
Zeile 64: Zeile 119:
         for (int i = 0; i < data.length; i++) {
         for (int i = 0; i < data.length; i++) {
             <font color='blue'><b>// Die einzelnen <u>Spalten</u> einer Zeile abfragen </b></font>             
             <font color='blue'><b>// Die einzelnen <u>Spalten</u> einer Zeile abfragen </b></font>             
             String hauptdarsteller = data[i][0];
             String name = data[i][0];
             String filmName = data[i][1];
             String vorname = data[i][1];
            <font color='blue'><b>// Daten sind grundsätzlich vom Typ String!</b></font>         
            String oscarsString = data[i][2];
            <font color='blue'><b>//  in int konvertieren</b></font>         
            int oscars = Integer.parseInt(oscarsString);
   
   
             <font color='blue'><b>// alles in einen String zusammenfuegen...</b></font>         
             <font color='blue'><b>// ein Person-Objekt erzeugen ...</b></font>         
             String zeile = hauptdarsteller+": "+filmName+" ("+oscars+" Oscars)";
             Person p = new Person(name, vorname);
            System.out.println(zeile);
   
   
             <font color='blue'><b>// ... und an die Liste ergebnis anhaengen</b></font>         
             <font color='blue'><b>// ... und an die Liste ergebnis anhaengen</b></font>         
             ergebnis.append(zeile);
             ergebnis.append(p);
         }
         }
         return ergebnis;
         return ergebnis;
Zeile 85: Zeile 135:
     }
     }
  }
  }
</code>
</code>

Aktuelle Version vom 6. Februar 2024, 17:29 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

Erklärvideo

Mit Java auf Datenbanken zugreifen (gemäß Schnittstelle NRW-Zentralabitur)

Fachbegriffe

SQL-Abfrage, Parameter, QueryResult, 2-dimensionales Array, Zeile und Spalte(im 2-dim. Array)

Schnittstelle des Zentralabitur

Datei:DatabaseConnector QueryResult Abi 2018.pdf

Beispiel

Vorüberlegungen

Das folgende Beispiel bezieht sich auf die Datenbank Schule, die auch im Unterricht häufig zum Einsatz kommt.
Das Datenbank-Modell und alle Daten der Datenbank finden sich hier:

Beispieldatenbank Schule


Es soll jetzt eine Java-Methode entwickelt werden, die alle Schüler einer Klasse als eine Liste vom Inhaltstyp Person zurückgibt.
Die Klasse soll man als Parameter pKlasse übergeben können.

D.h. die Methodenkopf soll wie folgt aussehen:


  public List<Person> schuelerDerKlasse(String pKlasse)

(Die Klasse Person hat einen Konstruktor public Person(String pName, String pVorname) - mehr muss man über die Klasse Person hier nicht wissen.)

Datenbank-Abfrage

Die Datenbank-Abfrage, die das ermöglicht, ist die folgende - hier aufgezeigt am Beispiel der 8B:


 SELECT s.name, s.vorname
 FROM schueler s JOIN klasse k
 ON s.klasse_id = k.id
 WHERE k.name = '8B'

Diese Datenbank-Abfrage sollte man vorab entwickelt und getestet haben.

Es ist besser, wenn man für die SQL-Abfrage einfach Anführungszeichen nimmt!
Die doppelten Anführungszeichen braucht man für Java!

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 schuelerDerKlasse(String pKlasse) 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 den Namen
      String name = data[i][0];
    7. Man erhält grundsätzlich Objekte vom Typ String.
      Evtl. muss man sie noch in einen richtigen Datentyp konvertieren.

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<Person> schuelerDerKlasse(String pKlasse){
       List<Person> ergebnis = new List<Person>();

       //Das SQL-Statement zusammenbauen       
       // Der Paramenter pKlasse wird "eingebaut". - man muss auf die Leerzeichen achten!!       
       // Dabei muss man muss auf die Leerzeichen achten...       
       // ... und die einfachen Anführungszeichen für SQL mitschreiben!        

       String sqlStatement =
         " SELECT s.name, s.vorname "+
         " FROM schueler s JOIN klasse k "+
         " ON s.klasse_id = k.id "+
         " WHERE k.name = '" + pKlasse + "' ";
 
       // 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 Datenbankabfrage 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 name = data[i][0];
           String vorname = data[i][1];

           // ein Person-Objekt erzeugen ...         
           Person p = new Person(name, vorname);

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