Java-SQL: Unterschied zwischen den Versionen
Zeile 35: | Zeile 35: | ||
FROM schueler s JOIN klasse k | FROM schueler s JOIN klasse k | ||
ON s.klasse_id = k.id | ON s.klasse_id = k.id | ||
WHERE k.name = '8B' | WHERE k.name = '<font color='red'>8B</font>' | ||
</code> | </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== | ==Strategie== |
Version vom 6. Februar 2024, 17:05 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.
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
zehnFilmeMit(String pDarsteller)
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 die Oscars
String oscarsString = data[i][2];
- Man erhält grundsätzlich Objekte vom Typ
String
.
Evtl. muss man sie noch in einen richtigen Datentyp konvertieren, z.B. mitint oscars = Integer.parseInt(oscarsString);
- 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());
}
}