5. 2021-10-12, Di.


5.1. Einteilung Mikroprojekte
-
Abazović Edina
-
Ablinger Raphael
-
Aichinger Niklas
-
Baumgartner Lukas
-
Bogdan Sebastijan
-
Handel Christoph
-
Hartl Anna
-
Hautzmayer Sheila
-
Hirsch Nico
-
Keintzel Florian
-
Kerschbaum Philipp
-
König Julia
-
Melcher Tamara
-
Neudorfer Niklas
-
Pavelescu Darius-Cristian
-
Pelzeder Joachim
-
Plakolb Marcel
-
Rathberger Jakob
-
Remplbauer Markus
-
Sugic Oliver
-
Tran Michael
-
Tunc Johannes
9. 2021-11-08
9.1. Mögliche Fragen:
-
Welche Möglichkeiten gibt es, ein Quarkus Projekt zu erstellen?
-
Assistent auf quarkus.io
-
Assistent in IDE (zB IntelliJ)
-
Aufruf mit mvn
-
-
Strategien zum Erzeugen von Primärschlüsselwerten?
-
TABLE
-
SEQUENCE
-
IDENTITY
-
-
Wie kann man eine Testklasse für eine beliebige Klasse erstellen?
-
Cursor auf Klassenbezeichnung
-
Rechte Maustaste
-
Create Test
-
-
Was bewirkt die Annotation
@QuarkusTest
?
9.3. Startup
-
Die Methode init() wird sofort nach Start der Applikation ausgeführt (vglbar mit main()-Methode)
-
Die init()-Methode kann beliebig benannt werden
package at.htl.carrental.control;
import at.htl.carrental.entity.Person;
import io.quarkus.runtime.StartupEvent;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
@ApplicationScoped
public class InitBean {
@Inject
PersonRepository personRepository;
void init(@Observes StartupEvent event) {
Person p = new Person("Susi");
personRepository.save(p);
}
}
9.4. Automatisches Befüllen der Tabelle mit IMPORT.sql
-
in Ordner
src/main/resources/
eine Dateiimport.sql
erstellen:src/main/resources/import.sql
-
INSERTs einfügen
-
beim nächsten Start der App werden die INSERTs ausgeführt
9.5. NamedQueries
-
2 Varianten
-
JP-QL
-
Criteria API (verwenden wir NICHT)
-
@Entity
@NamedQueries({
@NamedQuery(
name = "Person.findAll",
query = "select p from Person p"
)
})
public class Person {
//...
}
-
JP-QL ist vergleichbar mit SQL
-
jedoch werden i.N. keine SPalten angegeben, da nur ganze Objekte zurückgegeben werden.
-
die Rückgabe von Spalten ist sehr wohl möglich
-
Joins und Aggregationen sind ebenfalls möglich
10. 2021-11-09
10.1. Ausführen einer NamedQuery
@Test
void getAllPersons() {
TypedQuery<Person> query = em
.createNamedQuery("Person.findAll",Person.class);
List<Person> persons = query.getResultList();
assertThat(persons.size()).isEqualTo(8);
logger.info(persons);
}
10.2. Ausführen einer Query
@Test
void getAllPersonsWithQuery() {
TypedQuery<Person> query = em
.createQuery("select p from Person p",Person.class);
List<Person> persons = query.getResultList();
assertThat(persons.size()).isEqualTo(8);
logger.info(persons);
}
10.3. Ausführen einer NativeQuery
-
Es gibt auch hier
-
NativeQuery
-
NativeNamedQuery
-
@Test
void getAllPersonsWithNativeQuery() {
Query query = em
.createNativeQuery("select p.id, p.name from person p");
List<Object[]> persons = query.getResultList();
for (Object[] elem : persons) {
System.out.println(elem[0] + " " + elem[1]);
}
assertThat(persons.size()).isEqualTo(9);
}
10.4. Mikroprojekte-Themen
Name | Thema |
---|---|
Abazović Edina |
Stadtrundfahrten |
Ablinger Raphael |
Linienbusunternehmen inkl. Fahrplan |
Aichinger Niklas |
Supermarkkt |
Baumgartner Lukas |
Teehändler |
Bogdan Sebastijan |
Friedhofsverwaltung |
Handel Christoph |
Schuhplattln |
Hartl Anna |
Gärtnerei |
Hautzmayer Sheila |
Tanzverein |
Hirsch Nico |
Rezeptseite |
Keintzel Florian |
Hotel |
Kerschbaum Philipp |
Fussballverein |
König Julia |
Tennisverein |
Melcher Tamara |
Kletterverein mit Kletterrouten |
Neudorfer Niklas |
Gebäudeverwaltung (wo sind welche Geräte installiert zB Chromecasts) |
Pavelescu Darius-Cristian |
Musikdatenbank |
Pelzeder Joachim |
Personaleinteilung in Produktonsbetrieb mit Schichten (es wird durchgehend produziert) |
Plakolb Marcel |
Luftfahrtlinie (Wo fliegen die Flugzeuge, Linien) |
Rathberger Jakob |
Doodle |
Remplbauer Markus |
Modellagentur |
Sugic Oliver |
Schwimmverein |
Tran Michael |
Restaurant (Tischreservierung) |
Tunc Johannes |
Reisebüro |
10.5. Übung
-
Erstellen eines Datenmodell in plantuml (3-5 Entitäten)
-
Publishen zu gh-pages
-
Zusätzlich eine kurze Erklärung für die Anwendung
-
Termin: 11.11.2021
-
Ordner im Root-Folder: asciidocs, backend, frontend
-
Erstellen eines Quarkus-Projekts mit einer Tabelle, persisitert in eine postgre-db und einem Endpoint
10.6. Erstellen einer aggregierten Abfrage
10.6.1. Schritt 1: Sql-Query
select substr(name,1,1), count(*)
from person
group by substr(name,1,1)
order by 1;
10.6.2. Schritt 2: Übertragen nach Java
@Test
void countLetters() {
Query query = em.createQuery("select substring(p.name,1,1), count(p) from Person p group by substring(p.name,1,1)");
List<Object[]> list = query.getResultList();
for (Object[] elem : list) {
logger.info(elem[0] + " - " + elem[1]);
}
assertThat(list.size()).isEqualTo(8);
}
11. 2021-11-16
11.2. Aggregated Queries
package at.htl.carrental.entity;
import javax.persistence.*;
@Entity
@NamedQueries({
@NamedQuery(
name = "Person.countByInital",
query = "select substring(p.name,1, 1), count(p) from Person p group by substring(p.name,1, 1)"
)
})
public class Person {
// ...
}
@ApplicationScoped
public class PersonRepository {
@Inject
EntityManager em;
// ...
public Map<Character, Integer> countByInitial() {
Map<Character, Integer> result = new HashMap<>();
Query query = em
.createNamedQuery("Person.countByInital");
List<Object[]> initials = query.getResultList();
for (Object[] initial : initials) {
result.put(
initial[0].toString().charAt(0),
Integer.parseInt(initial[1].toString())
);
}
return result;
}
}
@QuarkusTest
class PersonTest {
// ...
@Test
void countLetters() {
Query query = em.createQuery("select substring(p.name,1,1), count(p) from Person p group by substring(p.name,1,1)");
List<Object[]> list = query.getResultList();
for (Object[] elem : list) {
logger.info(elem[0] + " - " + elem[1]);
}
assertThat(list.size()).isEqualTo(8);
}
}
14. 2021-12-13 Panache - Persistence Context

