Gekapselte Queries

Anfang  Zurück  Vor

Letzte Änderung 13.02.2014

 

Für Einsteiger ist es anfangs einfacher, Datenbankabfragen direkt in einem GUI-Ereignis zu formulieren, z.B. eine Suchanfrage in einem Button-Klick-Ereignis actionPerformed.

 

@EventHandlerDelegate void button_actionPerformed(ActionEvent event) 

{

   XDEV.Query;      

   ...

}

 

Wird die hier implementierte Abfrage zu einem späteren Zeitpunkt an mehreren Stellen des Programms benötigt, muss diese mehrmals implementiert und im Falle einer Änderung an vielen Stellen des Programms editiert werden. Das ist nicht nur zeitaufwändig, sondern erhöht das Fehlerrisiko erheblich. Deshalb sollten Sie Ihre Abfragen vom GUI-Code trennen, indem Sie Ihre Queries in separaten Klassen auslagern. Im GUI-Code muss dann nicht mehr der komplette Abfragecode hinterlegt werden, sondern nur noch eine Methode, mit der die Query aufgerufen wird, z.B. Fahrzeuge.VT.showAll( ). Der Abfragecode muss dagegen nur noch an einer einzigen Stelle, nämlich in der Query-Klasse, implementiert und bei Bedarf angepasst werden.

 

Eine mögliche Variante um eine Query auszulagern ist, diese direkt bei der jeweiligen Virtuellen Tabelle zu hinterlegen. Das hat den Vorteil, dass die Query-Methode zum Aufrufen der Query dann sehr gut lesbar ist, z.B. Fahrzeuge.VT.showAll( ), und zudem in der Autovervollständigung zusammen mit den anderen Methoden der Virtuellen Tabelle aufgelistet wird. Die zweite Möglichkeit ist, die Query in eine völlig eigenständige Klasse auszulagern, was ab einer bestimmten Anzahl von Queries empfehlenswert ist.

 

In XDEV 5 werden die in Klassen ausgelagerten Queries mit der Annotation @SQLQuery gekennzeichnet und können damit im Fenster Queries, das Sie über das Menü Fenster > Code-Editor > Queries aufrufen können, automatisch aufgelistet werden.

 

clip0255

 

 

 

Query-Methode bei Virtueller Tabelle hinterlegen

 

1.Wählen Sie im Menü Ansicht > Fenster > Queries, um das Übersichtsfenster für Queries zu öffnen.

2.Klicken Sie auf add_script, um eine neue Query anzulegen.

3.Wählen Sie im folgenden Assistenten bei Bereits vorhandene Klasse > Virtuelle Tabellen > Fahrzeuge aus und klicken Sie auf OK.

clip0252

4.Geben Sie bei Methodenname den Namen der Methode an, mit der sich die Abfrage später aufrufen lassen soll, z.B. showAll und klicken Sie auf OK.  

clip0254

5.Fügen Sie die Anweisung XDEV.Query in die generierte Methode showAll( ) ein, um die eigentliche Abfrage mit Hilfe des Query-Assistenten zu konstruieren.

@SQLQuery

public void showAll() throws DBException

{

   XDEV.Query;

}

6.Selektieren Sie im folgenden Query-Assistenten die Datenbank-Tabelle Fahrzeuge, übernehmen Sie bei Ziel (Virtuelle Tabelle) die vorgeschlagene Virtuelle Tabelle Fahrzeuge und klicken Sie auf OK.

clip0251

 

 

 

Generierter Code

 

@SQLQuery

public void showAll() throws DBException

{

   // Generierte Datenbankabfrage

   XDEV.Query(new Query()

   {

      @Override

      public void init()

      {

         setDataSource(kfzDB.DB);

         

         select("ID").into(Fahrzeuge.ID);

         select("BILDPFAD").into(null);

         select("MODELL_ID").into(Fahrzeuge.MODELL_ID);

         select("LEISTUNG").into(Fahrzeuge.LEISTUNG);

         select("ERSTZULASSUNG").into(Fahrzeuge.ERSTZULASSUNG);

         select("KILOMETERSTAND").into(Fahrzeuge.KILOMETERSTAND);

         select("FAHRZEUGTYP_ID").into(Fahrzeuge.FAHRZEUGTYP_ID);

         select("FAHRZEUGART_ID").into(Fahrzeuge.FAHRZEUGART_ID);

         select("KRAFTSTOFF_ID").into(Fahrzeuge.KRAFTSTOFF_ID);

         select("GETRIEBE_ID").into(Fahrzeuge.GETRIEBE_ID);

         select("FARBE_ID").into(Fahrzeuge.FARBE_ID);

         select("PREIS").into(Fahrzeuge.PREIS);

         from("FAHRZEUGE");

          

         setVirtualTable(Fahrzeuge.VT);

         setFillMethod(VirtualTableFillMethod.OVERWRITE);

      }

   });

}

 

 

 

