JDBC (Java Database Connectivity) er Java API, der administrerer forbindelse til en database, udsender forespørgsler og kommandoer og håndterer resultatsæt opnået fra databasen. Udgivet som en del af JDK 1.1 i 1997 var JDBC en af de første komponenter, der blev udviklet til Java-persistenslaget.
JDBC blev oprindeligt udtænkt som et klientsides-API, hvilket gjorde det muligt for en Java-klient at interagere med en datakilde. Det ændrede sig med JDCB 2.0, som inkluderede en valgfri pakke, der understøtter JDBC-forbindelser på serversiden. Hver ny JDBC-frigivelse siden da har vist opdateringer til både pakken på klientsiden (java.sql
) og pakke på serversiden (javax.sql
). JDBC 4.3, den nyeste version i skrivende stund, blev frigivet som en del af Java SE 9 i september 2017.
Denne artikel præsenterer en oversigt over JDBC efterfulgt af en praktisk introduktion til brug af JDBC API til at forbinde en Java-klient med SQLite, en let relationsdatabase.
Hvordan JDBC fungerer
JDBC er udviklet som et alternativ til den C-baserede ODBC (Open Database Connectivity) API og tilbyder en programmeringsgrænseflade, der håndterer mekanikken i Java-applikationer, der kommunikerer med en database eller RDBMS. JDBC-grænsefladen består af to lag:
- JDBC API understøtter kommunikation mellem Java-applikationen og JDBC-manager.
- JDBC-driveren understøtter kommunikation mellem JDBC-manager og databasedriveren.
JDBC er den almindelige API, som din applikationskode interagerer med. Under det er den JDBC-kompatible driver til den database, du bruger.
Figur 1 er en arkitektonisk oversigt over JDBC i Java-persistenslaget.

