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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
|
<html>
<head>
<title>
Handbuch der Java-Programmierung, 5. Auflage
</title>
</head>
<body>
<a name="startofbody"></a>
<script language="JavaScript" src="hjp4lib.js">
</script>
<script language="JavaScript">
installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100265.html;106,k100265.html;107,k100267.html;108,k100271.html");
</script>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100265.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100265.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100267.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100271.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">Kapitel 42 - Datenbankzugriffe mit JDBC
</table>
<hr>
<!-- Section -->
<a name="sectlevel2id042001"></a>
<h2>42.1 Einleitung </h2>
<hr>
<ul>
<li><a href="k100266.html#sectlevel2id042001">42.1 Einleitung</a>
<ul>
<li><a href="k100266.html#sectlevel3id042001001">42.1.1 Grundsätzliche Arbeitsweise</a>
<li><a href="k100266.html#sectlevel3id042001002">42.1.2 Die Architektur von JDBC</a>
<ul>
<li><a href="k100266.html#sectlevel4id042001002001">Treibertypen</a>
<li><a href="k100266.html#sectlevel4id042001002002">Mehrstufige Client-Server-Architekturen</a>
<li><a href="k100266.html#sectlevel4id042001002003">SQL-2 Entry Level</a>
<li><a href="k100266.html#sectlevel4id042001002004">JDBC-Versionen</a>
</ul>
</ul>
</ul>
<hr>
<p>
Wir wollen uns in diesem Abschnitt zunächst mit der grundsätzlichen
Architektur von JDBC und datenbankbasierten Java-Anwendungen vertraut
machen. Anschließend werden die wichtigsten Bestandteile der
JDBC-Schnittstelle vorgestellt und ihre jeweilige Funktionsweise kurz
erläutert. Der nächste Abschnitt illustriert und verfeinert
die Konzepte dann an einem praktischen Beispiel, bei dem eine Datenbank
zur Speicherung von Verzeichnissen und Dateien entworfen, mit Daten
gefüllt und abgefragt wird. Zum Abschluss werden wir einige spezielle
Probleme besprechen und auf die Besonderheiten gebräuchlicher
JDBC-Treiber eingehen.
<p>
Dieses Kapitel ist typisch für die <i>weiterführenden</i>
Themen in diesem Buch. JDBC ist ein sehr umfassendes Gebiet, das auf
den zur Verfügung stehenden Seiten nicht vollständig behandelt
werden kann. Wir verfolgen statt dessen einen pragmatischen Ansatz,
bei dem wichtige Grundlagen erläutert werden. Mit Hilfe von Beispielen
wird ihre praktische Anwendbarkeit demonstriert. Insgesamt müssen
aber viele Fragen offen bleiben, die durch die Lektüre weiterer
Dokumentationen geschlossen werden können. Dazu zählen beispielsweise
<a name="ixa103035"><i>Trigger</i></a>, <a name="ixa103036"><i>Blobs</i></a>
und <a name="ixa103037"><i>Stored Procedures</i></a>, die Erweiterungen
in JDBC 2.0 oder die Entwicklung eigener JDBC-Treiber.
<!-- Section -->
<a name="sectlevel3id042001001"></a>
<h3>42.1.1 Grundsätzliche Arbeitsweise </h3>
<p>
Kurz nachdem die Version 1.0 des Java Development Kit vorlag, begann
die Entwicklung einer einheitlichen Datenbankschnittstelle für
Java-Programme. Anstelle des von vielen Entwicklern erwarteten objektorientierten
Ansatzes verfolgten die Designer dabei das primäre Ziel, die
große Zahl vorhandener SQL-Datenbanken problemlos anzubinden.
In konzeptioneller Anlehnung an die weitverbreitete ODBC-Schnittstelle
wurde daraufhin mit <a name="ixa103038"><i>JDBC</i></a> (<a name="ixa103039"><i>Java Database
Connectivity</i></a>) ein standardisiertes
Java-Datenbank-Interface entwickelt, das mit der Version 1.1 fester
Bestandteil des JDK wurde.
<p>
JDBC stellt ein <a name="ixa103040"><i>Call-Level-Interface</i></a>
zur SQL-Datenbank dar. Bei einer solchen Schnittstelle werden die
SQL-Anweisungen im Programm als Zeichenketten bearbeitet und zur Ausführung
an parametrisierbare Methoden übergeben. Rückgabewerte und
Ergebnismengen werden durch Methodenaufrufe ermittelt und nach einer
geeigneten Typkonvertierung im Programm weiterverarbeitet.
<p>
Dem gegenüber steht ein zweites Verfahren, das als <a name="ixa103041"><i>Embedded SQL</i></a>
(<a name="ixa103042"><i>ESQL</i></a>) bezeichnet wird. Hierbei werden
die SQL-Anweisungen mit besonderen Schlüsselwörtern direkt
in den Java-Quelltext eingebettet, und die Kommunikation mit dem Java-Programm
erfolgt durch speziell deklarierte <a name="ixa103043"><i>Host-Variablen</i></a>.
Damit der Java-Compiler durch die eingebetteten SQL-Anweisungen nicht
durcheinandergebracht wird, müssen sie zunächst von einem
Präprozessor in geeigneten Java-Code übersetzt werden. Während
Embedded-SQL insbesondere bei Datenbankanwendungen, die in C oder
C++ geschrieben sind, sehr verbreitet ist, spielt es in Java praktisch
keine Rolle und konnte sich gegenüber JDBC nicht durchsetzen.
<!-- Section -->
<a name="sectlevel3id042001002"></a>
<h3>42.1.2 Die Architektur von JDBC </h3>
<!-- Section -->
<a name="sectlevel4id042001002001"></a>
<h4>Treibertypen </h4>
<p>
JDBC ist keine eigene Datenbank, sondern eine Schnittstelle zwischen
einer SQL-Datenbank und der Applikation, die sie benutzen will. Bezüglich
der Architektur der zugehörigen Verbindungs-, Anweisungs- und
Ergebnisklassen unterscheidet man vier Typen von JDBC-Treibern:
<ul>
<li>Steht bereits ein <a name="ixa103044"><i>ODBC-Treiber</i></a>
zur Verfügung, so kann er mit Hilfe der im Lieferumfang enthaltenen
<a name="ixa103045"><i>JDBC-ODBC-Bridge</i></a> in Java-Programmen
verwendet werden. Diese Konstruktion bezeichnet man als <i>Typ-1-Treiber</i>.
Mit seiner Hilfe können alle Datenquellen, für die ein ODBC-Treiber
existiert, in Java-Programmen genutzt werden.
<li>Zu vielen Datenbanken gibt es neben ODBC-Treibern auch <i>spezielle</i>
Treiber des jeweiligen Datenbankherstellers. Setzt ein JDBC-Treiber
auf einem solchen proprietären Treiber auf, bezeichnet man ihn
als <i>Typ-2-Treiber</i>.
<li>Wenn ein JDBC-Treiber komplett in Java geschrieben und auf dem
Client keine spezielle Installation erforderlich ist, der Treiber
zur Kommunikation mit einer Datenbank aber auf eine funktionierende
<a name="ixa103046"><i>Middleware</i></a> angewiesen ist, handelt
es sich um einen <i>Typ-3-Treiber</i>.
<li>Falls ein JDBC-Treiber komplett in Java geschrieben ist und die
JDBC-Calls direkt in das erforderliche Protokoll der jeweiligen Datenbank
umsetzt, handelt es sich um einen <i>Typ-4-Treiber</i>.
</ul>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Die JDBC-Treibertypen sind im übrigen nicht zu verwechseln mit
der der vom jeweiligen JDK unterstützen <i>JDBC-Version</i>.
Diese wird etwas später in diesem Absatz vorgestellt.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#CC0000">
<tr>
<td><font color="#FFFFFF"> Warnung </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#CC0000"><img src="trp1_1.gif"></td>
</tr>
</table>
<!-- Section -->
<a name="sectlevel4id042001002002"></a>
<h4><a name="ixa103047">Mehrstufige Client-Server-Architekturen</a></h4>
<p>
Während die Typ-1- und Typ-2-Treiber lokal installierte und konfigurierte
Software erfordern (die jeweiligen ODBC- bzw. herstellerspezifischen
Treiber), ist dies bei Typ-3- und Typ-4-Treibern normalerweise nicht
der Fall. Hier können die zur Anbindung an die Datenbank erforderlichen
Klassendateien zusammen mit der Applikation oder dem Applet aus dem
Netz geladen und ggfs. automatisch aktualisiert werden. Nach der Veröffentlichung
von JDBC gab es zunächst gar keine Typ-3- oder Typ-4-Treiber.
Mittlerweile haben sich aber alle namhaften Datenbankhersteller zu
Java bekannt und stellen auch Typ-3- oder Typ-4-Treiber zur Verfügung.
Daneben gibt es eine ganze Reihe von Fremdherstellern, die JDBC-Treiber
zur Anbindung bekannter Datenbanksysteme zur Verfügung stellen.
<p>
Mit JDBC können sowohl zwei- als auch drei- oder höherstufige
Client-Server-Systeme aufgebaut werden (<a name="ixa103048"><i>Multi-Tier-Architekturen</i></a>).
Während bei den zweistufigen Systemen eine Aufteilung der Applikation
in Datenbank (Server) und Arbeitsplatz (Client) vorgenommen wird,
gibt es bei den dreistufigen Systemen noch eine weitere Schicht, die
zwischen beiden Komponenten liegt. Sie wird gemeinhin als <a name="ixa103049"><i>Applikations-Server</i></a>
bezeichnet und dient dazu, komplexe Operationen vom Arbeitsplatz weg
zu verlagern. Der Applikations-Server ist dazu mit dem Datenbank-Server
verbunden und kommuniziert mit diesem über ein standardisiertes
Protokoll (z.B. JDBC). Den Arbeitsplätzen stellt er dagegen höherwertige
Dienste (z.B. komplette Business-Transaktionen) zur Verfügung
und kommuniziert mit ihnen über ein spezielles Anwendungsprotokoll
(z.B. HTTP, RMI, CORBA oder andere).
<!-- Section -->
<a name="sectlevel4id042001002003"></a>
<h4>SQL-2 Entry Level </h4>
<p>
JDBC übernimmt die Aufgabe eines »Transportprotokolls«
zwischen Datenbank und Anwendung und definiert damit zunächst
noch nicht, welche SQL-Kommandos übertragen werden dürfen
und welche nicht. Tatsächlich verwendet heute jede relationale
Datenbank ihren eigenen SQL-Dialekt, und eine Portierung auf eine
andere Datenbank ist nicht selten aufwändiger als ein Wechsel
des Compilers.
<p>
Um einen minimalen Anspruch an Standardisierung zu gewährleisten,
fordert SUN von den JDBC-Treiberherstellern, mindestens den <a name="ixa103050"><i>SQL-2
Entry-Level-Standard</i></a> von 1992 zu erfüllen.
Mit Hilfe einer von SUN erhältlichen Testsuite können die
Hersteller ihre JDBC-Treiber auf Konformität testen. Da praktisch
alle großen Datenbanken in ihrer Funktionalität weit über
besagten Standard hinausgehen, ist bei Verwendung dieser Features
möglicherweise mit erheblichem Portierungsaufwand zu rechnen.
<!-- Section -->
<a name="sectlevel4id042001002004"></a>
<h4><a name="ixa103051">JDBC-Versionen</a></h4>
<p>
Genauso, wie sich der Umfang der einzelnen JDKs immer weiter gesteigert
hat, ist auch die Leistungsfähigkeit der JDBC-Schnittstelle kontinuierlich
gestiegen. Um dies zu verdeutlichen trägt die jeweils unterstützte
JDBC-Version eine eigene Versionsnummer:
<ul>
<li>Erstmals wurde die JDBC 1997 mit der Version 1.0 in das JDK 1.1
integriert. Dieses JDBC-Version basiert auf dem SQL-Standard SQL-92.
<li>Die Version 2.0 der JDBC-API wurde mit dem JDK 1.2 eingeführt
und berücksichtigt bereits die Erweiterungen von SQL-99. Um den
Herstellern die Implementierung von Treibern zu erleichtern, wurde
die API mit dieser Version in 2 Pakete aufgeteilt. Das als JDBC 1.0
Core API bezeichnete Paket findet sich im Namensraum <font color="#000077"><tt>java.sql</tt></font>
und ist fester Bestandteil des JDK, während sich die Klassen
des so genannten JDBC 2.0 Optional Package sich im Namensraum <font color="#000077"><tt>javax.sql</tt></font>
befinden.
<li>Seit dem JDK 1.4 trägt die JDBC-API die Versionsnummer 3.0.
Diese wurde abermals um weitere Datentypen wie <font color="#000077"><tt>Boolean</tt></font>
und <a href="index_d.html#ixb102238"><font color=#000080><tt>DataLink</tt></font></a>
erweitert und unterstützt zum Beispiel vorbereitete Statements
(<font color="#000077"><tt>PreparedStatement</tt></font>) und Sicherungspunkte
(SavePoints) in einer laufenden Transaktion.
<li>Das JDK 6 integriert nun die JDBC-Version 4.0, welche neue SQL-2003
Datentypen für XML unterstützt und die Verwendung von Annotationen
gestattet. Derzeit sind JDBC 4-Treiber allerdings noch sehr selten
verfügbar.
</ul>
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
Wesley, Version 5.0.1
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100265.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100265.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100267.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100271.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">© 1998, 2007 Guido Krüger & Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>
|