Queries in eigener Klasse hinterlegen

 

1.Wählen Sie im Menü Ansicht > Fenster > Queries, um das Übersichtsfenster für Queries zu öffnen.

2.Klicken Sie auf add_script, um eine neue Query anzulegen.

3.Wählen Sie im folgenden Assistenten Neue Klasse anlegen, geben Sie bei Name den Namen für die Klasse an, z.B. FahrzeugeQueries,  wählen Sie bei Ordner > Queries und klicken Sie auf OK.

clip0253

4.Geben Sie im folgenden Assistenten bei Methodenname den Namen der Methode an, mit der sich die Abfrage später aufrufen lassen soll, z.B. showAll und klicken Sie auf OK.

clip0254

5.Fügen Sie die Anweisung XDEV.Query in die generierte Methode QueryAll( ) ein, um die eigentliche Abfrage mit Hilfe des Query-Assistenten zu konstruieren.

public class FahrzeugeQueries

{

   @SQLQuery

   public static void showAll() throws DBException

   {

      XDEV.Query;

   }

}

7.Selektieren Sie im folgenden Query-Assistenten die Datenbank-Tabelle Fahrzeuge, übernehmen Sie bei Ziel (Virtuelle Tabelle) die vorgeschlagene Virtuelle Tabelle Fahrzeuge und klicken Sie auf OK.

clip0251

 

 

 

Generierter Code

 

public class FahrzeugeQueries

{

   @SQLQuery

   public static void showAll() throws DBException

   {

      // Generierte Datenbankabfrage

      XDEV.Query(new Query()

      {

         @Override

         public void init()

         {

            setDataSource(kfzDB.DB);

            

            select("ID").into(Fahrzeuge.ID);

            select("MODELL_ID").into(Fahrzeuge.MODELL_ID);

            select("LEISTUNG").into(Fahrzeuge.LEISTUNG);

            select("ERSTZULASSUNG").into(Fahrzeuge.ERSTZULASSUNG);

            select("KILOMETERSTAND").into(Fahrzeuge.KILOMETERSTAND);

            select("FAHRZEUGTYP_ID").into(Fahrzeuge.FAHRZEUGTYP_ID);

            select("FAHRZEUGART_ID").into(Fahrzeuge.FAHRZEUGART_ID);

            select("KRAFTSTOFF_ID").into(Fahrzeuge.KRAFTSTOFF_ID);

            select("GETRIEBE_ID").into(Fahrzeuge.GETRIEBE_ID);

            select("FARBE_ID").into(Fahrzeuge.FARBE_ID);

            select("PREIS").into(Fahrzeuge.PREIS);

            from("FAHRZEUGE");

            

            setVirtualTable(Fahrzeuge.VT);

            setFillMethod(VirtualTableFillMethod.OVERWRITE);

         }

      });

   }

}

 

 

 

Parameter-Übergabe für Bedingung und SQL-Funktionen

 

Alle Werte die Sie für eine Abfragebedingung (WHERE) und SQL Funktionen (Group By, Order By etc.) benötigen, müssen vor dem Aufruf der Query-Methode als Variable oder Objekt zur Verfügung stehen, sodass Sie diese anschließend der Query-Methode als Parameter übergeben können.

 

@EventHandlerDelegate void button_actionPerformed(ActionEvent event) 
{
   String hersteller = "VW";
   String modelle = "Golf";
}

 

Im Methoden-Assistent bei Parameter können Sie dann alle Parameter übergeben die Ihre Abfrage benötigt. Klicken Sie dazu auf Neu, wählen Sie bei Typ den Variablennamen aus, z.B. String und geben dann bei Name den Variablennamen an, z.B. hersteller. Auch Objekte lassen sich übergeben.

 

clip0597

 

