Der sauberste Weg, um eine SQL-Zeichenfolge in Java zu erstellen
Möchte ich das erstellen einer SQL-string zu tun, Datenbank-manipulation (updates, deletes, inserts, selects, die Art der Sache) - statt der schrecklichen string-concat-Methode mit Millionen von "+"'s und Zitate, die nicht lesbar ist am besten - es muss einen besseren Weg geben.
Ich habe darüber nachgedacht, mit MessageFormat - aber soll verwendet werden für die user-Meldungen, obwohl ich denke, es würde tun, einen guten job - aber ich denke, es sollte etwas sein, das mehr ausgerichtet, um SQL-Typ-Operationen in der java-sql-Bibliotheken.
Wäre Groovy gut sein?
InformationsquelleAutor der Frage Vidar | 2008-12-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst sollten Sie mithilfe von query-Parameter in prepared statements:
Die andere Sache, die getan werden kann, ist zu halten, alle Abfragen in der properties-Datei. Zum Beispiel
in einer Abfragen.properties-Datei können die oben genannten Abfrage:
Dann mit Hilfe einer einfachen utility-Klasse:
könnten Sie Ihre Fragen wie folgt:
Dies ist eine ziemlich einfache Lösung, aber funktioniert gut.
InformationsquelleAutor der Antwort Piotr Kochański
Für beliebige SQL verwenden jOOQ. jOOQ derzeit unterstützt
SELECT
,INSERT
,UPDATE
,DELETE
,TRUNCATE
, undMERGE
. Erstellen Sie SQL so:Anstatt eine SQL-Zeichenfolge, könnte man auch einfach ausführen, mithilfe der jOOQ. Sehen
http://www.jooq.org
(Disclaimer: ich arbeite für die Firma, die hinter jOOQ)
InformationsquelleAutor der Antwort Lukas Eder
Einer Technologie, die Sie betrachten sollten, ist SQLJ - eine Möglichkeit zum einbetten von SQL-Anweisungen direkt in Java. Als ein einfaches Beispiel, könnten Sie Folgendes in eine Datei namens TestQueries.sqlj:
Gibt es eine zusätzliche precompile Schritt, das findet Ihr .sqlj-Dateien und übersetzt Sie in reinen Java - kurz, es sieht für die spezielle Blöcke getrennt mit
und verwandelt Sie in JDBC-Aufrufe. Es gibt mehrere wichtige Vorteile für den Einsatz von SQLJ:
Gibt es Implementierungen der übersetzer, um für die meisten der großen Datenbank-Anbieter, so sollten Sie in der Lage, zu finden alles, was Sie brauchen leicht.
InformationsquelleAutor der Antwort Ashley Mercer
Frage ich mich, wenn Sie nach so etwas wie Kringel. Auch etwas, was sehr nützlich ist jDBI. Es wird Ihnen nicht helfen, Fragen, aber.
InformationsquelleAutor der Antwort tcurdt
Ich würde einen Blick auf Spring JDBC. Ich benutze es, wenn ich brauche zu ausführen von SQLs programmatisch. Beispiel:
Es ist wirklich ideal für jede Art von sql-Ausführung, insbesondere die Abfrage; es wird Ihnen helfen, anzeigen resultsets zu Objekten, ohne die Komplexität einer kompletten ORM.
InformationsquelleAutor der Antwort Bent André Solheim
Neige ich zum Frühling, den Namen JDBC Parameter, so kann ich schreiben Sie einen standard-string wie "select * from bla where colX=':Wert'"; ich denke, das ist ziemlich gut lesbar.
Alternative wäre die Versorgung der string in einer separaten .sql-Datei und Lesen Sie den Inhalt im mit einem Dienstprogramm-Methode.
Oh, lohnt sich auch ein Blick auf Blaustern: https://squill.dev.java.net/docs/tutorial.html
InformationsquelleAutor der Antwort GaryF
Warum wollen Sie zu generieren, die die sql von hand? Haben Sie sich ein ORM wie Hibernate Abhängig von Ihrem Projekt, es wird wahrscheinlich mindestens 95% von dem, was Sie müssen, tun Sie es in eine sauberere Weise als raw-SQL, und wenn Sie benötigen, um das Letzte bisschen performance, die Sie erstellen können, die SQL-Abfragen müssen, werden von hand gestimmt.
InformationsquelleAutor der Antwort Jared
Ich zweite die Empfehlungen für die Verwendung von ein ORM wie Hibernate. Allerdings gibt es sicherlich Situationen, wo das nicht funktioniert, also werde ich diese Gelegenheit nutzen, tout paar Sachen, die ich geholfen habe, zu schreiben: SqlBuilder ist eine java-Bibliothek für die dynamische erstellen von sql-Anweisungen mithilfe der "builder" - Stil. es ist ziemlich mächtig und ziemlich flexibel.
InformationsquelleAutor der Antwort james
Können Sie auch einen Blick auf MyBatis (http://www.mybatis.org) . Es hilft Ihnen, SQL-Anweisungen schreiben, die außerhalb Ihrer java-code und ordnet die sql-Ergebnisse in Ihre java-Objekte, unter anderem.
InformationsquelleAutor der Antwort joshua
Ich habe auf einer Java-servlet-Anwendung, die Bedürfnisse zu konstruieren, die sehr dynamische SQL-Anweisungen für die adhoc-Berichterstellung. Die grundlegende Funktion der app ist das Futter eine Reihe von benannten HTTP-request-Parameter in eine VORGEGEBENE Abfrage aus, und erzeugen eine schön formatierte Tabelle ausgegeben. Ich verwendet, Spring MVC und dependency injection framework zum speichern von alle meine SQL-Abfragen in XML-Dateien und laden Sie Sie in die reporting-Anwendung, zusammen mit der Tabelle, die Informationen zur Formatierung. Schließlich werden die Anforderungen an die Berichterstattung wurde komplizierter, als die Fähigkeiten des vorhandenen parameter-mapping-frameworks und-hatte ich zu schreiben mein eigenes. Es war eine interessante übung in der Entwicklung und produziert einen Rahmen für die parameter-mapping ist wesentlich robuster als alles, was ich finden konnte.
Den neuen parameter-mappings sah aus, als Z:
Die Schönheit der resultierende Rahmen war, könnte es verarbeiten von HTTP-request-Parameter direkt in der Abfrage mit der richtigen Typ-überprüfung und Grenzwertüberwachung. Keine zusätzlichen mappings erforderlich für die Validierung von Eingaben. Im Beispiel der obigen Abfrage, die den parameter mit dem Namen serverId
würden überprüft, um sicherzustellen, dass es wirken könnte, um eine Ganzzahl im Bereich von 0-50. Die parameter appId würde, verarbeitet werden als eine Reihe von zahlen, mit einer maximale Länge von 50. Wenn das Feld showOwner ist vorhanden und auf "true" gesetzt, werden die bits von SQL in Anführungszeichen Hinzugefügt werden, um die erzeugte Abfrage für den optionalen Feld-mappings. Feld Mehrere parameter type mappings sind verfügbar, einschließlich optionaler Segmente von SQL mit dem weiteren parameter-mappings. Es ermöglicht, wie Komplex ein query-mapping wie die Entwickler mit oben kommen kann. Es hat auch Steuerelemente in den Bericht Konfiguration, um zu bestimmen, ob eine gegebene Abfrage die endgültige Zuordnungen über ein PreparedStatement oder einfach ran, da es sich um eine vordefinierte Abfrage.
Für den Beispiel-Http-request-Werte:
Es produzieren würde die folgende SQL:
Ich wirklich denken, dass Spring oder Hibernate oder diejenigen, die frameworks bieten sollte, ein robuster mapping-Mechanismus, der überprüft, Typen, können für komplexe Datentypen wie arrays und andere solche Funktionen. Ich schrieb mein Motor nur für meine Zwecke, es ist nicht ganz gelesen, für die Allgemeine Freigabe. Es funktioniert nur mit Oracle-Abfragen in dem moment, und der gesamte code gehört zu einem großen Konzern. Eines Tages kann ich meine Ideen und bauen eine neue open-source-framework, aber ich hoffe, dass einer der bestehenden großen Spieler werden sich der Herausforderung stellen.
InformationsquelleAutor der Antwort Natalia
Lesen einer XML-Datei.
Können Sie es Lesen aus einer XML-Datei. Es ist leicht zu pflegen und zu arbeiten.
Es gibt standard -, STaX, DOM, SAX-Parser zur Verfügung gibt, um es ein paar Zeilen code in java.
Tun, mehr mit Attributen
Können Sie einige semantische Informationen, die mit Attributen im tag, um zu helfen tun mehr mit der SQL. Dies kann der name der Methode oder den query-Typ, oder etwas, das Ihnen hilft, code weniger.
Maintaince
Können Sie die xml-außerhalb der jar und leicht zu pflegen. Gleichen Vorteile wie eine properties-Datei.
Konvertierung
XML ist erweiterbar und leicht konvertierbar in andere Formate.
Anwendungsfall
Metamug verwendet xml zum konfigurieren von REST-Ressource-Dateien mit sql.
InformationsquelleAutor der Antwort Sorter
Google bietet eine Bibliothek namens der Zimmer Persitence-Bibliothek bietet eine sehr saubere Art zu schreiben sql. Unten wird eine kurze code-snippet von der offiziellen Webseite:
Gibt es noch mehr Beispiele und eine bessere Dokumentation in den offiziellen docs für die Bibliothek.
Gibt es auch eine namens MentaBean das ist ein Java-ORM. Es hat nette features und scheint zu sein, ziemlich einfache Möglichkeit zum schreiben von SQL.
InformationsquelleAutor der Antwort CasualCoder3
Wenn du die SQL-strings in einer properties-Datei und lese dann, dass Sie können, halten Sie die SQL-Zeichenfolgen in einer Textdatei.
Nicht lösen, der SQL-Typ-Probleme, aber zumindest ist es macht das kopieren&einfügen von TOAD oder sqlplus viel einfacher.
InformationsquelleAutor der Antwort Rowan
Wie bekommt man die string-Verkettung, abgesehen von langen SQL-strings in PreparedStatements (das könnte man einfach in eine text-Datei und laden Sie als Ressource sowieso), dass Sie brechen über mehrere Zeilen?
Sie nicht schaffen SQL-strings direkt sind Sie? Das ist das größte no-no in der Programmierung. Bitte verwenden Sie PreparedStatements, und liefern Sie die Daten als Parameter. Es reduziert die Möglichkeit von SQL-Injection gewaltig.
InformationsquelleAutor der Antwort JeeBee