-
Befindet sich ein Java-Objekt im Persistence Context, so hat es den Status "Managed"
-
Ein Objekt kann den Zustand "managed" durch den Aufruf von persist() erhalten
-
aber auch durch ein Holen des Objekts (Methode find()) aus der DB
-
wichtig ist dabei, dass eine Transaktion aktiv ist
-
Entweder Verwendung einer UserTransaction (mit tx.begin() und tx.commit())
-
oder Verwendung von @Transactional
-
-
-
Im Persistence Context kann man automatisch DB-Aktionen an abhängige Objekte weitergeben (zB cascading persist, …)
16. 2021-12-21
16.3. Übung: Validierung und Qute im Microproject
-
Einbinden von Validation und Qute ins Mikroprojekt
-
zb Bei Validation:
-
nicht alle (Entity-)Klassen müssen validiert werden.
-
es sind allerdings die Konzepte aus dem Tutorial zu verwenden, zB
-
vorgefertigte Validatoren
-
Erstellung eines eigenen Validators
-
-
-
Es ist ein asciidoc-File zu erstellen (im Ordner asciidocs), in dem die Arbeiten dokumentiert werden.
-
vergleichbar mit den Lecture (pro Datum ein Kapitel) ist auch in diesen adoc-File für jede Technologie (Übung) eine kurze Doku zu erstellen (Cheat Sheet)
-
Warum benötige ich das? (Einsatzzweck)
-
Ev. die Alternativen anführen
-
Möglichkeiten der Anwendung (Code im Microproject kurz erklärt)
-
-
diese Asciidocs sollen automatisch als gh-pages dargestellt werden
-




