Java - Ibatis - mySQL mit Dynamische Abfrage basierend auf ihrer Rolle
-
19-08-2019 - |
Frage
Ich bin mit Java - Ibatis und mySQL mit Flex / Flash auf dem Front-End. Ich habe eine Anforderung, die dynamisch in der Lage ist zu creterias und Tabelle zu einer Abfrage hinzufügen auf der Benutzerrolle abhängig. hier ist ein Beispiel
Das gleiche Objekt aufrufen gleiche SQL aber anderes Ergebnis basiert auf Rolle
Rolle 1: Vollständig Zugriff auf Mitarbeiter
SELECT *
FROM Employee A
Die Rolle 2: Limited Zugriff auf Mitarbeiter
SELECT *
FROM Employee A
, SECURE_LIST B
WHERE B.EmployeeID = A.EmployeeID
AND B.ROLE_ID = 'ROLE'
Ich konnte verwenden dynamische SQL
SELECT *
FROM Employee A
<isNotEmpty property="ROLE" >
, SECURE_LIST B
WHERE B.EmployeeID = A.EmployeeID
AND B.ROLE_ID = #ROLE#
</isNotEmpty>
Andere Ideen?
Lösung
SELECT *
FROM Employee A
<isNotEmpty property="ROLE" >
inner join SECURE_LIST B on B.EmployeeID = A.EmployeeID
</isNotEmpty>
<dynamic prepend="WHERE">
<isNotEmpty property="ROLE" prepend="AND">
B.ROLE_ID = #ROLE#
</isNotEmpty>
</dynamic>
Ein wenig einfacher als DAOs zu schaffen, aber immer noch Sie die Flexibilität, andere hinzuzufügen beitritt oder andere Klausel where Elemente ohne Rolle in jeder Parameterkarte enthalten, die
Andere Tipps
Das Problem mit in der Abfrage mit Rolle ist, dass Sie müssen dann als Argument für die Abfrage liefern für möglicherweise jede Abfrage. Was passiert, wenn Sie Argumente für die Abfrage benötigen liefern? Sie werden Rolle dieser Parameter Klassen hinzufügen müssen / zu abbildet. Es ist alles ein bisschen chaotisch.
ich einen Schritt zurück nehmen würde und Ihre DAO definieren:
public interface MyDAO {
List<Employee> getEmployees();
...
}
und erstellen Sie dann zwei Implementierungen:
public class MyDAOSuper implements MyDAO {
public List<Employee> getEmployees() {
// call a query using your first SQL
}
}
public class MyDAOLimited implements MyDAO {
public List<Employee> getEmployees() {
// limited version
}
}
Ein Vorteil dieses Ansatzes besteht darin, dass, wenn bestimmte Methoden nicht durch eine besondere Rolle verwendet werden, sollten Sie die Möglichkeit, wirft einige Sicherheitsverletzung Ausnahme haben.
Nun, wie Sie stecken, dass in den Rest der Anwendung ist etwas, das ich nicht genug Detail zu kommentieren. Sie könnten BlazeDS in diesem Fall verwenden würde ich vorschlagen mit der Frühling Integration mit BlazeDS , die wird Dependency Injection als Option öffnen.
Alternativ können Sie eine einfache Factory-Methode verwenden (basierend auf Rolle), um die richtige DAO zu erhalten.
Es gibt keine Zweifel, andere Möglichkeiten, dies zu stecken auf Ihrer Konfiguration in Abhängigkeit. Ich denke, die über viel sauberer als das, was Sie vorschlagen though.