diff --git a/website/assignments/Container-CI_CD.md b/website/assignments/Container-CI_CD.md index b5fb8ee37bea3566ba5e4406573b9e5241d7ef2c..d0d88547f0d1d01b780f87c697f0404a5d0c1d61 100644 --- a/website/assignments/Container-CI_CD.md +++ b/website/assignments/Container-CI_CD.md @@ -1,4 +1,4 @@ -# Ãœbungen Software-Entwicklung 3: Build Management & Testing +# Ãœbungen Software-Entwicklung 3: Container, CI/CD ## Ausgangslage In der Vorlesung wurde die Container-Technologie (Docker) als auch die Prinzipien von Continuous Integration/Continuous Deployment vorgestellt. Mit Hilfe con GitLab sollen Sie nun diese Prinzipien in Ihrem Projekt anwenden. Voraussetzung dafür ist, dass sie Ihr Projekt mit Hilfe eines Buildmangementtools (z.B. `maven`) per Kommandozeile bauen, testen und paketieren können. diff --git a/website/assignments/bewertungsbogen.xlsx b/website/assignments/bewertungsbogen.xlsx index 11e439cd7eb2f5397d2724708950b306e951883e..6c9225c770a67f56f72236a67395e0340e0678da 100644 Binary files a/website/assignments/bewertungsbogen.xlsx and b/website/assignments/bewertungsbogen.xlsx differ diff --git a/website/assignments/sql-nosql.md b/website/assignments/sql-nosql.md new file mode 100644 index 0000000000000000000000000000000000000000..a817aa189960166085400296b21e357410eebd8c --- /dev/null +++ b/website/assignments/sql-nosql.md @@ -0,0 +1,16 @@ +# Ãœbungen Software-Entwicklung 3: SQL, NoSQL + +## Ausgangslage +Die in der Vorlesung vorgestellten Persistenz-Möglichkeiten SQL bzw. NoSQL sollen nun in Ihr Projekt integriert werden. + +## Aufgabe +* Entscheiden Sie sich, welches Datenbankprinzip besser für Ihren Anwendungsfall geeignet ist. +* Erstellen Sie eine Komponente, die für die Persistenz Ihrer Daten zuständig ist. +* Erstellen Sie die geeigneten `CRUD`-Operationen. + +## Tipps +* Nutzen Sie einen Docker-Container um das Datenbanksystem einheitlich in Ihrem Team zugreifbar zu machen. +* IntelliJ kann Sie bei der Datenbankentwicklung unterstützen: [Ãœbersichtsvideo für SQL-DBMS](https://www.youtube.com/watch?v=BOoJQhDVcWg) + +## Ziele +* Ihr Projekt verfügt über eine gekapselte Persistenzschicht, die die notwendigen Daten speichern, lesen, ändern und löschen kann. \ No newline at end of file diff --git a/website/container-ci-cd.html b/website/container-ci-cd.html index 876573b915113f54e4a5fd3f2abd72adad85c3ee..d530dec04c57ce7ae4ada84cfc292d1cfae85513 100644 --- a/website/container-ci-cd.html +++ b/website/container-ci-cd.html @@ -293,7 +293,7 @@ _nach ["What is Continuous Deployment?", AWS, 2022](https://aws.amazon.com/devop * Automatisches Veröffentlichen der Software auf einer Testumgebung * Unterschied zu Continuous Deployment * Continuous Deployment: Automatische Veröffentlichung auf Produktionsumgebung - * Continuous Deployment: Manuelle Veröffentlichung inkl. Freigabe auf Produktionsumgebung + * Continuous Delivery: Manuelle Veröffentlichung inkl. Freigabe auf Produktionsumgebung --- # Was ist Continuous Deployment? diff --git a/website/img/sql-nosql/sql-nosql.png b/website/img/sql-nosql/sql-nosql.png new file mode 100644 index 0000000000000000000000000000000000000000..88126d54ea5de68e3ab9ba9feea0fba7124c8be6 Binary files /dev/null and b/website/img/sql-nosql/sql-nosql.png differ diff --git a/website/index.html b/website/index.html index 5750f0e0a9de669d5a2d3f5e3537de9111dc9ba1..c84045d506d1b050cab2df8f8b6c348bfc8fafd0 100644 --- a/website/index.html +++ b/website/index.html @@ -16,6 +16,7 @@ <li><a href="clean-code_doku_git.html" target="_blank">git, Dokumentation, Clean Code</a></li> <li><a href="maven-testing.html" target="_blank">Maven & Testing</a></li> <li><a href="container-ci-cd.html" target="_blank">Container & CI/CD</a></li> + <li><a href="sql-nosql.html" target="_blank">SQL, NoSQL</a></li> </ul> <h3>Vorlesungnotizen</h3> @@ -25,6 +26,7 @@ <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/lecturenotes/20220404.md" target="_blank">Vorlesungsnotizen - 04.04.2022</a></li> <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/lecturenotes/20220411.md" target="_blank">Vorlesungsnotizen - 11.04.2022</a></li> <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/lecturenotes/20220509.md" target="_blank">Vorlesungsnotizen - 09.05.2022</a></li> + <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/lecturenotes/20220516.md" target="_blank">Vorlesungsnotizen - 16.05.2022</a></li> </ul> <h3>Projekt</h3> @@ -39,6 +41,7 @@ <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/assignments/git-Doku-CleanCode.md" target="_blank">Ãœbung: git, Dokumentation, Clean Code</a> </li> <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/assignments/Maven-Testing.md" target="_blank">Ãœbung: Build Management & Testing</a> </li> <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/assignments/Container-CI_CD.md" target="_blank">Ãœbung: Container & CI/CD</a> </li> + <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/assignments/sql-nosql.md" target="_blank">Ãœbung: SQL, NoSQL</a> </li> </ul> <h3>Organisatorisches</h3> diff --git a/website/lecturenotes/20220516.md b/website/lecturenotes/20220516.md new file mode 100644 index 0000000000000000000000000000000000000000..2b3158ff8b75879814b7f35d9986bba0d05ef7c7 --- /dev/null +++ b/website/lecturenotes/20220516.md @@ -0,0 +1,7 @@ +# Vorlesungsnotizen - 16.05.2022 + +## CI/CD + +## SQL + +## (NoSQL) \ No newline at end of file diff --git a/website/sql-nosql.html b/website/sql-nosql.html new file mode 100644 index 0000000000000000000000000000000000000000..f47936ee3b9cc79d637fb974e4c2852da4a622fc --- /dev/null +++ b/website/sql-nosql.html @@ -0,0 +1,404 @@ +<!DOCTYPE html> +<html> + <head> + <title>SQL, NoSQL</title> + <meta charset="utf-8"> + <link href="css/hdm.css" rel="stylesheet"></link> + <style> + /* yanone-kaffeesatz-regular - latin */ + @font-face { + font-family: 'Yanone Kaffeesatz'; + font-style: normal; + font-weight: 400; + src: url('fonts/yanone-kaffeesatz-v22-latin-regular.eot'); /* IE9 Compat Modes */ + src: local(''), + url('fonts/yanone-kaffeesatz-v22-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('fonts/yanone-kaffeesatz-v22-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('fonts/yanone-kaffeesatz-v22-latin-regular.woff') format('woff'), /* Modern Browsers */ + url('fonts/yanone-kaffeesatz-v22-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('fonts/yanone-kaffeesatz-v22-latin-regular.svg#YanoneKaffeesatz') format('svg'); /* Legacy iOS */ + } + /* noto-serif-regular - latin */ + @font-face { + font-family: 'Noto Serif'; + font-style: normal; + font-weight: 400; + src: url('fonts/noto-serif-v20-latin-regular.eot'); /* IE9 Compat Modes */ + src: local(''), + url('fonts/noto-serif-v20-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('fonts/noto-serif-v20-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('fonts/noto-serif-v20-latin-regular.woff') format('woff'), /* Modern Browsers */ + url('fonts/noto-serif-v20-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('fonts/noto-serif-v20-latin-regular.svg#NotoSerif') format('svg'); /* Legacy iOS */ + } + /* ubuntu-mono-regular - latin */ + @font-face { + font-family: 'Ubuntu Mono'; + font-style: normal; + font-weight: 400; + src: url('fonts/ubuntu-mono-v14-latin-regular.eot'); /* IE9 Compat Modes */ + src: local(''), + url('fonts/ubuntu-mono-v14-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('fonts/ubuntu-mono-v14-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('fonts/ubuntu-mono-v14-latin-regular.woff') format('woff'), /* Modern Browsers */ + url('fonts/ubuntu-mono-v14-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('fonts/ubuntu-mono-v14-latin-regular.svg#UbuntuMono') format('svg'); /* Legacy iOS */ + } + /* ubuntu-mono-italic - latin */ + @font-face { + font-family: 'Ubuntu Mono'; + font-style: italic; + font-weight: 400; + src: url('fonts/ubuntu-mono-v14-latin-italic.eot'); /* IE9 Compat Modes */ + src: local(''), + url('fonts/ubuntu-mono-v14-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('fonts/ubuntu-mono-v14-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('fonts/ubuntu-mono-v14-latin-italic.woff') format('woff'), /* Modern Browsers */ + url('fonts/ubuntu-mono-v14-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('fonts/ubuntu-mono-v14-latin-italic.svg#UbuntuMono') format('svg'); /* Legacy iOS */ + } + /* ubuntu-mono-700 - latin */ + @font-face { + font-family: 'Ubuntu Mono'; + font-style: normal; + font-weight: 700; + src: url('fonts/ubuntu-mono-v14-latin-700.eot'); /* IE9 Compat Modes */ + src: local(''), + url('fonts/ubuntu-mono-v14-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('fonts/ubuntu-mono-v14-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ + url('fonts/ubuntu-mono-v14-latin-700.woff') format('woff'), /* Modern Browsers */ + url('fonts/ubuntu-mono-v14-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ + url('fonts/ubuntu-mono-v14-latin-700.svg#UbuntuMono') format('svg'); /* Legacy iOS */ + } + + body { font-family: 'Noto Serif'; } + h1, h2, h3 { + font-family: 'Yanone Kaffeesatz'; + font-weight: normal; + } + .remark-code, .remark-inline-code { font-family: 'Ubuntu Mono'; } + </style> + </head> + <body> + <textarea id="source"> +class: center, middle, first + +# Software-Entwicklung 3 + +## Persistenz: SQL, NoSQL + +--- + +# Agenda + +1. Recap +2. SQL +3. NoSQL + +* Was ist Persistenz? +* Welche Persistenzarten gibt es? +* Warum gibt es unterschiedliche Persistenzarten? +* Was sind die Probleme zwischen OO und SQL-Datenbanken? +* Was ist SQL? +* Was sind Einsatzszenarien für SQL-DBs? +* Was ist JDBC? +* Warum sollte man `PreparedStatement`s einsetzen? +* Umgang mit (m:n-)Beziehungen +* Wie sehen CRUD-Operationen mit JDBC aus? +* Was ist NoSQL? +* Beispiele für NoSQL-DBs + * MinIO, S3 kompatibel +* Was sind Einsatzszenarien für NoSQL-DBs? +* Wie sehen CRUD-Operationen mit MongoDB aus? +* Tipps zur Entwicklung + * Arbeit mit Demo-Daten. Demo-Daten Erzeugung. + * Docker-Container mit DB + * SQL Inspect mit IntelliJ +* Kurz-Ausblick auf JPA + +--- + +# Recap: Was haben wir in der letzten Vorlesung besprochen? + +* Container +* CI/CD + +> Blick ins [Repository](https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022projekt) + +--- +class: center, middle +# Was ist Persistenz? + +??? + +* Daten über längere Zeit bereitstellen +* Benötigt: Nichtflüchtiges Speichermedium +* Auch nach Programmabbruch müssen die Daten wieder zur Verfügung stehen + +--- +class: center, middle +# Warum gibt es unterschiedliche Persistenzarten? + +??? + +* Performance +* Zugriffsarten +* Zugriffssteuerung +* Transaktionssteuerung +* Unterschiedliche Anforderungen an Verfügbarkeit, Integrität, Verlässlichkeit +--- +# Was sind die Probleme zwischen OO und SQL-Datenbanken? + +> Impedance Mismatch + +* Datenbanken arbeiten **blockorientiert** +* OO-Programme arbeiten **satzorientiert** + +**Ãœbersetzung der Paradigmen notwendig! âž¡ï¸ ORM (Objekt-relationales Mapping)** + +--- +# Basiskonzepte OO & relationale DBMS + +## OO +* Identität +* Zustand +* Verhalten +* Kapselung + +## relationale DBMS +* Relationen +* Tupel +* Attribute + +--- +# Was ist SQL? + +* Standard, der von relationalen DBMS (_Datenbankmanagementsysteme_) implementiert wird +* Datenbanksprache für relationale DBs, bestehend aus: + * Daten einfügen, ändern, löschen: **DML** _(Data Modification Language)_ + * Daten abfragen inkl. sortieren, filtern, gruppieren etc.: **DQL** _(Data Query Language)_ + * Datenschemas definieren: **DDL** _(Data Definition Language)_ + * Verwalten von DB-Rechten: **DCL** _(Data Control Language)_ + * Transaktionssteuerung: **TCL** _(Transaction Control Language)_ + +--- +# Was sind Einsatzszenarien für relationale DBMS? + +* Struktur der Daten bekannt +* Redundanzen und Inkosistenzen sollen vermieden werden +* Transaktionen benötigt +* ... + +--- +# Was ist JDBC + +**Java Database Cennectivity** + +* API zum Zugriff auf relationale DBMS + +* Herstellerunabhängig + +* Treiber für jeweiliges DBMS notwendig + +--- +# Was sind `PreparedStatement`s? + +* Vorkompilierte Datenbankanweisungen + +* Höhere Performance als "normale" DB-Anweisungen + +* Mehr Sicherheit, da Typprüfung stattfindet + +```java +// Alle nachfolgenden Statements beziehen sich auf MariaDB +// Der vollständige Verbindungsaufbau findet sich im Vorlesungsprojekt +// ... +PreparedStatement ps = conn.prepareStatement( + "SELECT title FROM Audiotracks WHERE artist=? AND album=?"); + +ps.setString(1, "Glass Animals"); +ps.setString(2, "Dreamland"); +ResultSet rs = ps.executeQuery(); +// ... +``` +--- +# CRUD mit JDBC: CREATE + +```java +// ... +PreparedStatement ps = conn.prepareStatement( + "INSERT INTO Audiotracks (title, path, duration, + artist, album) VALUES(?, ?, ?, ?, ?) + RETURNING id"); + +ps.setString(1, "Heat Waves"); +ps.setString(2, "audio/heat_waves.mp3"); +ps.setTime(3, Time.valueOf(LocalTime.parse("00:03:14"))); +ps.setString(4, "Glass Animals"); +ps.setString(5, "Dreamland"); +ResultSet rs = ps.executeQuery(); +if (rs.next()){ + int dbId = rs.getInt("id"); +} +// ... +``` +--- +# CRUD mit JDBC: READ + +```java +// ... +PreparedStatement ps = conn.prepareStatement( + "SELECT title FROM Audiotracks WHERE artist=? AND album=?"); + +ps.setString(1, "Glass Animals"); +ps.setString(2, "Dreamland"); +ResultSet rs = ps.executeQuery(); +while(rs.next()){ + System.out.println(rs.getString(1)); +} +// ... +``` +--- +# CRUD mit JDBC: UPDATE + +```java +// ... +PreparedStatement ps = conn.prepareStatement( + "UPDATE Audiotracks SET album = ? WHERE album = ?;"); + +ps.setString(1, "Dreamland"); +ps.setString(1, "DREAMLAND"); +ps.execute(); +// ... +``` +--- +# CRUD mit JDBC: DELETE + +```java +// ... +PreparedStatement ps = conn.prepareStatement( + "DELETE FROM Audiotracks WHERE album = ?;"); + +ps.setString(1, "Dreamland"); +ps.execute(); +// ... +``` +--- +# Umgang mit Objektbeziehungen + +Hintergrund: Wie können Objektbeziehungen abgebildet werden? + +```java +class AudioTrack{ + // ... + private Artist artist; +} +``` +Schritte in der DB (ggf. mit Transaktion): +1. Erzeugen eines `Artist`-Eintrags mit `INSERT` inkl. Rückgabe der erzeugten ID mit `RETURNING` +2. Speichern der zurückgegebenen ID im `Artist`-Objekt +3. Erzeugen eines `Audiotrack`-Eintrags mit `INSERT`. Setzen der Fremdschlüssel ID auf zuvorgespeicherte `Artist`-ID. + +--- +# Ausblick: JPA + +**Jakarta Persistence API**/**Java Persistence API** + +* Vereinfachung des ORM + +* POJOs (_Plain old Java Objects_) können automatisch zu Tabellen gemappt werden + +* Möglichkeiten, Objektbeziehungen zu beschreiben und autmatisiert aufzulösen + +--- +# Was ist NoSQL? + +**NoSQL = Not only SQL** + +* Sammelbegriff für unterschiedliche Datenbankentypen +* Oft horizontal skalierbar + +## NoSQL-Datenbanktypen +* Dokumenten-DBs: z.B. MongoDB, BaseX, CouchDB +* Graph-DBs: Neo4j +* Key-Value-DBs: Redis +* ... + +--- +# Einsatzszenarien + +_[Wikipedia, 2022](https://de.wikipedia.org/w/index.php?title=NoSQL&oldid=220335513), nach [Scofield, B., 2010](http://www.slideshare.net/bscofield/nosql-codemash-2010)_ + +<img src="img/sql-nosql/sql-nosql.png" width="100%" alt="Vergleich DBMS"> + +--- +# CRUD mit MongoDB: CREATE + +_nach: https://www.mongodb.com/developer/quickstart/java-setup-crud-operations/_ + +```java +//... +Document audioTrack = new Document("_id", new ObjectId()); +audioTrack.append("title", "Heat Waves") + .append("path", "audio/heat_waves.mp3") + .append("duration", "00:03:14") + .append("artist", "Glass Animals") + .append("album", "Dreamland"); + +audioTracksCollection.insertOne(audioTrack); +//... +``` +--- +# CRUD mit MongoDB: READ + +```java +//... +Document audioTrack = audioTracksCollection.find( + new Document("audiotrack_id", 10000)).first(); +System.out.println(audioTrack.toJson()); +//... +``` +--- +# CRUD mit MongoDB: UPDATE + +```java +import static com.mongodb.client.model.Filters.and; +import static com.mongodb.client.model.Filters.eq; +import static com.mongodb.client.model.Updates.*; +//... +Bson filter = eq("audiotrack_id", 10000); +Bson updateOperation = set("album", "DREAMLAND"); +UpdateResult updateResult = audioTracksCollection. + updateOne(filter, updateOperation); + +System.out.println(audioTracksCollection.find( + filter).first().toJson(prettyPrint)); +System.out.println(updateResult); +//... +``` +--- +# CRUD mit MongoDB: DELETE + +```java +import static com.mongodb.client.model.Filters.eq; +//... +Bson filter = eq("audiotrack_id", 10000); +DeleteResult result = gradesCollection.deleteOne(filter); +System.out.println(result); +//... +``` +--- +# Tipps + +* Skripte zum befüllen der DB mit Demodaten bereitstellen +* Docker-Container mit DB +* SQL Inspect mit IntelliJ + + </textarea> + <script src="js/remark.min.js"> + </script> + <script> + var slideshow = remark.create(); + </script> + </body> +</html> \ No newline at end of file