Brug af JDBC til at oprette forbindelse til en database
En af de heldige fakta ved programmering i Java-økosystemet er, at du sandsynligvis vil finde et stabilt JDBC-databasestik til den database, du vælger. I denne vejledning bruger vi SQLite til at lære JDBC at kende, primært fordi det er så let at bruge.
Trinene til at oprette forbindelse til en database med JDBC er som følger:
- Installer eller find den database, du vil have adgang til.
- Inkluder JDBC-biblioteket.
- Sørg for, at den JDBC-driver, du har brug for, er på din klassesti.
- Brug JDBC-biblioteket til at oprette forbindelse til databasen.
- Brug forbindelsen til at udstede SQL-kommandoer.
- Luk forbindelsen, når du er færdig.
Vi gennemgår disse trin sammen.
Find en JDBC-driver
For at finde en driver til den database, du vil bruge, skal du blot foretage en websøgning efter din database og JDBC. Indtast f.eks. "mysql jdbc driver
"vil vise en driver til MySQL. Jeg udfordrer dig til at finde en Java-kompatibel database uden en JDBC-driver!
Trin 1. Download og installer SQLite
SQLite er en meget kompakt database. Det er ikke beregnet til produktionsbrug, men er et godt valg til hurtigt at afprøve ting. SQLite bruger en fil som sin funktionelle database uden at kræve nogen service- eller dæmoninstallationer.
For at komme i gang med denne demo skal du downloade SQLite-eksempeldatabasen. Pakk ud .db
fil og gem den et sted, du ikke vil glemme.
Denne fil indeholder både en funktionel filbaseret database og et eksempelskema og data, vi kan bruge.
SQL og JDBC
NoSQL er blevet populært i løbet af det sidste årti, men relationsdatabaser er stadig den mest almindelige type datalager, der er i brug. EN relationsdatabase er et struktureret lager, der består af tabeller med kolonner og rækker. SQL (Structured Query Language) er det sprog, som arkitekter bruger til at gøre ting som at oprette, læse, opdatere og slette nye poster i en relationsdatabase. JDBC er en adapterlag fra Java til SQL: det giver Java-udviklere en fælles grænseflade til at oprette forbindelse til en database, udstede forespørgsler og kommandoer og administrere svar.
Trin 2. Importer JDBC til din Java-applikation
Vi kunne gøre vores kodning i en IDE, men kodning direkte i en teksteditor vil bedre demonstrere JDBCs enkelhed. For at begynde med skal du have en kompatibel JDK-installation til dit operativsystem.
Forudsat at du har Java-platformudviklerværktøjerne installeret, kan vi starte med at oprette et simpelt Java-program. Indsæt koden, der vises i Listing 1. i din teksteditor. Ring til denne fil WhatIsJdbc.java
.
Notering 1. Et simpelt Java-program
klasse WhatIsJdbc {public static void main (String args []) {System.out.println ("Hello JavaWorld"); }}
Kompilér nu koden ved at indtaste kommandoen: javac WhatIsJdbc.java
. Kompilering vil output WhatIsJdbc.class
fil. Udfør denne fil fra kommandolinjen med opkaldet: java WhatIsJdbc
.
[Se "Hvad er JDK? Introduktion til Java Developer Kit" for mere om interaktion med JDK på kommandolinjen.]
Når du har et grundlæggende Java-program, kan du medtage JDBC-bibliotekerne. Indsæt koden fra liste 2 i spidsen for dit enkle Java-program.
Liste 2. Import af JDBC
import java.sql.Connection; importere java.sql.DriverManager; import java.sql.SQLException; importere java.sql.ResultSet; import java.sql.Statement;
Hver af disse importer giver adgang til en klasse, der letter standard Java-databaseforbindelse:
Forbindelse
repræsenterer forbindelsen til databasen.DriverManager
opnår forbindelsen til databasen. (En anden mulighed erDatakilde
, bruges til sammenkobling af forbindelser. )SQLException
håndterer SQL-fejl mellem Java-applikationen og databasen.ResultSet
ogUdmelding
modeller dateresultatsæt og SQL-sætninger.
Vi ser snart hver af disse i aktion.
Trin 3. Føj JDBC-driveren til din klassesti
Dernæst tilføjer du SQLite-driveren til din klassesti. EN JDBC-driver er en klasse, der implementerer JDBC API til en bestemt database.
Download SQLite-driveren fra GitHub. Sørg for at få den nyeste .krukke
arkiv og gem det et sted, du kan huske.
Næste gang du udfører dit Java-program, trækker du det .krukke
fil ind via klassestien. Der er flere måder at indstille klassestien på. Liste 3 viser, hvordan man gør det ved hjælp af en kommandolinjekontakt.
Fortegnelse 3. Udførelse af SQLite-driver på Java-klassestien
java.exe -classpath /path-to-driver/sqlite-jdbc-3.23.1.jar :. WhatIsJdbc
Bemærk, at vi har indstillet klassestien til at pege på føreren og den lokale telefonbog på denne måde finder Java stadig vores klassefil.
Trin 4. Få en databaseforbindelse
Klassestien har nu adgang til føreren. Nu skal du ændre din enkle Java-applikationsfil, så den ligner programmet i Listing 4.
Fortegnelse 4. Brug af JDBC Connection-klassen til at oprette forbindelse til SQLite
import java.sql.Connection; importere java.sql.DriverManager; import java.sql.SQLException; importere java.sql.ResultSet; import java.sql.Statement; klasse WhatIsJdbc {public static void main (String [] args) {Connection conn = null; prøv {String url = "jdbc: sqlite: path-to-db / chinook / chinook.db"; conn = DriverManager.getConnection (url); System.out.println ("Fik det!"); } fange (SQLException e) {throw new Error ("Problem", e); } endelig {prøv {hvis (conn! = null) {conn.close (); }} fange (SQLException ex) {System.out.println (ex.getMessage ()); }}}}
Kompilér og udfør denne kode. Forudsat at alt går godt, får du en bekræftende besked.
Ingen passende chauffør fundet?
Hvis du har modtaget en fejl, der ligner "Ingen egnet driver fundet til jdbc: sqlite
, "så skal du besøge klassestien igen og sørge for, at den peger på den driver, du downloadede. Mislykket driverforbindelse er den mest almindelige anstødssten for begyndere, der bruger JDBC. Sved det ikke; bare rett det.
Nu er vi klar til nogle SQL-kommandoer.
Trin 5. Forespørg på databasen
Med liveforbindelsesobjektet i hånden kan vi gøre noget nyttigt, som at spørge databasen. Liste 5 viser, hvordan man forespørger om SQLite ved hjælp af JDBC Forbindelse
og Udmelding
genstande.
Fortegnelse 5. Forespørgsel på databasen med JDBC
import java.sql.Connection; importere java.sql.DriverManager; import java.sql.SQLException; importere java.sql.ResultSet; import java.sql.Statement; klasse WhatIsJdbc {public static void main (String [] args) {Connection conn = null; prøv {String url = "jdbc: sqlite: path-to-db-file / chinook / chinook.db"; conn = DriverManager.getConnection (url); Erklæring stmt = null; Strengeforespørgsel = "vælg * fra albums"; prøv {stmt = conn.createStatement (); ResultSet rs = stmt.executeQuery (forespørgsel); while (rs.next ()) {String name = rs.getString ("title"); System.out.println (navn); }} catch (SQLException e) {throw new Error ("Problem", e); } endelig {if (stmt! = null) {stmt.close (); }}} fangst (SQLException e) {kast ny fejl ("Problem", e); } endelig {prøv {hvis (conn! = null) {conn.close (); }} fange (SQLException ex) {System.out.println (ex.getMessage ()); }}}}
I Listing 5 bruger vi vores Forbindelse
gøre indsigelse mod at opnå en Udmelding
objekt: conn.createStatement ()
. Vi bruger derefter dette objekt til at udføre en SQL-forespørgsel: stmt.executeQuery (forespørgsel)
.
Det executeQuery
kommando returnerer a ResultSet
objekt, som vi derefter bruger til at gentage dataene med mens (rs.next ())
. I dette eksempel skal du se de albumtitler, vi har spurgt om, som output.
Bemærk, at vi også lukkede forbindelsen via et opkald til tilslutning ()
.
Netværksforbindelser med JDBC
Databaseforbindelsesstrengen i liste 5 er til en lokal forbindelse: jdbc: sqlite: sti-til-db-fil / chinook / chinook.db
. For at få adgang til databasen via et netværk, skal forbindelsesstrengen omfatte netværks-URL og (normalt) legitimationsoplysninger for at få adgang til den.
Gør mere med JDBC
Indtil videre har vi dækket det grundlæggende ved at bruge JDBC til at oprette forbindelse til en database og udstede SQL-kommandoer. Mens Erklæringer
s og ResultSet
s fungerer godt til almindelige scenarier, har du sandsynligvis brug for yderligere muligheder for større eller mere komplekse applikationer. Heldigvis udvikler JDBC-biblioteket sig fortsat for at imødekomme de fleste behov for databaseadgang.
PreparedStatements
En nem måde at øge fleksibiliteten på din kode på er at erstatte Udmelding
klasse med PreparedStatement
, som vist i liste 6.
Liste 6. Brug af JDBC PreparedStatements
String prepState = "indsæt i albumværdier (?,?);"; PreparedStatement prepState = connection.prepareStatement (sql); prepState.setString (1, "Oprising"); prepState.setString (2, "Bob Marley and the Wailers"); int rowsAffected = preparedStatement.executeUpdate ();
PreparedStatement
erstatter Udmelding
's hårdkodede værdier med spørgsmålstegn (?
). Ved brug af PreparedStatement
s optimerer din kode til genbrug: a PreparedStatement
er kun samlet en gang og kan derefter genbruges med en række parametre. Når din kodebase vokser, indsætter du blot nye værdier i udsagnet i stedet for at hacke selve strengobjektet.
Batchopdateringer
Når en applikation har flere opdateringer at udstede, kan det i høj grad gavne ydeevnen at gøre dem i batches. Essensen af batching er at tage de mange opdateringer og samle dem sammen og derefter udstede dem alle på én gang. Listing 7 bruger JDBC's batchmetoder til at udføre en batchopdatering på flere PreparedStatement
s.
Fortegnelse 7. Batching med PreparedStatement
prepState.setString (1, "Oprising"); prepState.setString (2, "Bob Marley and the Wailers"); preparedStatement.addBatch (); prepState.setString (1, "Wildflowers"); prepState.setString (2, "Tom Petty and the Heartbreakers"); preparedStatement.addBatch (); int [] rowsAffected = preparedStatement.executeBatch ();
JDBC-transaktioner
Transaktioner i relationsdatabaser tillader, at et sæt opdateringer pakkes ind i en interaktion, der enten lykkes eller mislykkes helt. Grundlæggende ved at bruge en transaktion via JDBC er at fortælle systemet at dreje af auto-commit, og derefter fortælle systemet manuelt at begå, når du er færdig. Auto-commit er som standard på, hvilket betyder hver gang en executeUpdate
eller executeInsert
køres, kommandoen er begået.
Liste 8 viser et lille udsnit af en JDBC-transaktion.
Notering 8. JDBC-transaktioner
connection.setAutoCommit (false); // Brug executeUpdate flere gange connection.commit ();
Hvornår connection.commit ()
er stødt på, vil alle opdateringer, der er pakket indvendigt, blive forsøgt, og hvis nogen fejler, rulles de alle tilbage.
Der er mange flere funktioner i JDBC 4.3, der er værd at udforske, inklusive brug CallableStatement
til lagrede procedurer ved hjælp af Datakilde
objekter til forbedret applikationsydelse (især via pooling af forbindelser) og konvertering af et JDBC ResultSet til en Java Stream.
Databasespecifikke funktioner
Selvom hver JDBC-kompatibel database tilbyder de samme kernefunktioner til at oprette forbindelse og interagere med en database via SQL, gør nogle databaser mere end andre. Som et eksempel tilbyder Oracle DB resultatcaching, hvilket ikke kræves af JDBC-specifikationen. Her er et eksempel:
conn.prepareStatement ("vælg / * + resultat_cache * / * fra medarbejdere, hvor medarbejder_id <: 1");
Dette eksempel er taget fra dokumentationen til Oracle's JDBC OCI Driver.
Konklusion
JDBC er en af Javas ældste API'er, der giver en brugervenlig løsning til et af de flerårige behov ved Java-applikationsudvikling. At kende kun de få JDBC-opkald, der er vist i denne artikel, får dig i gang med at bruge JDBC til at oprette forbindelse til stort set enhver database. Når du har fået disse kommandoer nede, kan du begynde at udforske nogle af de mere sofistikerede muligheder, der er indbygget i JDBC.
Mens JDBC er tilstrækkelig til enklere applikationer, vil de fleste udviklere i sidste ende se på Java Persistence API (JPA) for at udvikle et mere formelt dataadgangslag. JPA kræver mere up-front arbejde og en mere sofistikeret forståelse af applikationsarkitekturen, men det giver dig et mere konsistent, isoleret og veldefineret dataadgangslag. Se ledsageren til denne artikel, "Hvad er JPA? Introduktion til Java Persistence API" for at få mere at vide om udvikling af datapersistenslaget til dine Java-applikationer.
Denne historie, "Hvad er JDBC? Introduktion til Java Database Connectivity" blev oprindeligt udgivet af JavaWorld.