Ich habe an einer Java-Servlet-Anwendung gearbeitet, die sehr dynamische SQL-Anweisungen für Ad-hoc-Berichtszwecke erstellen muss. Die Grundfunktion der App besteht darin, eine Reihe benannter HTTP-Anforderungsparameter in eine vorcodierte Abfrage einzuspeisen und eine gut formatierte Ausgabetabelle zu generieren. Ich habe Spring MVC und das Abhängigkeitsinjektionsframework verwendet, um alle meine SQL-Abfragen in XML-Dateien zu speichern und zusammen mit den Tabellenformatierungsinformationen in die Berichtsanwendung zu laden. Schließlich wurden die Berichtsanforderungen komplizierter als die Funktionen der vorhandenen Parameterzuordnungs-Frameworks, und ich musste meine eigenen schreiben. Es war eine interessante Übung in der Entwicklung und erzeugte ein Framework für die Parameterzuordnung, das viel robuster ist als alles andere, was ich finden konnte.
Die neuen Parameterzuordnungen sahen folgendermaßen aus:
select app.name as "App",
${optional(" app.owner as "Owner", "):showOwner}
sv.name as "Server", sum(act.trans_ct) as "Trans"
from activity_records act, servers sv, applications app
where act.server_id = sv.id
and act.app_id = app.id
and sv.id = ${integer(0,50):serverId}
and app.id in ${integerList(50):appId}
group by app.name, ${optional(" app.owner, "):showOwner} sv.name
order by app.name, sv.name
Das Schöne an dem resultierenden Framework war, dass es HTTP-Anforderungsparameter mit ordnungsgemäßer Typprüfung und Grenzwertprüfung direkt in der Abfrage verarbeiten konnte. Für die Eingabevalidierung sind keine zusätzlichen Zuordnungen erforderlich. In der obigen Beispielabfrage wurde der Parameter serverId
überprüft, um sicherzustellen, dass er in eine Ganzzahl umgewandelt werden kann und im Bereich von 0 bis 50 liegt. Der Parameter appId wird als Array von Ganzzahlen mit einer Längenbeschränkung von 50 verarbeitet. Wenn das Feld showOwner angezeigt wirdIst vorhanden und auf "true" gesetzt, werden die SQL-Bits in den Anführungszeichen zur generierten Abfrage für die optionalen Feldzuordnungen hinzugefügt. Feld Es stehen mehrere weitere Parametertypzuordnungen zur Verfügung, einschließlich optionaler SQL-Segmente mit weiteren Parameterzuordnungen. Es ermöglicht eine so komplexe Abfragezuordnung, wie der Entwickler sie sich vorstellen kann. Es gibt sogar Steuerelemente in der Berichtskonfiguration, um zu bestimmen, ob eine bestimmte Abfrage die endgültigen Zuordnungen über ein PreparedStatement aufweist oder einfach als vorgefertigte Abfrage ausgeführt wird.
Für die Beispiel-HTTP-Anforderungswerte:
showOwner: true
serverId: 20
appId: 1,2,3,5,7,11,13
Es würde das folgende SQL erzeugen:
select app.name as "App",
app.owner as "Owner",
sv.name as "Server", sum(act.trans_ct) as "Trans"
from activity_records act, servers sv, applications app
where act.server_id = sv.id
and act.app_id = app.id
and sv.id = 20
and app.id in (1,2,3,5,7,11,13)
group by app.name, app.owner, sv.name
order by app.name, sv.name
Ich denke wirklich, dass Spring oder Hibernate oder eines dieser Frameworks einen robusteren Zuordnungsmechanismus bieten sollte, der Typen überprüft, komplexe Datentypen wie Arrays und andere solche Funktionen ermöglicht. Ich habe meine Engine nur für meine Zwecke geschrieben, sie ist für die allgemeine Veröffentlichung nicht ganz gelesen. Momentan funktioniert es nur mit Oracle-Abfragen und der gesamte Code gehört einem großen Unternehmen. Eines Tages werde ich vielleicht meine Ideen aufgreifen und ein neues Open-Source-Framework aufbauen, aber ich hoffe, dass einer der bestehenden Big Player die Herausforderung annehmen wird.