2016-11-04 5 views
0

Ich arbeite mit Spring Boot für ein Projekt. JdbcNamedTemplates werden in meinen DAOs verwendet, um auf Daten zuzugreifen. Ich schreibe Abfragen in meine Daos und mappe dann einige Parameter zur Laufzeit, um korrekte Daten zu erhalten.Umgang mit verschiedenen Tabellennamen mit JDBCTemplate in Spring-Anwendung

Nun muss ich Daten abhängig von der Anfrage von mehreren identischen Tabellen abrufen. Die Abruflogik ist die gleiche, außer dass ich andere Tabellennamen verwenden muss. JdbcTemplate erlaubt nicht die Verwendung von Tabellennamen als Parameter. Ich möchte keine String-Formatierung verwenden, da ich möchte, dass meine Abfragen endgültig sind.

Ich könnte abstrakte Klasse mit den meisten der Funktionalität und den konkreten Klassen erstellen, die es erweitern, um Unterschiede in Tabellennamen zu behandeln (grundsätzlich haben Methode "getTableName()"). Das funktioniert. Es sieht jedoch so aus, als würde ich viele Klassen erstellen und ich möchte weniger davon erstellen.

Gibt es bessere Möglichkeiten, es zu tun?

Ich dachte, dass die Verwendung von Schnittstellen für bestimmte Tabellennamen wäre nett, aber ich kann nicht meinen Kopf darüber wickeln, wie das mit Spring und Autowiring funktionieren könnte.

UPDATE:

geben Sie einfach eine Probe von dem, was Ich mag würde zu verbessern. Bisher habe ich paar abstrakte DAOs wie diese. Sie machen das Datenbankgespräch.

Als nächstes habe ich einige Datenzugriffsobjekte, die abstrakte Methode GetTableName() implementieren. Wenn der Tisch also "Herbst" wäre, hätte ich es tun sollen.

@Component 
public class AutumnDao1 extends Dao1 { 
    @Override 
    protected String getTableName() { 
     return "AUTUMN"; 
    } 
} 

aus Beispiel also über Sie, dass für jede abstrakte dao sehen kann ich würde paar Beton Daos (Herbst, Winter, Frühling, Sommer) zu machen. Dies ist im Moment akzeptabel, aber irgendwann könnte dies zu einer ziemlich großen Sammlung von Daos werden.

Ich würde gerne wissen, ob es eine Möglichkeit gibt, das zu vermeiden, indem zum Beispiel nur eine Klasse/Schnittstelle für jede "Saison"/Name erstellt und irgendwie an Dao1, Dao2 usw. angepasst wird, je nach Bedarf. Ich weiß nur, welcher Name relevant ist, wenn die Benutzeranforderung eintrifft.

+0

"Ich muss abhängig von der Anfrage Daten aus mehreren identischen Tabellen abrufen. Abruflogik ist die gleiche, außer ich muss verschiedene Tabellennamen verwenden" - können Sie eine Probe geben – kuhajeyan

+0

Sie können versuchen, Schnittstellen zu verwenden und verschiedene Implementierungen mit injizieren die Bohne @Qualifier. – Nano

+0

@Nano, ich bin ein Noob mit Anmerkungen. Könnten Sie bitte erläutern, wie es unter Berücksichtigung meines letzten Updates funktionieren könnte? – Riv

Antwort

0

Mit @Qualifier ("NameOfBean") können Sie die Instanz injizieren, die Sie suchen.

Wenn Sie zum Beispiel:

@Component 
public class AutumnDao1 extends Dao1 { 
    @Override 
    protected String getTableName() { 
     return "AUTUMN"; 
    } 
} 

@Component 
public class SummerDao1 extends Dao1 { 
    @Override 
    protected String getTableName() { 
     return "SUMMER"; 
    } 
} 

In diesem Fall können Sie zwei Bohnen erstellen, die in der übergeordneten Klasse Dao1 injiziert werden können. Um den richtigen zu injizieren, sollten Sie folgendes tun:

@Autowire 
@Qualifier("autumnDao1") 
private Dao1 autumnDao; 

@Autowire 
@Qualifier("summerDao1") 
private Dao1 summerDao; 

Versuchen Sie dies!

+0

Danke für die Antwort! Gibt es jedoch eine Möglichkeit, Wualifier zur Laufzeit zu wählen? – Riv

+0

Hmm, ich habe noch keine Ahnung, tbh. Überprüfen Sie diese Frage und sagen Sie mir, ob es das ist, was Sie gesucht haben! http: // Stapelüberlauf.com/questions/26463393/how-to-inject-different-services-zur Laufzeit-basierte-auf-eine-Eigenschaft-mit-Feder-mit – Nano

Verwandte Themen