Queries in Java mit der XDEV SQL Engine

Anfang  Zurück  Vor

Letzte Änderung 17.04.2014

 

Mit der XDEV SQL Engine können Sie Datenbankabfragen vollständig in Java formulieren. Das Ergebnis ist SQL-Code, der jedoch erst zur Laufzeit von der XDEV SQL Engine speziell für die aktuell verwendete Datenbank dynamisch generiert wird. In Java geschriebene Abfragen bieten Ihnen im Vergleich zu SQL-Strings erhebliche Vorteile:

 

Komfortable Autovervollständigung - Bei der Formulierung der Abfrage werden Sie von der IDE stets mit sinnvollen Eingabemöglichkeiten unterstützt und erhalten gleichzeitig eine Übersicht über alle zur Verfügung stehenden Anweisungen. Mit SQL ist dies nicht möglich, da der Java Compiler keine SQL-Syntax verarbeiten kann.

Beliebige Reihenfolge der Statements - Anders als bei SQL ist eine beliebige Reihenfolge der einzelnen Statements einer Abfrage möglich, z.B. SELECT ... GROUP BY ... WHERE ... FROM.

Compiler-Warnings - Syntax-Fehler im Javacode werden von der IDE sofort erkannt und im Quelltext markiert. Ergänzend dazu erhalten Sie im Fenster Inspektor einen Hinweis auf die Art und Position des Fehlers. Fehler in SQL-Strings können dagegen von der IDE nicht erkannt werden, sondern treten erst zur Laufzeit zutage und die Suche nach der Ursache ist oft aufwändig.

Debugbare Abfragen - Jeder Javacode lässt sich in XDEV 5 debuggen, damit auch Ihre mit der XDEV SQL Engine formulierten Datenbankabfragen. Das Debuggen eines SQL-Strings ist dagegen nicht möglich.

Kein Anpassungsaufwand bei Änderungen am Datenmodell - Bei Änderungen von Virtuellen Tabellen, z.B. Datenfeldnamen oder Datentypen, werden automatisch alle betroffenen Datenbankabfragen im gesamten Projekt von der IDE durch Refactoring angepasst. Wenn Sie Ihre Abfragen dagegen in SQL formulieren, müssen Sie bei der geringsten Änderungen am Datenmodell alle betroffenen SQL-Anweisungen manuell anpassen.

Kein Anpassungsaufwand bei Datenbankwechsel - Im Falle eines Datenbankwechsels müssen Sie nicht die geringste Anpassung an Ihren Abfragen vornehmen, sondern nur die Datenbankschnittstelle austauschen. Wenn Sie Ihre Abfragen dagegen in SQL formulieren, müssen Sie bei einem Wechsel der Datenbank u.U. die Syntax zahlreicher SQL-Anweisungen manuell anpassen.

 

 

// Erzeugen eines Select-Objektes
SELECT selectModelle = new SELECT();
 
// Definition des Selects
selectModelle.columns(
   Modelle.ID, 
   Modelle.MODELL, 
   Modelle.HERSTELLER_ID);

 

selectModelle.FROM(Modelle.VT);

 

Ergebnis:

 

SELECT
  PUBLIC.MODELLE.ID,
  MODELL,
  PUBLIC.MODELLE.HERSTELLER_ID
 
FROM PUBLIC.MODELLE

 

 

 

SELECT Objekt

 

Für jede Datenbankabfrage müssen Sie zuerst ein SELECT Objekt erzeugen, in dem die anschließend formulierte Abfrage gespeichert wird.

 

SELECT selectModelle = new SELECT();

 

Um die Klasse SELECT verwenden zu können, die Sie im Package xdev.db.sql finden, müssen Sie diese zuvor importieren. Drücken Sie Strg+Umschalt+O um die import Anweisung generieren zu lassen.

Über die Objekt-Variable selectModelle lassen sich anschließend alle unterstützten Funktionen anwenden, u.a. FROM, LEFT_JOIN, RIGHT_JOIN, INNER_JOIN, HEAVING, GROUP_BY usw.

 

clip0592

 

 

 

Datenfelder selektieren

 

