Java 8 ist endlich angekommen! Betreiben Sie die Datenbank.
Die funktionale Methode zur Verarbeitung von Daten
Java 8 fügt nicht nur die funktionale Unterstützung hinzu, sondern erweitert auch die Sammelklasse durch neue Funktionsverarbeitungsdaten.
Angenommen, Sie haben eine Sammlung von Sammlung: Kunde: Kunde:
Sammlung <Custic> Kunden;
Wenn Sie nur an Kunden aus Belgien interessiert sind, haben Sie alle Kundenobjekte und speichern nur das, was Sie brauchen.
Sammlung <Custic> Belgians = New ArrayList <() ();
Dies kostet nicht 5 Codezeilen, sondern ist nicht sehr abstrakt. Thread -Code zum Umschreiben aller Code.
Mit Java 8 kann nur eine Codezeile dieselben Funktionen erreichen. Machen Sie einfach Filtration.
Kunden.Stream ().
Der Code der obigen Java 8 -Version ist nicht nur kürzer, sondern auch einfacher. Verschwenden Sie Zeit in der Interpretation des Code im Interpretationszyklus, um zu verstehen, was er für seine Daten tut.
Was sollte ich tun, wenn Sie diesen Code gleichzeitig ausführen möchten?
Customer.Parallelsstream ().
Spannender ist, dass dieser funktionale Stilcode auch für die Datenbank anwendbar ist
Verwenden Sie eine Funktionsmethode in der Datenbank
Traditionell müssen Programmierer eine spezielle Datenbank verwenden, um die Daten der Datenbank zu ergreifen.
PrepedStatement S = con.Parestatement ("SELECT *" + "von Kunden c" + "wo c.Country =?"); Ssetstring ();Der größte Teil dieser Code ist die Zeichenfolge, die den Compiler nicht fehlschlägt, und dieser hastige Code wird auch Sicherheitsprobleme verursacht. Geben Sie Datenbankabfragesprache an. Sie können falsche Überprüfungen und Sicherheitsprobleme lösen. Oder verwenden Sie das Tool zur Zuordnung von Objektbeziehungen, um eine große Anzahl von Bohrcode zu vermeiden, aber sie können nur im allgemeinen Zugriff auf Anfragen verwendet werden.
Verwenden Sie Java 8, um die Datenbank nach funktionaler API abzufragen. Zum Beispiel ist Jinq ein Open -Source -Projekt, und welche zukünftige Datenbank -API, die sie untersucht, können funktionelle Programmierungen ermöglichen. Hier ist eine Datenbankabfrage mit JINQ:
Kunden. Wo (c-> C.GetCountry (). Equals ("Belgien");Dieser Code ist fast der Code mit einer Streaming -API. Wenn der Code ausgeführt wird, übersetzt JinQ automatisch in einen Datenbankabfragecode, genau wie die JDBC -Abfrage zuvor.
In diesem Fall können Sie auch dann eine effiziente Datenbankabfrage schreiben. Sie können den gleichen Codestil verwenden, um Java zu sammeln. Sie benötigen keinen speziellen Java -Compiler oder keine virtuelle Maschine. Alle Codekompilierung und ausgeführt auf normalem Java 8 JDK. Wenn Ihr Code falsch ist, findet der Compiler sie und meldet ihn Ihnen, genau wie ein gewöhnlicher Java -Code.
Jinq unterstützt die gleiche komplexe Abfrage wie SQL92. Der Algorithmus des Übersetzungs -Java -Code in eine Datenbankabfrage ist sehr flexibel, solange er ihn akzeptieren kann, kann er übersetzen. Beispielsweise kann JINQ die Datenbankabfrage unten übersetzen, obwohl sie kompliziert ist.
Customers .Where (C-> C.getCountry (). Equals ("Belgium") .Where (c-> {if (c.getsalarly () <100000) Return c.getsALALALALALALALALALALALALAALAAALAAAALAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA a his a a onectctctctctctctctct his his role work work work Arbeit Arbeitsarbeit Arbeitsarbeit Arbeitsarbeit Arbeit Arbeit Arbeit Arbeiter.Wie Sie sehen können, ist die funktionale Programmierung von Java 8 für Datenbankabfrage sehr geeignet. Und die Abfrage ist kompakt und sogar komplizierte Anfragen können kompetent sein.
Interner Betrieb
Aber wie arbeitest du? Wie können gewöhnliche Java -Compiler Java -Code in Datenbankabfrage umwandeln? Was ist das Besondere an Java 8, dies möglich zu machen?
Der Schlüssel zur Unterstützung dieser neuen Datenbank -PIs, die diese Funktionen unterstützen, ist eine Bytecode -Analysemethode, die als "symbolische Ausführung" bezeichnet wird. Obwohl Ihr Code von einem gewöhnlichen Java -Compiler kompiliert wird und in einer gewöhnlichen Java -Virtual -Maschine ausgeführt wird, kann Jinq eine Datenbankabfrage daraus analysieren und erstellen, wenn Sie Java -Code kompiliert werden. Bei der Verwendung der Java 8 -Streams -API wird häufig festgestellt, dass bei der Analyse kurzer Funktionen der Arbeitseffekt der symbolischen Ausführung am besten ist.
Um zu verstehen, wie diese symbolische Ausführung funktioniert, ist es am einfachsten, ein Beispiel zu verwenden. Überprüfen Sie, wie die folgenden Abfragen von Jinq in SQL Query Language konvertiert werden:
Kunden. Wo (c-> c-
Zunächst ist Variablen -Kunden eine Sammlung, und die entsprechende Datenbankabfrage lautet:
Wählen Sie * von Kunden c
Dann wird die where () -Methode aufgerufen und eine Funktion an sie übergeben. In der Methode where () öffnet JINQ die .class -Datei dieser Funktion, um den von dieser Funktion für die Analyse zusammengestellten Byte -Code zu erhalten. Verwenden Sie in diesem Beispiel den Real -Byte -Code nicht. Lassen Sie uns einige einfache Anweisungen verwenden, um den Byte -Code dieser Funktion darzustellen:
d = c.getcountry () e = "belgien" e = d.equals (e) return e
Hier gehen wir davon aus, dass die Funktion vom Java -Compiler in diese vier Anweisungen zusammengestellt wurde. Wenn die where () -Methode aufgerufen wird, sieht Jinq diese. Wie kann Jinq diesen Code verstehen?
Jinq wird durch Ausführung von Code analysiert. Aber Jinq führt den Code nicht direkt aus. Es handelt sich um einen "abstrakten" Betriebscode: Ohne reale Variablen und reale Werte verwendet JINQ Symbole, um alle Werte beim Ausführen von Code anzuzeigen. Aus diesem Grund wird diese Analyse als "symbolische Ausführung" bezeichnet.
Jinq führt jede Anweisung aus und verfolgt alles, was alle Nebenwirkungen oder Code während des Programmstatus ändert. Das Folgende ist ein Diagramm, in dem alle Nebenwirkungen angezeigt werden, wenn Jinq die vier Codezeilen in der symbolischen Ausführung ausführt.
Beispiel für die symbolische Ausführung
In der Abbildung können Sie feststellen, dass Jinq nach dem ersten Anweisungen zwei Nebenwirkungen entdeckt hat: Variable D hat sich geändert und der Methode Customer.getCountry () wurde aufgerufen. Da es sich um eine symbolische Ausführung handelt, gibt Variable D keinen echten Wert eines realen, wie "USA" oder "Dänemark", der einem symbolischen Wert von C.GetCountry () zugeordnet ist.
Nachdem all diese Anweisungen ausgeführt wurden, rationierte Jinq Nebenwirkungen. Da variable d und e lokale Variablen sind, werden alle Variablen nach dem Ablauf der Funktion verworfen, sodass diese Nebenwirkungen ignoriert werden können. Jinq weiß auch, dass Customer.getCountry () und String.equals () keine Variablen ändern oder Ausgaben anzeigen, sodass diese Methoden ignoriert werden können. Infolgedessen kann Jinq zu dem Schluss kommen, dass diese Funktion nur eine Rolle erzeugt und C.GetCountry () entspricht ("Belgien").
Sobald Jinq die an der Where () -Methode übergebenen Funktionen verstanden hat, kann das Wissen über Datenbankabfrage mischen und eine neue Datenbankabfrage in der Kundensammlung vermitteln.
Datenbankabfrage erstellen
So generiert Jinq eine Datenbankabfrage aus Ihrem Code. Die Verwendung symbolischer Ausführung bedeutet, dass diese Methode für verschiedene Codemodi aus verschiedenen Java -Compilern ziemlich leistungsfähig ist. Wenn der von Jinq aufgetretene Code die Nebenwirkungen hat, die nicht in eine Datenbankabfrage konvertiert werden können, hält JINQ Ihren Code unverändert. Da alles im normalen Java -Code geschrieben ist, kann Jinq diesen Code direkt ausführen und Ihr Code erzeugt die erwarteten Ergebnisse.
In diesem einfachen Übersetzungsbeispiel sollten Sie verstehen, wie die Übersetzungen abfragen. Sie können sicher sein, dass diese Algorithmen Datenbankabfragen aus Ihrem Code korrekt generieren können.
Schöne Aussicht
Ich hoffe, ich habe Sie eine neue Art der Datenbankarbeiten probieren lassen, die Java 8 in Java mitgebracht hat. Mit der von Java 8 unterstützten funktionalen Programmierung können Sie Code für die Datenbank schreiben, um Code für die Java -Sammlung zu schreiben. Es ist zu hoffen, dass die vorhandene Datenbank -APIs erweitert werden, um diese Arten von Abfragen zu unterstützen.