17. 2021-12-23
18. Qute

-
Beispiel
-
In der Klasse StudentResource sind die Qute-Template typisiert deklariert.
-
Wird im Browser die jeweilige Route des Qute-Templates aufgerufen, liefert der Server die das gerenderte Template als html aus
-
Der User kann nun zB ein Formular ausfüllen.
-
Nach dem Klicken auf den Submit Button, werden die Inhalte der Formularfelder an den im Form-Attribut "action" angegeben REST-Endpoint übermittelt.
-
Dieser REST-Endpoint gibt nun die neue Route jener Seite, die als nächstes angezeigt wird, an den Browser zurück
-
19. 2022-01-11
19.1. Quarkus Security
19.1.1. Hausübung
-
Using Security with .properties File: https://quarkus.io/guides/security-properties
-
Using Security wit JDBC: https://quarkus.io/guides/security-jdbc
19.1.2. Besprochen
Wir haben über Security mithilfe von Keycloak gesprochen: https://www.keycloak.org/downloads
-
Kleine mini quarkus Anwendung die geschützt werden (z.B.: nur rest teil)
-
User haben Rollen -→ Rollen geben einen User gewisse Rechte, die er machen darf.
20. 2022-01-17
-
assert: stelle sicher, Zusicherung
Einzelne Programmbestandteile werden definiert, eventuell sogar direkt geschrieben. Aus diesen Teilen werden dann größere Elemente des Programms zusammengesetzt, bis das vollständige System erstellt ist.
Grundlegender Architekturüberblick (Zuerst Landkarte ⇒ z.B.: Wo muss Technologie hin?)
Daten zwischen Komponenten austauschen mit z.B.: Delete, Patch, Put, Get, Post
Daten über Daten. Z.B.: Datentyp, Autowert, …
Daten sind rohe, unorganisierte, zusammenhangslose Fakten.
-
Informationen entstehen aus Daten
-
Daten werden verwendet zur Problemlösung, dann werden diese Daten zu Informationen
-
Wenn man Daten verarbeitet, organisiert, strukturiert oder in bestimmten Kontext stellt
Mit mathematischen Methoden Zusammenhänge zwischen Daten ermitteln. Z.B.: Wenn man Bier kauft, kaufen viel auch Chips ⇒ daher sind meistens Bier und Chips in unmittelbarer Nähe von einander
Nicht zu viele Tests, aber auch nicht zu wenige Tests.
-
assertj
-
myBatis
-
jdbc