Mit der Methode columns( ) können Sie beliebige Datenfelder selektieren. Als Parameter müssen Sie eine Liste mit Spalten angeben, die Sie selektieren möchten. Die Spaltennamen können wahlweise als Zeichenkette, z.B. "HERSTELLER_ID", oder VT-Konstante, z.B. Modelle.HERSTELLER_ID angegeben werden. Falls möglich, sollten Sie immer VT-Konstanten verwenden. Die Angabe von Strings ist insbesondere dann erforderlich, wenn für die abzufragende Datenbanktabelle keine Virtuelle Tabelle existiert.

 

Mit der Methode FROM( ) legen Sie die zu selektierende Tabelle fest. Wenn Sie alle Datenfelder selektieren möchten, können Sie die columns( ) Methode vollständig weglassen. Das Ergebnis ist dann SELECT * FROM... .

 

selectModelle.columns(
   Modelle.ID, 
   Modelle.MODELL, 
   Modelle.HERSTELLER_ID);

 

selectModelle.FROM(Modelle.VT);

 

Spaltennamen als Strings:

 

selectModelle.columns(
   "ID", 
   "MODELL", 
   "HERSTELLER_ID";
 
selectModelle.FROM(Modelle.VT);

 

Wenn für die zu selektierende Tabelle keine Virtuelle Tabelle vorhanden ist, muss in der FROM( ) Methode ein Table Objekt erzeugt werden.

 

selectModell.FROM(new Table("Modelle"));

 

 

 

Abfrage absetzen

 

Mit der Methode query(VirtualTable vt, SELECT select, Object... params), die Sie in der Klasse DBUitls finden, wird die Abfrage an die Datenbank gesendet. Als Parameter müssen Sie die Virtuelle Ziel-Tabelle sowie das SELECT Objekt übergeben, welches die zuvor definierte Abfrage enthält. Mit dem optionalen Parameter Object... params können Sie zusätzliche Parameter übergeben, die anstelle des ? Platzhalters in die WHERE Bedingung eingefügt werden.

 

try
{
   DBUtils.query(Modelle.VT, selectModelle, null);
}
catch(DBException e)
{
   // TODO Auto-generated code
   e.printStackTrace();
}

 

Mit dem optionalen Parameter Object[ ] params können Sie bei Bedarf zusätzliche Parameter angeben, die via ? Platzhalter in das SELECT Objekt eingefügt werden. Die Parameter müssen in derselben Reihenfolge wie die jeweils dazugehörigen ? Platzhalter angegeben werden. Wenn Sie keine weiteren Parameter angeben, können Sie für Object[ ] params wahlweise null angeben oder diesen Parameter vollständig weglassen.

 

 

 

Tipp: Mit der Methode query( ) können Sie auch beliebige SQL-Anweisungen als SQL-Strings versenden. Dazu müssen Sie jedoch die überladene Variante query(VirtualTable vt, String sql, Object... params) verwenden.

 

 

 

Abfragebedingung - WHERE

 

Mit der Methode WHERE( ) können Sie eine WHERE Bedingung definieren. Die dazu notwendigen SQL-Operatoren wie = oder LIKE werden wiederum mit Hilfe entsprechender Methoden wie eq( ) oder LIKE( ) generiert.

 

selectModelle.WHERE(Modelle.MODELL.LIKE("'Golf'"));

 

 

 

selectModelle.WHERE(Modelle.MODELL.LIKE("'Golf'"));

 

try
{
   DBUtils.query(Modelle.VT, selectModelle, "");
}
catch(DBException e)
{
   // TODO Auto-generated code
   e.printStackTrace();
}

 

 

 

Sortierung - ORDER BY

 

selectModelle.columns(
   Modelle.ID, 
   Modelle.MODELL, 
   Modelle.HERSTELLER_ID);
 
selectModelle.FROM(Modelle.VT);

 
selectModelle.ORDER_BY(Modelle.MODELL);

 

Aufsteigend:

selectModelle.ORDER_BY(Modelle.MODELL, true);

 

Absteigend:

selectModelle.ORDER_BY(Modelle.MODELL, false);

 

 

 

Gruppierung - GROUP BY

 

Der Methode GROUP_BY( ) müssen immer alle selektierten Datenfelder übergeben werden.

 

selectModelle.columns(
   Modelle.MODELL, 
   Modelle.HERSTELLER_ID);
 
selectModelle.FROM(Modelle.VT);

 
selectModelle.GROUP_BY(Modelle.MODELL,Modelle.HERSTELLER_ID);