Programmering

Hvad er JDBC? Introduktion til Java Database Connectivity

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:

  1. JDBC API understøtter kommunikation mellem Java-applikationen og JDBC-manager.
  2. 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.

JavaWorld /

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:

  1. Installer eller find den database, du vil have adgang til.
  2. Inkluder JDBC-biblioteket.
  3. Sørg for, at den JDBC-driver, du har brug for, er på din klassesti.
  4. Brug JDBC-biblioteket til at oprette forbindelse til databasen.
  5. Brug forbindelsen til at udstede SQL-kommandoer.
  6. 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 er Datakilde, bruges til sammenkobling af forbindelser. )
  • SQLException håndterer SQL-fejl mellem Java-applikationen og databasen.
  • ResultSet og Udmelding 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æringers og ResultSets 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 PreparedStatements 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 PreparedStatements.

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 , 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.

$config[zx-auto] not found$config[zx-overlay] not found