Java Database Connectivity ( JDBC ) ist eine Programmierschnittstelle (API) für die Programmiersprache Java , die den Datenbankzugriff für Clients definiert . Es handelt sich um eine Java-basierte Datenzugriffstechnologie für die Datenbankanbindung. JDBC ist Bestandteil der Java Standard Edition- Plattform von Oracle . Es bietet Methoden zum Abfragen und Aktualisieren von Daten in einer Datenbank und ist auf relationale Datenbanken ausgerichtet . Eine JDBC-zu- ODBC -Brücke ermöglicht Verbindungen zu beliebigen ODBC-fähigen Datenquellen in der Java Virtual Machine (JVM).
Geschichte und Umsetzung
Sun Microsystems veröffentlichte JDBC am 19. Februar 1997 als Teil des Java Development Kit (JDK) 1.1. [ 1 ] Seitdem ist es Teil der Java Platform, Standard Edition (Java SE).
Die JDBC-Klassen befinden sich im Java-Paketjava.sql und javax.sql, sowie einige weitere Klassen an anderer Stelle. Alles, was mit JDBC zu tun hat, wird über das Moduljava.sql exportiert .
Ab Version 3.1 wird JDBC im Rahmen des Java Community Process weiterentwickelt . JSR 54 spezifiziert JDBC 3.0 (enthalten in J2SE 1.4), JSR 114 spezifiziert die JDBC Rowset-Erweiterungen (für Rowsets javax.sql.RowSet) und JSR 221 ist die Spezifikation von JDBC 4.0 (enthalten in Java SE 6). [ 2 ]
JDBC 4.1 ist in der Wartungsversion 1 von JSR 221 [ 3 ] spezifiziert und in Java SE 7 enthalten. [ 4 ]
JDBC 4.2 ist in der Wartungsversion 2 von JSR 221 [ 5 ] spezifiziert und in Java SE 8 enthalten. [ 6 ]
Die neueste Version, JDBC 4.3, ist in der Wartungsversion 3 von JSR 221 [ 7 ] spezifiziert und in Java SE 9 enthalten. [ 8 ]
| JDBC-Version | Java-Version | Veröffentlichungstyp | Veröffentlichungsdatum |
|---|---|---|---|
| 1.1 | JDK 1.1 | Hauptsächlich | 19.02.1997. [ 1 ] |
| 3.0 | J2SE 1.4 | Hauptsächlich | 09.05.2002 |
| 4.0 | Java SE 6 | Hauptsächlich | 11.12.2006 |
| 4.1 | Java SE 7 | Wartung | 13.10.2011 |
| 4.2 | Java SE 8 | Wartung | 04.03.2014 |
| 4.3 | Java SE 9 | Wartung | 21.09.2017 |
Funktionalität
| Oracle-Datentyp | setXXX()Methoden |
|---|---|
CHAR | setString() |
VARCHAR2 | setString() |
NUMBER | setBigDecimal() |
setBoolean() | |
setByte() | |
setShort() | |
setInt() | |
setLong() | |
setFloat() | |
setDouble() | |
INTEGER | setInt() |
FLOAT | setDouble() |
CLOB | setClob() |
BLOB | setBlob() |
RAW | setBytes() |
LONGRAW | setBytes() |
DATE | setDate() |
setTime() | |
setTimestamp() |
Da JDBC im Wesentlichen aus einer Sammlung von Schnittstellendefinitionen und -spezifikationen besteht, ermöglicht es, dass mehrere Implementierungen dieser Schnittstellen existieren und von derselben Anwendung zur Laufzeit verwendet werden können. Die API bietet einen Mechanismus zum dynamischen Laden der korrekten Java-Pakete und deren Registrierung beim JDBC Driver Manager java.sql.DriverManager. java.sql.DriverManagerDieser dient als java.sql.ConnectionFactory zum Erstellen von JDBC-Verbindungen.
JDBC-Verbindungen unterstützen das Erstellen und Ausführen von Anweisungen. Sie unterstützen Aktualisierungsanweisungen wie CREATE , INSERT , UPDATE und DELETE ( SQL) sowie Abfrageanweisungen wie SELECT . Darüber hinaus können gespeicherte Prozeduren über eine JDBC-Verbindung aufgerufen werden. JDBC stellt Anweisungen mithilfe einer der folgenden Klassen dar:
StatementDie Datenjava.sql.Statementwerden jedes Mal an den Datenbankserver gesendet. Anders ausgedrückt: Diejava.sql.StatementMethoden werden mithilfe von SQL-Anweisungen ausgeführt, um einjava.sql.ResultSetObjekt mit den Daten zu erhalten. [ 9 ]PreparedStatement–java.sql.PreparedStatementist eine Unterschnittstelle derjava.sql.StatementSchnittstelle. [ 9 ] Die Anweisung wird zwischengespeichert und der Ausführungspfad anschließend auf dem Datenbankserver vordefiniert, wodurch sie effizient mehrfach ausgeführt werden kann. [ 9 ]java.sql.PreparedStatementwird zur Ausführung vorkompilierter SQL-Anweisungen verwendet. [ 9 ] Die Ausführung vorkompilierter Anweisungen erhöht die Effizienz und Leistung der Anweisungsausführung. Diesjava.sql.PreparedStatementwird häufig für dynamische Anweisungen verwendet, bei denen Eingabeparameter an die Zieldatenbank übergeben werden müssen. [ 10 ] Diesjava.sql.PreparedStatementermöglicht es, dass die dynamische Abfrage je nach Abfrageparameter variiert. [ 11 ]CallableStatement–java.sql.CallableStatementist eine Unterschnittstelle derjava.sql.StatementSchnittstelle. [ 11 ] Sie wird zur Ausführung gespeicherter Prozeduren in der Datenbank verwendet. [ 11 ] [ 12 ] Sowohl Eingabe- als auch Ausgabeparameter müssen für gespeicherte Prozeduren an die Datenbank übergeben werden. [ 13 ]
Aktualisierungsanweisungen wie `update()` INSERTund UPDATE` DELETEupdate()` geben eine Aktualisierungsanzahl zurück, die die Anzahl der betroffenen Zeilen in der Datenbank als Ganzzahl angibt. [ 13 ] Diese Anweisungen geben keine weiteren Informationen zurück.
Abfrageanweisungen geben ein JDBC-Zeilenergebnis zurück. Dieses Zeilenergebnis dient zum Durchlaufen des Ergebnissatzes . Einzelne Spalten einer Zeile werden entweder über ihren Namen oder ihre Spaltennummer abgerufen. Der Ergebnissatz kann beliebig viele Zeilen enthalten. Er verfügt über Metadaten, die die Spaltennamen und ihre Datentypen beschreiben.
Es gibt eine Erweiterung der grundlegenden JDBC-API in der javax.sql.
JDBC-Verbindungen werden häufig über einen Verbindungspool verwaltet , anstatt direkt vom Treiber bezogen zu werden, wie z javax.sql.DataSource. B. [ 14 ].
Beispiele
Wenn eine Java-Anwendung eine Datenbankverbindung benötigt, DriverManager.getConnection()wird eine der Methoden verwendet, um eine JDBC-Verbindung herzustellen java.sql.Connection. Die verwendete URL hängt von der jeweiligen Datenbank und dem JDBC-Treiber ab. Sie beginnt immer mit dem jdbc:Protokoll, der Rest ist jedoch anbieterabhängig.
import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.SQLException ;Connection conn = DriverManager.getConnection ( " jdbc :somejdbcvendor:other data needed by some jdbc vendor" , "myLogin" , "myPassword" ) ;try { // Die Verbindung hier verwenden } finally { try { // Die Verbindung nach Abschluss schließen conn.close ( ); } catch ( SQLException e ) { // Die ursprüngliche Ausnahme weitergeben, nicht die hier abgefangene logger.warn ( "JDBC-Verbindung konnte nicht geschlossen werden " , e ) ; } }Ab Java SE 7 kann man die try-with-resources -Anweisung von Java verwenden, um den obigen Code zu vereinfachen:
import java.sql.Connection ; import java.sql.DriverManager ;try ( Connection conn = DriverManager.getConnection ( "jdbc:somejdbcvendor:other data needed by some jdbc vendor" , "myLogin" , "myPassword" )) { // Verbindung hier verwenden } // conn.close() wird automatisch aufgerufen // Die Verbindung wird nach Verlassen des try-Blocks automatisch geschlossenSobald eine Verbindung hergestellt ist, java.sql.Statementkann ein erstellt werden.
import java.sql.Statement ;try ( Statement stmt = conn . createStatement ()) { stmt . executeUpdate ( "INSERT INTO MyTable(name) VALUES ('my name')" ); }Beachten Sie, dass java.sql.Connection`s`, java.sql.Statement`s` und `s` häufig Betriebssystemressourcen wie Sockets oder Dateideskriptorenjava.sql.ResultSet belegen . Bei Verbindungen zu entfernten Datenbankservern werden zusätzlich serverseitige Ressourcen gebunden, z. B. Cursor für aktuell geöffnete `s`. Es ist für jedes JDBC-Objekt unerlässlich, nach Erfüllung seiner Funktion freigegeben zu werden; verlassen Sie sich nicht auf die automatische Speicherbereinigung . Die oben beschriebene `try-with-resources`-Konstruktion ist ein Codemuster, das dies vermeidet. java.sql.Connectionjava.sql.ResultSetclose()
Die Daten werden mithilfe eines Datenbankabfragemechanismus aus der Datenbank abgerufen. Das folgende Beispiel zeigt das Erstellen einer Anweisung und das Ausführen einer Abfrage.
import java.sql.ResultSet ; import java.sql.Statement ;try ( Statement stmt = conn.createStatement (); ResultSet rs = stmt.executeQuery ( " SELECT * FROM MyTable" ) ) { while ( rs.next ( ) ) { int numColumns = rs.getMetaData ( ).getColumnCount() ; for ( int i = 1 ; i < = numColumns ; i ++ ) { // Spaltennummern beginnen bei 1. // Es gibt viele Methoden des Resultsets, um die Spalte als einen bestimmten Typ zurückzugeben . // Eine Liste der gültigen Konvertierungen finden Sie in der Sun-Dokumentation. System.out.printf ( " SPALTE %d = %s% n " , i , rs.getObject ( i ) ) ; } } }Der folgende Code ist ein Beispiel für eine Abfrage, die eine Klasse aus dem ersten Beispiel java.sql.PreparedStatementverwendet :conn
import java.sql.PreparedStatement ; import java.sql.ResultSet ;try ( PreparedStatement ps = conn.prepareStatement ( " SELECT i.*, j.* FROM Omega i, Zappa j WHERE i.name = ? AND j.num = ?" ) ) { // In der vorbereiteten SQL-Anweisung ist jedes Fragezeichen ein Platzhalter , // der durch einen Wert ersetzt werden muss, den Sie über einen Aufruf der "set"-Methode angeben. // Die folgenden beiden Methodenaufrufe ersetzen die beiden Platzhalter; der erste wird // durch einen String-Wert und der zweite durch einen Integer-Wert ersetzt. ps.setString ( 1 , "Poor Yorick" ) ; ps.setInt ( 2 , 8008 );// Das ResultSet, rs, enthält das Ergebnis der SQL-Anweisung. // Bei jedem Aufruf von rs.next() wird ein interner Zeilenzeiger (Cursor) // zur nächsten Ergebniszeile bewegt. Der Cursor befindet sich anfänglich // vor der ersten Zeile. try ( ResultSet rs = ps . executeQuery ()) { while ( rs . next ()) { for ( int i = 1 ; i <= rs . getMetaData (). getColumnCount (); i ++ ) { // Die Spaltennummern beginnen bei 1. // Es gibt außerdem viele Methoden des ResultSets, um die Spalte als einen bestimmten Typ zurückzugeben. // Eine Liste der gültigen Konvertierungen finden Sie in der Sun-Dokumentation . System . out . printf ( "SPALTE %d = %s%n" , i , rs . getObject ( i )); } } } }Schlägt eine Datenbankoperation fehl, löst JDBC eine Ausnahme aus SQLException. In der Regel lässt sich ein solcher Fehler nur schwer beheben, außer ihn so detailliert wie möglich zu protokollieren. Es wird empfohlen, die java.sql.SQLExceptionAusnahme in eine Anwendungsdomänenausnahme (eine ungeprüfte Ausnahme) umzuwandeln, die letztendlich zu einem Transaktions-Rollback und einer Benachrichtigung des Benutzers führt.
Der folgende Code ist ein Beispiel für eine Datenbanktransaktion :
import java.sql.SQLException ;boolean autoCommitDefault = conn.getAutoCommit ( ) ; try { conn.setAutoCommit ( false ) ;// Führe hier transaktional Anweisungen für conn ausconn.commit ( ); } catch ( SQLException e ) { try { conn.rollback ( ); } catch ( Throwable e ) { logger.warn ( " Transaktion konnte nicht zurückgesetzt werden" , e ) ; } throw e ; } finally { try { conn.setAutoCommit ( autoCommitDefault ) ; } catch ( Throwable e ) { logger.warn ( "AutoCommit - Einstellung konnte nicht wiederhergestellt werden " , e ) ; } }Ein Beispiel für einen java.sql.CallableStatementAufruf von gespeicherten Prozeduren in der Datenbank finden Sie in der JDBC-API- Dokumentation.
package org.wikipedia.examples ;import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.Statement ;public class DatabaseExample { private static final String DB_URL = "jdbc:mysql://localhost/mydb" ;public static void main ( String [] args ) { try { Class . forName ( "com.mysql.jdbc.Driver" );Connection conn = DriverManager.getConnection ( DB_URL , "root" , "root" ); Statement stmt = conn.createStatement (); String sql = " INSERT INTO emp1 VALUES ('pctb5361', 'kiril', 'john', 968666668)" ; stmt.executeUpdate (sql); System.out.println ( " Eingefügte Datensätze in die Tabelle ... " ) ; } catch ( SQLException e ) { System.err.printf ( " Ein SQL - Fehler ist aufgetreten : %s%n" , e.getMessage ( ) ); } catch ( Exception e ) { System.err.println ( " Ein unbekannter Fehler ist aufgetreten." ) ; e.printStackTrace ( ) ; } } }JDBC-Treiber
JDBC-Treiber sind clientseitige Adapter (die auf dem Client-Rechner und nicht auf dem Server installiert werden), die Anfragen von Java-Programmen in ein Protokoll umwandeln, das das DBMS versteht.
Typen
Kommerzielle und kostenlose Treiber ermöglichen die Anbindung an die meisten relationalen Datenbankserver. Diese Treiber lassen sich in folgende Typen einteilen:
- Typ 1 ruft nativen Code des lokal verfügbaren ODBC-Treibers auf. (Hinweis: In JDBC 4.2 wurde die JDBC-ODBC-Brücke entfernt [ 15 ] )
- Typ 2 ruft clientseitig die native Bibliothek des Datenbankanbieters auf. Dieser Code kommuniziert dann über das Netzwerk mit der Datenbank.
- Typ 3 , der reine Java-Treiber, der mit der serverseitigen Middleware kommuniziert, welche wiederum mit der Datenbank kommuniziert.
- Typ 4 , der reine Java-Treiber, der das native Datenbankprotokoll verwendet.
Beachten Sie auch den sogenannten internen JDBC-Treiber – einen Treiber, der in Java-fähigen SQL-Datenbanken in die Java Runtime Environment ( JRE) eingebettet ist. Er wird für Java-gespeicherte Prozeduren verwendet . Dieser Treiber passt nicht in das obige Klassifizierungsschema, obwohl er wahrscheinlich einem Treiber vom Typ 2 oder 4 ähneln würde (abhängig davon, ob die Datenbank selbst in Java implementiert ist oder nicht). Ein Beispiel hierfür ist der KPRB-Treiber (Kernel Program Bundled) [ 16 ] , der mit Oracle RDBMS ausgeliefert wird . „jdbc:default:connection“ bietet eine relativ standardisierte Möglichkeit, eine solche Verbindung herzustellen (zumindest die Oracle-Datenbank und Apache Derby unterstützen dies). Im Falle eines internen JDBC-Treibers läuft der JDBC-Client jedoch als Teil der Datenbank, auf die zugegriffen wird, und kann daher direkt auf Daten zugreifen, anstatt über Netzwerkprotokolle.
Quellen
- Oracle stellt eine Liste einiger JDBC-Treiber und -Anbieter bereit.
- Simba Technologies liefert ein SDK zum Erstellen benutzerdefinierter JDBC-Treiber für beliebige benutzerdefinierte/proprietäre relationale Datenquellen.
- CData Software liefert JDBC-Treiber vom Typ 4 für verschiedene Anwendungen, Datenbanken und Web-APIs. [ 17 ]
- DataDirect Technologies bietet eine umfassende Suite schneller JDBC-Treiber vom Typ 4 für alle wichtigen Datenbanken an, die sie als Typ 5 bewerben [ 18 ].
- IDS Software bietet einen JDBC-Treiber Typ 3 für den gleichzeitigen Zugriff auf alle gängigen Datenbanken. Zu den unterstützten Funktionen gehören Resultset-Caching, SSL-Verschlüsselung, benutzerdefinierte Datenquellen und dbShield.
- JDBaccess ist eine Java-Persistenzbibliothek für MySQL und Oracle , die wichtige Datenbankzugriffsoperationen in einer einfach nutzbaren API oberhalb von JDBC definiert.
- JNetDirect bietet eine Reihe vollständig Sun J2EE-zertifizierter, leistungsstarker JDBC-Treiber.
- JDBCR4 ist ein von Scott Klement geschriebenes Serviceprogramm , das den Zugriff auf JDBC von RPG auf IBM i ermöglicht . [ 19 ]
- HSQLDB ist ein RDBMS mit einem JDBC-Treiber und ist unter einer BSD-Lizenz verfügbar.
- SchemaCrawler [ 20 ] ist eine Open-Source-API, die JDBC nutzt und Datenbankmetadaten als einfache Java-Objekte (POJOs) verfügbar macht.
Siehe auch
Zitate
- ^ a b „Sun veröffentlicht JDK 1.1 – Javabeans enthalten“ . www.sun.com . Sun Microsystems . 19. Februar 1997. Archiviert vom Original am 10. Februar 2008. Abgerufen am 15. Februar 2010. 19. Februar 1997
– Das JDK 1.1 [...] ist jetzt verfügbar [...]. Diese Version des JDK enthält: [...] Robuste neue Funktionen, darunter JDBC für die Datenbankanbindung.
- ^ JDBC API-Spezifikation Version: 4.0 .
- ^ „The Java Community Process(SM) Program - communityprocess - mrel“ . jcp.org . Abgerufen am 22. März 2018 .
- ^ „JDBC 4.1“ . docs.oracle.com . Abgerufen am 22. März 2018 .
- ^ „The Java Community Process(SM) Program - communityprocess - mrel“ . jcp.org . Abgerufen am 22. März 2018 .
- ^ „JDBC 4.2“ . docs.oracle.com . Abgerufen am 22. März 2018 .
- ^ „The Java Community Process(SM) Program - communityprocess - mrel“ . jcp.org . Abgerufen am 22. März 2018 .
- ^ "java.sql (Java SE 9 & JDK 9)" . docs.oracle.com . Abgerufen am 22. März 2018 .
- ^ a b c d Bai 2022 , S. 74.
- ^ Bai 2022 , S. 122–124, §4.2.3.5 Mehr über die Ausführungsmethoden.
- ^ a b c Bai 2022 , S. 72–74, §3.2 JDBC-Komponenten und -Architektur.
- ^ Horstmann 2022 , §5.5.3 SQL Escapes.
- ^ a b Bai 2022 , S. 122–124, §4.2.3.5 JDBC-Komponenten und -Architektur.
- ^ Bai 2022 , S. 83, §3.5.1 JDBC DataSource.
- ^ „Java JDBC API“ . docs.oracle.com . Abgerufen am 22. März 2018 .
- ^ Greenwald, Rick; Stackowiak, Robert; Stern, Jonathan (1999). Oracle Essentials: Oracle Database 10g . Essentials Series (3. Aufl.). Sebastopol, Kalifornien: O'Reilly Media, Inc. (erschienen 2004). S. 318. ISBN 9780596005856Abgerufen am 3. November 2016.
Der In-Database-JDBC-Treiber (JDBC KPRB)
[:] Java-Code verwendet die JDBC-KPRB-Version (Kernel Program Bundled) ,um auf SQL auf demselben Server zuzugreifen.
- ^ „JDBC-Treiber – CData Software“ . CData Software . Abgerufen am 22. März 2018 .
- ^ „Neuer JDBC-Treiber Typ 5 – DataDirect Connect“ .
- ^ „Zugriff auf externe Datenbanken aus RPG mit JDBCR4 – Kern der Sache“ . 28. Juni 2012. Abgerufen am 12. April 2016 .
- ^ Sualeh Fatehi. "SchemaCrawler" . GitHub .
Referenzen
- Bai, Ying (2022). SQL Server Database Programming with Java . Cham: Springer International Publishing . doi : 10.1007/978-3-031-06553-8 . ISBN 978-3-030-92686-1Die
- Horstmann, Cay (15. April 2022). Kern Java . Oracle Press Java. ISBN 978-0-13-787107-0Die
Externe Links
- JDBC-API-Leitfaden
java.sqlAPI- Javadoc -Dokumentationjavax.sqlAPI-Javadoc-Dokumentation- O/R Broker Scala JDBC-Framework
- SqlTool ist ein Open-Source-Befehlszeilenprogramm für einen generischen JDBC-Client. Es funktioniert mit jeder JDBC-fähigen Datenbank.
- JDBC-URL-Strings und zugehörige Informationen aller Datenbanken.