Java-SQL: Unterschied zwischen den Versionen
Zeile 55: | Zeile 55: | ||
# Es gibt ein Attribut <code>connector</code> vom Typ <code>DatabaseConnector</code> | # Es gibt ein Attribut <code>connector</code> vom Typ <code>DatabaseConnector</code> | ||
# Im Konstruktor wird der <code>connector</code> erzeugt. | # Im Konstruktor wird der <code>connector</code> erzeugt. | ||
# In der Methode <code> | # In der Methode <code>schuelerDerKlasse(String pKlasse)</code> geht man so vor: | ||
## SQL-Statement "zusammenbauen": <br/><code>String sqlStatement = " SELECT ..."</code> | ## SQL-Statement "zusammenbauen": <br/><code>String sqlStatement = " SELECT ..."</code> | ||
## SQL-Statement ausführen: <br/><code>connector.executeStatement(sqlStatement);</code> | ## SQL-Statement ausführen: <br/><code>connector.executeStatement(sqlStatement);</code> | ||
Zeile 61: | Zeile 61: | ||
## 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 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> | ## 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 | ## 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 | ## ''Man erhält grundsätzlich Objekte vom Typ <code>String</code>. <br/>Evtl. muss man sie noch in einen richtigen Datentyp konvertieren.'' | ||
==Java-Code== | ==Java-Code== |
Version vom 6. Februar 2024, 17:13 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:
Es soll jetzt eine Java-Methode entwickelt werden, die alle Schüler der 8B 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.
- Es gibt ein Attribut
connector
vom TypDatabaseConnector
- Im Konstruktor wird der
connector
erzeugt. - In der Methode
schuelerDerKlasse(String pKlasse)
geht man so vor:- SQL-Statement "zusammenbauen":
String sqlStatement = " SELECT ..."
- SQL-Statement ausführen:
connector.executeStatement(sqlStatement);
- Das Ergebnis der SQL-Abfrage ermitteln:
QueryResult queryResult = connector.getCurrentQueryResult()
- 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. - Die Zeilen werden mit einer
for
-Schleife durchlaufen:for (int i = 0; i < data.length; i++)
- Jetzt liest man die einzelnen Werte nach Spaltennummer aus, z.B. für den Namen
String name = data[i][0];
- Man erhält grundsätzlich Objekte vom Typ
String
.
Evtl. muss man sie noch in einen richtigen Datentyp konvertieren.
- SQL-Statement "zusammenbauen":
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<Film> zehnFilmeMit(String pDarsteller){
List<Film> ergebnis = new List<Film>();
//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);
// ein Film-Objekt erzeugen
Film f = new Film(filmName, hauptdarsteller,oscars);
System.out.println(f.toString());
// ... und an die Liste ergebnis anhaengen
ergebnis.append(f);
}
return ergebnis;
}
public static void main(String[] args) {
new GUI(new DatenbankTest());
}
}