-
Notifications
You must be signed in to change notification settings - Fork 0
/
die-java-db.html
48 lines (44 loc) · 18.1 KB
/
die-java-db.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!DOCTYPE html><html lang="de-ch"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Java und DBs - Finecloud</title><meta name="description" content="Java kommt von Haus aus mit einer relationalen Open-Source-Datenbank, der Apache-Derby-Datenbank, welche in reinem Java geschrieben ist und sich dadurch nicht nur als eigener Prozess betreiben lässt, sondern auch als Embeded Bestandteil einer Java Anwendung betrieben werden kann. Das ist jedoch für den produktiven Betrieb…"><meta name="generator" content="Publii Open-Source CMS for Static Site"><link rel="stylesheet" href="https://www.finecloud.ch/media/plugins/syntaxHighlighter/prism-black.css"><link rel="canonical" href="https://www.finecloud.ch/die-java-db.html"><link rel="alternate" type="application/atom+xml" href="https://www.finecloud.ch/feed.xml"><link rel="alternate" type="application/json" href="https://www.finecloud.ch/feed.json"><meta property="og:title" content="Java und DBs"><meta property="og:site_name" content="Finecloud"><meta property="og:description" content="Java kommt von Haus aus mit einer relationalen Open-Source-Datenbank, der Apache-Derby-Datenbank, welche in reinem Java geschrieben ist und sich dadurch nicht nur als eigener Prozess betreiben lässt, sondern auch als Embeded Bestandteil einer Java Anwendung betrieben werden kann. Das ist jedoch für den produktiven Betrieb…"><meta property="og:url" content="https://www.finecloud.ch/die-java-db.html"><meta property="og:type" content="article"><link rel="shortcut icon" href="https://www.finecloud.ch/media/website/finecloud.png" type="image/png"><link rel="stylesheet" href="https://www.finecloud.ch/assets/css/style.css?v=39da73365516a098a9b73b721fc970e2"><script type="application/ld+json">{"@context":"http://schema.org","@type":"Article","mainEntityOfPage":{"@type":"WebPage","@id":"https://www.finecloud.ch/die-java-db.html"},"headline":"Java und DBs","datePublished":"2022-06-28T11:16","dateModified":"2022-06-28T12:08","description":"Java kommt von Haus aus mit einer relationalen Open-Source-Datenbank, der Apache-Derby-Datenbank, welche in reinem Java geschrieben ist und sich dadurch nicht nur als eigener Prozess betreiben lässt, sondern auch als Embeded Bestandteil einer Java Anwendung betrieben werden kann. Das ist jedoch für den produktiven Betrieb…","author":{"@type":"Person","name":"Finecloud","url":"https://www.finecloud.ch/authors/finecloud/"},"publisher":{"@type":"Organization","name":"Finecloud"}}</script><meta name="google-site-verification" content="seFY9U12uiEq5U3_MyZiX6XWzk0AVFl9zITr2ZKsytY"></head><body><div class="site-container"><header class="top" id="js-header"><a class="logo" href="https://www.finecloud.ch/">Finecloud</a><nav class="navbar js-navbar"><button class="navbar__toggle js-toggle" aria-label="Menu" aria-haspopup="true" aria-expanded="false"><span class="navbar__toggle-box"><span class="navbar__toggle-inner">Menu</span></span></button><ul class="navbar__menu"><li><a href="https://www.finecloud.ch/" target="_self">Blog</a></li><li><a href="https://www.finecloud.ch/tags/" target="_self">Tags</a></li></ul></nav><div class="search"><div class="search__overlay js-search-overlay"><div class="search__overlay-inner"><form action="https://www.finecloud.ch/search.html" class="search__form"><input class="search__input js-search-input" type="search" name="q" placeholder="search..." aria-label="search..." autofocus="autofocus"></form><button class="search__close js-search-close" aria-label="Close">Close</button></div></div><button class="search__btn js-search-btn" aria-label="Search"><svg role="presentation" focusable="false"><use xlink:href="https://www.finecloud.ch/assets/svg/svg-map.svg#search"/></svg></button></div></header><main><article class="post"><div class="hero"><figure class="hero__image hero__image--overlay"><img src="https://www.finecloud.ch/media/website/download.jpg" srcset="https://www.finecloud.ch/media/website/responsive/download-xs.jpg 300w, https://www.finecloud.ch/media/website/responsive/download-sm.jpg 480w, https://www.finecloud.ch/media/website/responsive/download-md.jpg 768w, https://www.finecloud.ch/media/website/responsive/download-lg.jpg 1024w, https://www.finecloud.ch/media/website/responsive/download-xl.jpg 1360w, https://www.finecloud.ch/media/website/responsive/download-2xl.jpg 1600w" sizes="100vw" loading="eager" alt=""></figure><header class="hero__content"><div class="wrapper"><div class="post__meta"><time datetime="2022-06-28T11:16">Juni 28, 2022</time></div><h1>Java und DBs</h1></div></header></div><div class="wrapper post__entry"><div class="post__toc"><h3>Table of Contents</h3><ul><li><a href="#mcetoc_1g6kqqqii9tr">DDL</a></li><li><a href="#mcetoc_1g6kqqqii9ts">SQL</a></li><li><a href="#mcetoc_1g6kqqqii9tt">Transaktionen</a><ul><li><a href="#mcetoc_1g6kqqqii9tu">ACID-Kriterien</a></li></ul></li><li><a href="#mcetoc_1g6kr8o3v9u1">JDBC</a></li><li><a href="#mcetoc_1g6ks69ho9u3">JPA</a></li></ul></div><p>Java kommt von Haus aus mit einer relationalen Open-Source-Datenbank, der Apache-Derby-Datenbank, welche in reinem Java geschrieben ist und sich dadurch nicht nur als eigener Prozess betreiben lässt, sondern auch als Embeded Bestandteil einer Java Anwendung betrieben werden kann.</p><p>Das ist jedoch für den produktiven Betrieb nicht empfohlen. Für testgetriebene Entwicklung ist es jedoch sehr praktisch.</p><p>Eine relationale Datenbank zeichnet sich dadurch aus, das Sie eine strenge Struktur vorgibt, wie die Daten aussehen müssen. Die grösste Dateneinheit ist die Tabelle. Jede Tabelle besteht aus Spalten. Eine Spalte hat jeweils einen Namen und einen Datentyp. Der Datentyp einer Spalte kann nur aus einer vorgegebenen Liste von primitiven Datentypen gewählt werden.</p><p>Genauso wichtig wie die Tabellen selbst, sind die Beziehungen zwischen ihnen. Da eine Tabelle keine komplexen Datentypen als Spalten enthalten kann, werden Beziehungen zwischen Datenbankeinträgen durch Schlüsselbezeichnungen (Fremdschlüssel) von einer Tabelle zur anderen dargestellt. Ein Eintrag in einer Tabelle, deren Inhalt von einer anderen Tabelle abhängt, enthält dabei einen Verweis auf den Eintrag der Ursprungs-Tabelle. Dafür muss ein eindeutiger Schlüssel des übergeordneten Eintrags verwendet werden, meist ein ID-Feld, dessen einziger Zweck es ist, ein eindeutiger Schlüssel zu sein, der primary key (Primärschlüssel).</p><p>Die Datenbank kann sicherstellen, dass für diese Art von Beziehung keine fehlerhaften Werte eingetragen werden können. Wenn im Feld Kunde_ID ein Schlüssel steht, zu dem kein passender Eintrag in der Tabelle Kunde existiert, kann die Transaktion nicht abgeschlossen werden, weil die Konsistenz der Daten verletzt würde. Genauso kann ein Kunde nicht gelöscht werden, ohne dass gleichzeitig seine Bestellungen gelöscht würden, denn sonst würde zu dem nun herrenlosen Bestellungen kein Kunde existieren und wieder wäre die Konsistenz nicht mehr vorhanden. Diese Art von Beschränkungen auf den Daten einer Datenbank nennt man einen Constraint.</p><h2 id="mcetoc_1g6kqqqii9tr">DDL</h2><p>Die <em>Data Definition Language</em> wird verwendet, um die Struktur einer Datenbank anzulegen, also Tabellen, Spalten, Constraints und mehr.</p><pre class="hljs" style="color: #a9b7c6; background: #282b2e none repeat scroll 0% 0%; display: block; overflow-x: auto; padding: 0.5em;"><span class="hljs-keyword" style="color: #cc7832;">CREATE</span> <span class="hljs-keyword" style="color: #cc7832;">TABLE</span> Kunde (
<span class="hljs-keyword" style="color: #cc7832;">id</span> <span class="hljs-built_in">INTEGER</span> PRIMARY <span class="hljs-keyword" style="color: #cc7832;">KEY</span>,
vorname <span class="hljs-built_in">VARCHAR</span>(<span class="hljs-number" style="color: #6897bb;">50</span>) <span class="hljs-keyword" style="color: #cc7832;">NOT</span> <span class="hljs-literal" style="color: #6897bb;">NULL</span>,
nachname <span class="hljs-built_in">VARCHAR</span>(<span class="hljs-number" style="color: #6897bb;">75</span>) <span class="hljs-keyword" style="color: #cc7832;">NOT</span> <span class="hljs-literal" style="color: #6897bb;">NULL</span>,
strasse <span class="hljs-built_in">VARCHAR</span>(<span class="hljs-number" style="color: #6897bb;">50</span>) <span class="hljs-keyword" style="color: #cc7832;">NOT</span> <span class="hljs-literal" style="color: #6897bb;">NULL</span>,
…
);</pre><h2 id="mcetoc_1g6kqqqii9ts">SQL</h2><p>Die Structured Query Language, dient dazu, Daten in einer Datenbank zu bearbeiten und wiederzufinden. SQL ist ein extrem mächtiges Werkzeug, denn Datenbanken sind so auf das Durchsuchen grosser Datenbestände optimiert, dass sie gerade komplexe Anfragen oft schneller verarbeiten können, als eine Anwendung eine Liste im Speicher nach denselben Kriterien durchsuchen kann.</p><pre class="hljs" style="color: #a9b7c6; background: #282b2e none repeat scroll 0% 0%; display: block; overflow-x: auto; padding: 0.5em;"><span class="hljs-keyword" style="color: #cc7832;">SELECT</span> <span class="hljs-keyword" style="color: #cc7832;">SUM</span>(best.gesamtpreis)
<span class="hljs-keyword" style="color: #cc7832;">FROM</span> Bestellung best
<span class="hljs-keyword" style="color: #cc7832;">JOIN</span> Kunde k <span class="hljs-keyword" style="color: #cc7832;">ON</span> (best.kunde_id = k.id)
<span class="hljs-keyword" style="color: #cc7832;">WHERE</span> k.id = <span class="hljs-number" style="color: #6897bb;">1</span>
<span class="hljs-keyword" style="color: #cc7832;">AND</span> best.datum <span class="hljs-keyword" style="color: #cc7832;">BETWEEN</span> <span class="hljs-string" style="color: #6a8759;">'01/01/2016'</span> <span class="hljs-keyword" style="color: #cc7832;">AND</span> <span class="hljs-string" style="color: #6a8759;">'12/31/2016'</span></pre><h2 id="mcetoc_1g6kqqqii9tt">Transaktionen</h2><p>Änderungen an relationalen Datenbanken werden als Transaktionen gruppiert und müssen die ACID Kriterien erfüllen.</p><h3 id="mcetoc_1g6kqqqii9tu">ACID-Kriterien</h3><ul><li><strong>A</strong>tomicity: Jede Transaktion muss atomar sein, es werden entweder alle dazugehörigen Schreibvorgänge ausgeführt, oder keiner. Zudem ist sichergestellt, dass die von einer Transaktion betroffenen Datensätze nicht zwischenzeitlich von einer anderen Transaktion manipuliert wurden.</li><li><strong>C</strong>onsistency: Am Ende einer Transaktion ist sichergestellt, dass bestimmte Konsistenzregeln, die Sie auf der Datenbank konfigurieren können, eingehalten werden. Man kann durch diese Regeln nicht alle logischen Einschränkungen einer Anwendung abbilden, aber man kann verhindern, dass zu einem Benutzer mehrere Einkaufswagen existieren, oder umgekehrt.</li><li><strong>I</strong>solation: Jede Transaktion wird isoliert von allen anderen Transaktionen ausgeführt, so dass der Effekt für das Gesamtsystem so ist, als würden die Transaktionen nacheinander verarbeitet.</li><li><strong>D</strong>urability: Für alle abgeschlossenen Transaktionen ist garantiert, dass die Daten dauerhaft gespeichert sind, auch wenn die Datenbank abstürzt.</li></ul><h2 id="mcetoc_1g6kr8o3v9u1">JDBC</h2><p>Der Zugriff mit Java auf eine Datenbank erfolgt durch die JDBC (Java Database Connectivity)-API. Die API sorgt dafür, dass der Java Entwickler auf alle DBs, egal welchen Hersteller auf die exakt gleiche Weise zugreifen kann. Das ermöglicht dass die Datenbank ausgetauscht wird, ohne das dafür der Java Code angepasst werden muss. Alle verbreiteten Datenbanken werden direkt mit JDBC-Treiber ausgeliefert.</p><p>JDBC ermöglicht es, aus einer Java Anwendung heraus direkt DDL- und SQL-Anweisungen auf die DB auszuführen. Das Einzige was man wissen muss, ist, wie man die Verbindung zum DB-Server konfiguriert. Dazu wird ein URL-Format verwendet:</p><pre class="hljs" style="color: #a9b7c6; background: #282b2e none repeat scroll 0% 0%; display: block; overflow-x: auto; padding: 0.5em;"><span class="hljs-attribute" style="color: #6a8759;">jdbc</span>:<span class="hljs-attribute" style="color: #6a8759;">mysql</span>:<span class="hljs-comment" style="color: grey;">//192.168.1.1:3306/meineDatenbank</span></pre><p>Der erste Teil der URL, das Protokoll, ist immer gleich (jdbc). Der zweite Teil identifiziert den zu verwendenden Treiber und die Verbindungsinformationen zur Datenbank.</p><h2 id="mcetoc_1g6ks69ho9u3">JPA</h2><p>Die Java Persistence API setzt auf JDBC auf und ist heute der standard Weg, aus einer Java-Anwendung auf eine DB zuzugreifen. Die JPA ist Bestandteil von JEE. Sie ermöglicht nicht nur die Kommunikation mit einer DB, sie nimmt auch noch den Arbeitsschritt ORM (Object Relational Mapping) ab, also die Abbildung von Tabellenzeilen auf Java-Objekte. Für den Datenbankzugriff durch die JPA schreibt man eine ganz normale Java Klasse, die man durch eine Reihe von Annotationen zu einer JPA-Entität macht (eine Klasse, die mit der DB-Tabelle verbunden ist):</p><pre class="hljs" style="color: #a9b7c6; background: #282b2e none repeat scroll 0% 0%; display: block; overflow-x: auto; padding: 0.5em;"><span class="hljs-meta" style="color: #bbb529;">@Entity</span>
<span class="hljs-keyword" style="color: #cc7832;">public</span> <span class="hljs-class"><span class="hljs-keyword" style="color: #cc7832;">class</span> <span class="hljs-title" style="color: #ffc66d;">Kunde</span> </span>{
<span class="hljs-meta" style="color: #bbb529;">@Id</span>
<span class="hljs-meta" style="color: #bbb529;">@GeneratedValue</span>(strategy = GenerationType.TABLE)
<span class="hljs-keyword" style="color: #cc7832;">private</span> <span class="hljs-keyword" style="color: #cc7832;">int</span> id;
<span class="hljs-keyword" style="color: #cc7832;">private</span> String vorname;
<span class="hljs-keyword" style="color: #cc7832;">private</span> String nachname;
…
<span class="hljs-meta" style="color: #bbb529;">@OneToMany</span>()
<span class="hljs-keyword" style="color: #cc7832;">private</span> <span class="hljs-keyword" style="color: #cc7832;">final</span> List<Kunde> freunde = <span class="hljs-keyword" style="color: #cc7832;">new</span> ArrayList<Kunde>();
<span class="hljs-function"><span class="hljs-keyword" style="color: #cc7832;">public</span> <span class="hljs-keyword" style="color: #cc7832;">int</span> <span class="hljs-title" style="color: #ffc66d;">getId</span><span class="hljs-params">()</span> </span>{
<span class="hljs-keyword" style="color: #cc7832;">return</span> id;
}
<span class="hljs-function"><span class="hljs-keyword" style="color: #cc7832;">public</span> <span class="hljs-keyword" style="color: #cc7832;">void</span> <span class="hljs-title" style="color: #ffc66d;">setId</span><span class="hljs-params">(<span class="hljs-keyword" style="color: #cc7832;">int</span> id)</span> </span>{
<span class="hljs-keyword" style="color: #cc7832;">this</span>.id = id;
}
…
}</pre><p> </p></div><footer class="wrapper post__footer"><p class="post__last-updated">This article was updated on Juni 28, 2022</p><ul class="post__tag"><li><a href="https://www.finecloud.ch/tags/database/">database</a></li><li><a href="https://www.finecloud.ch/tags/java/">java</a></li><li><a href="https://www.finecloud.ch/tags/softwareentwicklung/">software development</a></li><li><a href="https://www.finecloud.ch/tags/sql/">sql</a></li></ul><div class="post__share"></div></footer></article><nav class="post__nav"><div class="post__nav-inner"><div class="post__nav-prev"><svg width="1.041em" height="0.416em" aria-hidden="true"><use xlink:href="https://www.finecloud.ch/assets/svg/svg-map.svg#arrow-prev"/></svg> <a href="https://www.finecloud.ch/http-response-status-codes.html" class="post__nav-link" rel="prev"><span>Previous</span> HTTP Response Status Codes</a></div><div class="post__nav-next"><a href="https://www.finecloud.ch/kubernetes-auf-proxmox-mit-ansible-und-terraform.html" class="post__nav-link" rel="next"><span>Next</span> Kubernetes auf Proxmox mit Ansible und Terraform (Teil 1) </a><svg width="1.041em" height="0.416em" aria-hidden="true"><use xlink:href="https://www.finecloud.ch/assets/svg/svg-map.svg#arrow-next"/></svg></div></div></nav><div class="post__related related"><div class="wrapper"><h2 class="h5 related__title">You should also read:</h2><article class="related__item"><div class="feed__meta"><time datetime="2022-05-26T14:07" class="feed__date">Mai 26, 2022</time></div><h3 class="h1"><a href="https://www.finecloud.ch/java-collection-iteratoren.html">Java Collection Iteratoren</a></h3></article><article class="related__item"><div class="feed__meta"><time datetime="2022-05-26T13:28" class="feed__date">Mai 26, 2022</time></div><h3 class="h1"><a href="https://www.finecloud.ch/java-collection-sets.html">Java Collection Sets</a></h3></article><article class="related__item"><div class="feed__meta"><time datetime="2022-05-26T13:19" class="feed__date">Mai 26, 2022</time></div><h3 class="h1"><a href="https://www.finecloud.ch/java-collection-listen.html">Java Collection Listen</a></h3></article></div></div></main><footer class="footer"><div class="footer__copyright"><p>Powered by Publii</p></div><button onclick="backToTopFunction()" id="backToTop" class="footer__bttop" aria-label="Back to top" title="Back to top"><svg><use xlink:href="https://www.finecloud.ch/assets/svg/svg-map.svg#toparrow"/></svg></button></footer></div><script>window.publiiThemeMenuConfig = {
mobileMenuMode: 'sidebar',
animationSpeed: 300,
submenuWidth: 'auto',
doubleClickTime: 500,
mobileMenuExpandableSubmenus: true,
relatedContainerForOverlayMenuSelector: '.top',
};</script><script defer="defer" src="https://www.finecloud.ch/assets/js/scripts.min.js?v=6ca8b60e6534a3888de1205e82df8528"></script><script>var images = document.querySelectorAll('img[loading]');
for (var i = 0; i < images.length; i++) {
if (images[i].complete) {
images[i].classList.add('is-loaded');
} else {
images[i].addEventListener('load', function () {
this.classList.add('is-loaded');
}, false);
}
}</script><script defer="defer" src="https://www.finecloud.ch/media/plugins/syntaxHighlighter/prism.js"></script></body></html>