Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
API
java.sql: questo pacchetto contiene tutte le classi principali necessarie per l'accesso al database,
è essenziale per qualsiasi applicazione Java che necessita di interagire con un database. Le classi
Programmazione a oggetti 15
principali in questo pacchetto includono , , , , e altre
Connection Statement ResultSet PreparedStatement
classi utilizzate per eseguire query SQL e manipolare i dati nel database.
javax.sql: aggiunge funzionalità opzionali all'API JDBC, specialmente utili per le applicazioni
enterprise.
Architettura
JDBC API: è un'API basata esclusivamente su Java che fornisce un insieme di classi e interfacce per
interagire con i database. Questa parte non dipende dal database specifico che si sta utilizzando.
JDBC Driver Manager: questo gestore comunica con i driver specifici del fornitore che effettuano la
vera comunicazione con il database. I driver JDBC agiscono come traduttori, convertendo le chiamate
dell'API JDBC nel formato specifico richiesto dal database. Questa traduzione avviene sul client, il che
significa che non sono necessarie modifiche al server del database. Tuttavia, è necessario avere
installato il driver appropriato sul client per garantire la corretta comunicazione con il database.
Drivers
ODBC (Open Database Connectivity) inserisce uno strato intermedio, chiamato driver del database,
tra un'applicazione e il DBMS. Questo strato ha il compito di tradurre le query di dati dell'applicazione
in comandi comprensibili per il DBMS. Affinché ciò funzioni, sia l'applicazione che il DBMS devono
essere conformi a ODBC, il che significa che l'applicazione deve essere in grado di emettere comandi
ODBC e il DBMS deve essere in grado di rispondere ad essi.
Esistono quattro tipi di driver:
Type I (JDBC-ODBC Bridge Driver): Questo driver agisce come un ponte tra JDBC e ODBC,
utilizzando un driver ODBC per comunicare con il database sottostante. Sebbene consenta una
connessione tra applicazioni Java e database che supportano ODBC, è considerato inefficiente e
limitato. La presenza di molteplici livelli di traduzione introduce latenza e complessità, rendendolo
una scelta poco adatta per applicazioni ad alte prestazioni.
Type II (Native-API Driver): Il driver Type II interagisce direttamente con le API native del database,
bypassando l'ODBC. Questo approccio migliora l'efficienza rispetto al Type I, poiché riduce i livelli
di traduzione. Tuttavia, questo tipo di driver è strettamente legato all'esistenza di API native
specifiche per ogni database, rendendolo meno portabile. L'utilizzo di driver Type II implica spesso
una maggiore complessità di configurazione e una dipendenza da librerie native specifiche del
sistema operativo.
Type III (Network Protocol Driver): Il driver Type III introduce un componente middleware in
esecuzione su un server remoto. Questo middleware gestisce le richieste del database utilizzando
un protocollo di rete (Net protocol) indipendente dal database stesso. Questo approccio consente
una maggiore flessibilità e indipendenza dalla piattaforma, poiché il middleware può essere
ottimizzato per vari database. Tuttavia, la necessità di un server middleware aggiunge un livello di
complessità e potenziali punti di fallimento nell'infrastruttura.
Type IV (Thin Driver): Il driver Type IV, completamente scritto in Java, comunica direttamente con
il database utilizzando il protocollo nativo del database. È il driver più efficiente poiché elimina la
necessità di ulteriori livelli di traduzione, passando le richieste direttamente al database. Inoltre, la
sua implementazione interamente in Java lo rende altamente portabile e facile da distribuire, senza
Programmazione a oggetti 16
la necessità di librerie esterne o middleware. Questa combinazione di efficienza e semplicità di
distribuzione lo rende la scelta preferita per molte applicazioni moderne.
Utilizzando la proprietà di sistema , è possibile configurare dinamicamente l'elenco dei
jdbc.drivers
driver JDBC che l'applicazione deve utilizzare, semplificando il processo di gestione dei driver JDBC e
consentendo una maggiore flessibilità nell'applicazione.
Connessione al Database - Componenti
1. Driver Manager: si occupa del caricamento dei driver del database e della gestione delle
connessioni tra l'applicazione e il driver. È responsabile di inizializzare il driver appropriato per il
database desiderato e stabilire la connessione ad esso.
2. Driver: il driver traduce le chiamate dell'API JDBC in operazioni specifiche per il database. Funge
da ponte tra l'applicazione e il database, consentendo all'applicazione di inviare comandi SQL al
database e di ricevere i risultati.
3. Connection: rappresenta una sessione attiva tra l'applicazione e il database. Una volta stabilita,
consente all'applicazione di eseguire query, aggiornamenti e altre operazioni sul database.
4. Statement: è un'istruzione SQL utilizzata per eseguire query o aggiornamenti sul database.
5. Metadata: fornisce informazioni sull'insieme dei dati restituito da una query, sul database stesso e
sul driver JDBC utilizzato. Include dettagli come i nomi delle colonne, i tipi di dati e altre
informazioni utili sull'ambiente del database.
6. Result Set: È un insieme logico di colonne e righe di dati restituite dall'esecuzione di un'istruzione
SQL, come una query di selezione. Consente all'applicazione di iterare attraverso i risultati e
recuperare le informazioni desiderate dalle righe restituite dal database.
Step da seguire
Importare le classi necessarie.
Caricare il driver JDBC.
Identificare la fonte dati (definire l'URL di connessione).
Stabilire la connessione.
Creare un oggetto Statement.
Eseguire la stringa di query utilizzando l'oggetto Statement.
Recuperare i dati dal ResultSet restituito.
Chiudere ResultSet, Statement e oggetto Connection nell'ordine corretto.
Prima di comunicare con un database utilizzando JDBC, è necessario caricare il driver JDBC
corrispondente. Ci sono diversi modi per farlo:
1. Caricamento dinamico: Puoi caricare dinamicamente il driver utilizzando il metodo
. Questo approccio è comune quando il nome del driver è noto a
Class.forName(String drivername)
tempo di esecuzione.
Programmazione a oggetti 17
2. Caricamento automatico: Il sistema può caricare automaticamente il driver JDBC utilizzando la
proprietà di sistema . Questo è utile quando si desidera configurare il caricamento del
jdbc.drivers
driver in modo automatico, senza doverlo specificare esplicitamente nel codice.
Indipendentemente dal metodo utilizzato per il caricamento, è importante notare che un'istanza del
driver deve essere registrata con la classe . Questo può avvenire in due modi:
DriverManager
Registro esplicito: Ogni classe Driver creerà tipicamente un'istanza di se stessa e la registrerà con
il DriverManager. Questo può essere fatto chiamando esplicitamente il metodo registerDriver(Driver)
della classe DriverManager.
Registro automatico: Alcuni driver possono registrarsi automaticamente chiamando il metodo
della classe DriverManager all'interno del loro codice di inizializzazione
registerDriver(Driver)
statica. In questo caso, non è necessario creare un'istanza del driver o registrarla esplicitamente
nel codice.
URL
Le URL JDBC forniscono un modo per identificare un database e sono utilizzate per stabilire la
connessione ad esso:
Protocollo ( ): Il protocollo specifica il metodo di accesso al database. Nelle URL JDBC, il
protocol
protocollo è sempre .
jdbc
Sottoprotocollo ( ): Il sottoprotocollo identifica il driver del database che sarà utilizzato
subprotocol
per comunicare con il database. Ad esempio, per un database MySQL, il sottoprotocollo potrebbe
essere .
mysql
Sottotipo ( ): Il sottotipo è il nome o l'indirizzo del database a cui ci si desidera connettere.
subname
Può includere informazioni aggiuntive come il nome del database, la porta del server e altre
informazioni di connessione. Ad esempio, potrebbe essere un sottotipo per
localhost:3306/database
un database MySQL che si trova sulla stessa macchina locale sulla porta 3306.
Esempi: jdbc:cloudscape:Movies - jdbc:odbc:Movies
Creazione e chiusura connessione
Esistono tre metodi per connettersi al database: ;
public static Connection getConnection(String url) ;
public static Connection getConnection(String url, Properties info) .
public static Connection getConnection(String url, String user, String password)
Dato che una macchina supporta un numero limitato di connessioni (quanti sono i thread) è importante
chiuderle quando non sono più necessarie, per farlo si utilizza .
conn.close()
Statements
Sono oggetti utilizzati per eseguire query SQL sul database. Ecco una spiegazione più dettagliata:
1. Creazione di uno Statement: Per creare un oggetto , devi prima ottenere una connessione
Statement
al database utilizzando l'oggetto . Una volta ottenuta la connessione, puoi creare un
Connection
Programmazione a oggetti 18
nuovo oggetto chiamando il metodo sull'oggetto .
Statement createStatement() Connection
Statement statement = connection.createStatement();
2. Esecuzione di una query SQL: Dopo aver creato lo Statement, puoi utilizzarlo per eseguire una
query SQL sul database. Puoi eseguire query di selezione ( ), aggiornamento ( , ,
SELECT INSERT UPDATE
) o altri comandi SQL.
DELETE
String query = "SELECT * FROM my_table";
ResultSet resultSet = statement.executeQuery(query);
3. Esecuzione di aggiornamenti del database: Se desideri eseguire comandi SQL che modificano i
dati nel database, puoi utilizzare il metodo dello Statement.
executeUpdate()
String updateQuery = "UPDATE my_table SET column1 = value WHERE condition";
int rowsAffected = statement.executeUpdate(updateQuery);
È importante sottolineare che se vogliamo soltanto ottenere i dati dal nostro
database utilizziamo : principalmente utilizzando comandi di tipo
executeQuery()
, restituisce un oggetto che contiene i dati ottenuti dalla query.
Select ResultSet
Se invece vogliamo modificare dati nel database si utilizza : la
executeUpdate()
query SQL deve contenere comandi di tipo , o . Restituisce il
Update Insert Delete
numero di righe influenzate dalle operazioni di aggiornamento.
Poi ancora abbiamo setQueryTimeout che viene utilizzato per specificare un
ritardo massimo da attendere per i risultati delle query. Se il tempo limite viene
superato prima che i risultati siano disponibili, verrà generata un'eccezione di
tipo SQLException.
4. Chiusura dello Statement: Dopo aver utilizzato lo Statement, è importan