Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Java EE 7 Grundkurs

Datenabfragen ausführen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Die JPA dient dazu, Datensätze abzurufen und diese zu manipulieren. Dabei stehen verschiedene Operationen sowie die Java Persistence Query Language als Abfragesprache zur Verfügung.

Transkript

In diesem Video werden wir uns damit befassen, wie die JPA in der Praxis funktioniert. Wir werden eine kleine Applikation auf ihrem Weg von einer nicht-datenbankgebundenen Applikation zu einer datenbankgebundenen Applikation begleiten. Wir sehen hier eine Webapplikation. Diese Webapplikation, das ist eine JSF-Applikation erlaubt es uns, Bücher anzulegen und eine Liste von Büchern einzusehen. Ich gebe einmal einen Titel, ein Jahr, und eine fiktive ISBN-Nummer an und klicke auf den Button Hinzufügen. Jetzt kann ich noch ein zweites Buch angeben. und klicke noch einmal die Schaltfläche Hinzufügen. Nun kann ich mir eine Liste der Bücher anzeigen, und Sie sehen, die Bücher sind vorgehalten. Allerdings ist das Ganze im Moment alles nur in Memory gelöst. Es gibt hier nämlich eine Klasse "BookHandler", die wird eingebunden von den JSF-Facelets, und hier gibt es die Methoden "createBook" in der das Buch, was ich gerade erzeuge, einer privaten ArrayList hinzugefügt wird. und "getBooks", in der diese ArrayList zurückgegeben wird. Das einzelne Buch wird abgebildet über die "Book"-Klasse. Diese "Book"-Klasse definiert einige Felder. und die entsprechenden Getter und Setter. Für uns interessant ist nun: Wie kann ich es schaffen, das Ganze in die Datenbank anzubinden? Zunächst verwandle ich das Buch in eine Entität. Ich füe zu diesem Zweck die "Entity"-Annotation aus dem JavaX Persistence Package hinzu. Nun benötige ich zwingend auch eine ID-Annotation. Die definiere ich oberhalb des privaten Feldes "id". Auch das liegt im JavaX Persistence Package. Nun kann ich noch angeben, welche Generierungstrategie verwendet wird. Das mache ich über die GeneratedValue-Annotation. Und die verfügt über eine Eigenschaft "strategy" und da kann ich sagen, welcher Generierungstyp benutzt werden soll. Wir haben unter der Haube eine MySQL-Datenbank, deswegen entscheide ich mich für "IDENTITY". Bevor wir fertig sind, mit der Klasse "Book", ist es nötig, dass wir uns noch einmal ganz kurz Gedanken darüber machen, ob die Datenbanktabelle in die Bücher geschrieben werden, wirklich "Book" heißt. In unserem Fall ist dies nicht der Fall. Die Datenbanktabelle heißt "books". Dies müssen wir angeben. Und dafür verwenden wir die table-Annotation aus dem JavaX Persistence Package. Diese verfügt über eine Eigenschaft "name" und hier kann ich den Namen der zu verwendenden Datenbanktabelle angeben. Sobald dies erledigt ist, ist diese Entität fertig erstellt. Nun können wir uns dem "BookHandler" zuwenden. Dieser speichert ja die Bücher und lädt sie auch wieder. Der "BookHandler" selber ist in dieser Applikation ein Bestandteil der Controller-Logik. Das bedeutet, in einer JSF-Applikation ist diese Klasse immer noch Bestandteil der Frontend-Logik. Das Speichern von Komponenten findet üblicherweise allerdings über eine Datenlogik statt. Und die wird in aller Regel im Java EE- Umfeld über EJBs geregelt. Aus diesem Zweck gibt es die Klasse "BookManager". Diese Klasse "BookManager" ist eine EJB-Komponente. Und hier lassen wir uns jetzt den EntityManager injizieren. Zu diesem Zweck legen wir eine private Member-Variable vom Typ "EntityManager" aus dem JavaX Persistence Package an. An dieser Variablen deklarieren wir, dass dieser "EntityManager" der sogenannte PersisteneceContext ist. Diese Information ist sehr wesentlich, denn damit wird die ganze JPA aktiv geschaltet. Nun kann der "BookManager" die entsprechenden Methoden bekommen, die wir benötigen, um eine Entität zu speichern und eine Entität, beziehungsweise eine Liste von Entitäten wieder zu laden. Definieren wir zunächst einmal die Speicherfunktionalität. Das ist eine Methode, die das zu speichernde Buch dann auch gleich wieder zurückgibt, falls man es weiter verarbeiten möchte. Wir nennen sie "save" und wir bekommen hier eine "Book"-Instanz herein übergeben. Das ist die Entität, die wir deklariert haben. Das eigentliche Speichern machen wir jetzt über den EntityManager. Hier rufen wir die Methode "persist" auf und übergeben das Buch als Parameter. Anschließend geben wir die Entität wieder zurück. Sollte diese Komponente nun gespeichert worden sein, dann wird ihr beim Speichervorgang automatisch der generierte Identity-Wert zugewiesen. Das bedeutet, wenn die ID vorher null war, was ja der Standardwert für eine Zahl ist, wird sie nun den Wert eins, zwei, drei, oder was auch immer der nächste automatisch generierte Wert in der Datenbank ist, zugewiesen bekommen. Die nächste Methode ist eine Methode, die uns eine Liste von Büchern zurückgibt. Diese Methode wird heißen "getBooks". Und in dieser Methode definieren wir uns zunächst die Abfrage. Die Abfrage ist eine Query aus dem JavaX Persistence Package und sie wird definiert über den EntityManager und dessen Methode "createQuery". So eine Query-Erzeugung kann zwei Parameter entgegennehmen, nämlich die eigentliche Abfrage - die machen wir wie gesagt auf Objekten und nicht etwa auf Datenbanktabellen - und als zweiten Parameter kann sie den Typ der zurückzugebenden Klasse annehmen. Das heißt, wir geben hier an, dass es sich um eine Buch-Klasse handelt. Um eine Liste von Büchern, die wir dann zurückgeben wollen. Und dann können wir die Query schon ausführen und das Ergebnis zurückgeben. Die Ausführung machen wir über die Methode "getResultList" der Query-Klasse. Damit ist die Abfrage abgeschlossen. Und wir können diese "BookManager"-Instanz nun im "BookHandler" verwenden. Zu diesem Zweck lassen wir sie uns injizieren. Da es sich um eine EJB-Komponente handelt, verwenden wir die EJB-Annotation. Ab diesem Moment können wir auf diese private Array-Liste verzichten, weil wir ja nun mit dem "BookManager" arbeiten. Wir müssen lediglich die entsprechende Methode aufrufen. Diese heißt "save" und bekommt das zu speichernde Buch übergeben. Analog gehen wir vor beim Abrufen von Büchern. Hier rufen wir nun die Methode "getBooks" auf. Eine Bemerkung noch: Ich habe hier eine eigene Methode "cloneBook" definiert. Die müssen Sie normalerweise nicht definieren. Dies ist nur notwendig, wenn wir diese Entität auch im CDI-Kontext als RequestScoped -Identität benutzen. und sie im JSF verwenden um die Daten zu verwalten. Dadurch würde nämlich beim Speichern versucht werden, eine Proxy-Instanz herein zu übergeben und damit kann JPA nicht umgehen. Deswegen habe ich auf Ebene dieser Klasse eine Methode erzeugt, die nennt sich "cloneBook". Und hier erzeuge ich einfach anhand der eingegebenen Daten noch einmal eine saubere neue "Book"-Instanz und gebe diese zurück. Das ist wirklich nur in diesem Kontext notwendig. Normalerweise benötigen Sie so eine Vorgehensweise nicht. Damit sind wir hier eigentlich fertig. Alles was es jetzt noch zu tun gibt, ist noch einmal einen Blick auf die Datei "persistence.xml" zu werfen. In dieser Datei sind ja die Einstellungen für die JPA hinterlegt. Ganz wesentlich ist hier der Bereich Connection. Hier geben wir die Datenquelle an. Sie können theoretisch auch eine eigene Datenbankverbindung genau hier definieren, sollten dies aber im Java EE-Umfeld besser nicht tun, denn Datenquellen werden zentral auf dem Server verwaltet. Für uns interessant ist nun noch der Bereich Properties. Hier habe ich schon einmal zwei Werte hinterlegt. Zu diesen Properties ist zu sagen, dass diese Werte an das, von der JPA verwendete ORMapping-Framework, in unserem Fall ist dies Hibernate, übergeben werden. Und wir müssen Hibernate angeben, mit welcher Art von Datenbank wir arbeiten. Hibernate kann dies nämlich nicht anhand der Datenquelle bestimmen. Hibernate benutzt allerdings intern, - und deswegen ist dies nötig - sogenannte Dialekte. Diese Dialekte sind Implementierungen, die es erlauben, möglichst effizient und gut auf die jeweilige Datenbank zuzugreifen. Und deswegen geben wir Hibernate über die Eigenschaft "hibernate.dialect" an, welchen Dialekt wir verwenden wollen, nämlich den "org.hibernate.dialect.MySQLDialect". Die zweite Eigenschaft, die ich hier hinterlegt habe, indem ich auf den Button Add geklickt hatte und dann die entsprechenden Werte ausgeführt hatte, war, das Hibernate das SQL, was es intern verwendet, um die Daten und Abfragen zu generieren, anzeigt. Dadurch können wir ein bisschen besser verfolgen, was tatsächlich unter der Haube passiert. Lange Rede, kurzer Sinn, Lassen Sie uns das Beispiel einmal ausführen. Wir deployen die Applikation auf den Server, falls dies noch nicht geschehen sein sollte, Dies kann einige Sekunden dauern. Nachdem dies erfolgreich abgeschlossen ist, führen wir die Applikation aus. und legen wir ein Buch an. Wir sehen hier bereits die Abfrage, die Hibernate vorgenommen hat. Das ist das SQL-Statement, was an die Datenbank gesendet worden ist. Sie sehen übrigens auch, dass Hibernate hier parametrisierte Statements verwendet, Diese sind sicherer als Statements, in denen die eingegebenen Werte direkt enthalten sind. Wir können noch ein zweites Buch anlegen. Auch hier sehen wir jetzt wieder das SQL-Statement. Lassen Sie uns nun eine Liste der bereits gespeicherten Bücher anzeigen. Zu diesem Zweck klicke ich auf den entsprechenden Link und sehe zum einen, dass diverse Abfragen gestellt werden, Und zum anderen sehe ich, bereits hinterlegte Datensätze. Sie sehen, ich habe schon ein wenig vorgearbeitet. In diesem Video haben Sie gesehen, wie Sie Entitäten definieren können. Wir haben uns ebenfalls darüber unterhalten, wie wir Abfragen vornehmen können ud wir haben eine kleine Beispiel-Applikation so umgebaut, dass sie mit der JPA arbeitet. Das Ganze haben wir am Ende überprüft. Es war nicht sonderlich kompliziert, es waren nur einige wenige Schritte zu gehen. Aber auch hier macht wie immer Übung den Meister. Deswegen ist es notwendig, sich diese Schritte immer wieder zu vergegenwärtigen. Zuerst die Entitäten definieren und danach die Abfragen schreiben.

Java EE 7 Grundkurs

Lernen Sie die Grundlagen der Programmierung mit Java EE 7 verstehen und anwenden.

6 Std. 4 min (44 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!