public class Fahrzeuge extends VirtualTable implements StaticInstanceSupport 
{

 
   @SQLQuery
   public void filterHerstellerAndModelle(String hersteller, String modelle) throws DBException
   {
       XDEV.Query;
   }

 

Im Query-Assistenten können die übergebenen Parameter hersteller und modelle für die Abfragebedingung verwendet werden.

 

clip0598

 

Generierter Code:

@SQLQuery
public void filterHerstellerAndModelle(String hersteller, String modelle) throws DBException
{
   XDEV.Query(new Query(hersteller,modelle)
   {
      @Override
      public void init()
      {
         final String hersteller = getArg(String.class);
         final String modelle = getArg(String.class);
         
         setDataSource(DB.DB);
         
         from("FAHRZEUGE");
         select("FAHRZEUGE","ID").into(Fahrzeuge.ID);
         leftJoin("MODELLE","ID","FAHRZEUGE","MODELL_ID");
         select("FAHRZEUGE","MODELL_ID").into(Fahrzeuge.MODELL_ID);
         select("MODELLE","MODELL").into(Fahrzeuge.MODELLE_MODELL);
         leftJoin("HERSTELLER","ID","MODELLE","HERSTELLER_ID");
         select("HERSTELLER","MARKE").into(Fahrzeuge.HERSTELLER_MARKE);
         select("FAHRZEUGE","LEISTUNG").into(Fahrzeuge.LEISTUNG);
         select("FAHRZEUGE","ERSTZULASSUNG").into(Fahrzeuge.ERSTZULASSUNG);
         select("FAHRZEUGE","KILOMETERSTAND").into(Fahrzeuge.KILOMETERSTAND);
         leftJoin("FAHRZEUGTYP","ID","FAHRZEUGE","FAHRZEUGTYP_ID");
         select("FAHRZEUGE","FAHRZEUGTYP_ID").into(Fahrzeuge.FAHRZEUGTYP_ID);
         select("FAHRZEUGTYP","TYP").into(Fahrzeuge.FAHRZEUGTYP_TYP);
         leftJoin("FAHRZEUGART","ID","FAHRZEUGE","FAHRZEUGART_ID");
         select("FAHRZEUGE","FAHRZEUGART_ID").into(Fahrzeuge.FAHRZEUGART_ID);
         select("FAHRZEUGART","ART").into(Fahrzeuge.FAHRZEUGART_ART);
         leftJoin("KRAFTSTOFF","ID","FAHRZEUGE","KRAFTSTOFF_ID");
         select("FAHRZEUGE","KRAFTSTOFF_ID").into(Fahrzeuge.KRAFTSTOFF_ID);
         select("KRAFTSTOFF","KRAFTSTOFF").into(Fahrzeuge.KRAFTSTOFF_KRAFTSTOFF);
         select("FAHRZEUGE","GETRIEBE_ID").into(Fahrzeuge.GETRIEBE_ID);
         leftJoin("FARBE","ID","FAHRZEUGE","FARBE_ID");
         select("FAHRZEUGE","FARBE_ID").into(Fahrzeuge.FARBE_ID);
         select("FARBE","FARBE").into(Fahrzeuge.FARBE_FARBE);
         select("FAHRZEUGE","PREIS").into(Fahrzeuge.PREIS);
         where(getColumn("HERSTELLER","MARKE").LIKE("?").AND(getColumn("MODELLE","MODELL").LIKE("?")),_LIKE_(hersteller),_LIKE_(modelle));
         
         setVirtualTable(Fahrzeuge.VT);
         setFillMethod(VirtualTableFillMethod.OVERWRITE);
      }
   });

 

 

 

Gekapselte Queries per Methode aufrufen

 

Die in der Virtuellen Tabelle Fahrzeuge oder in der eigenständigen Klasse FahrzeugeQueries hinterlegte Query kann nun an jeder beliebigen Programmstelle per Methodenaufruf aufgerufen werden.

 

1.Wechseln Sie in den GUI-Builder, fügen Sie einen Button in die Arbeitsfläche ein und vergeben Sie diesen ein Maus-Klick-Event actionPerformed.

@EventHandlerDelegate void button_actionPerformed(ActionEvent event) 

{

    

}

2.Wählen Sie im Menü Fenster > Code-Editor > Queries, um das Fenster Queries zu öffnen.

clip0533

3.Ziehen Sie Ihre Query-Methode, z.B. showAll( ), mit Drag&Drop in den Code-Editor.

@EventHandlerDelegate void button_actionPerformed(ActionEvent event) 

{

    try

    {

       Fahrzeuge.VT.showAll();

    }

    catch(DBException e)

    {

       e.printStackTrace();

    }

}

 

 

 

Gruppierung von Query-Methoden

 

Query-Methoden lassen sich im Fenster Queries thematisch gruppieren. Bereits beim Anlegen einer Query-Methode können Sie im Methoden-Assistent bei Gruppe (optional) einen Gruppennamen angeben. Die Gruppierung erfolgt hier jedoch nicht wie im Projektmanagement mit Ordnern, sondern wird mit Hilfe der Annotation group erreicht, die direkt im Code bei der Query-Methode angegeben wird. Der Gruppenname wird als Zeichenkette angegeben. Um eine Query-Methode einer anderen Gruppe zuzuweisen, müssen Sie lediglich den Gruppennamen bei der Annotation group ändern und anschließend speichern.

 

Query-Methode der Gruppe "Detailsuche"

@SQLQuery(group = "Detailsuche")

public void QueryAll() throws DBException

{

   // XDEV.Query

}

Aus Detailsuche ...

 

Query-Methode der Gruppe "Schnellsuche"

@SQLQuery(group = "Schnellsuche")

public void QueryAll() throws DBException

{

   // XDEV.Query

}

wird Schnellsuche.