Accesso ad un db con JDBC da java
Per accedere al database MySql abbiamo utilizzato l’interfaccia mysqli messa a
disposizione dal linguaggio php specificatamente per tale linguaggio, che fornisce tutte le
funzioni per accedere ai dati di un db MySQL e per manipolarli. Se però volessimo
utilizzare un altro db, non potremmo usarla, poiché le sue funzioni sono state scritte solo
per MySQL.
Per accedere ad un database da Java non esiste una classe come visto in php, ma bisogna
tiizare una tecnica più generalizzata adottata anche da php dalla versione 5.1 in poi, e
precisamente quella di utilizzare un’interfaccia unica tra programma ed i vari database in
modo da permettere la migrazione ad un altro database senza dover modificare i
programmi già scritti.
Infatti se volessimo cambiare il database al quale accedono i programmi php scritti fino ad
ora, lre a dover creare la struttura nel nuovo db e mirare i dati, dovremmo andare a
sostituire tutte le istruzioni che usano msqli_ con quelle dell’interfaccia del nuovo
database, ricompilare tutta l’applicazione e reinstallarla.
La tendenza è quindi quella di scrivere del software indipendente dal database, e a tale
scopo si usano delle Application Program Interface, comunemente chiamate API, che
seguono la seguente architettura:
Driver Manager è la parte del software che gestisce il colloquio tra l’applicazione ed i
driver specifici dei singoli database, permettendo di indicare il driver che si vuole utilizzare
e fornendo il modo per invocare in modo unico le funzioni dei vari driver.
Driver sono delle librerie (generalmente chiamati nomedbDriver.jar) che contengono le
singole funzioni API utilizzabili con il DMBS selezionato: trasformano le richieste applicative
in comandi del DBMS per il quale sono state scritte, eseguono le richieste SQL, si
occupano della gestione degli errori. C’è un driver per ogni DB: al cambio di versione del
DBMS potrebbe cambiare anche il driver, quindi bisogna fare attenzione alla versione del
driver che si usa. Il driver viene fornito direttamente dalla ditta che distribuisce il db, in
pratica è parte integrante del db e generalmente sono gratuiti.
Ogni database ha il suo driver, pertanto per poter accedere ad un DB, un programma
applicativo deve per prima cosa indicare al Driver Manager il nome del driver che intende
utilizzare, e poi potrà richiedere la connessione al DB ed eseguire le varie query utilizzando
la stessa sintassi.
ITIS A. Volta – Flavia Lollis
pag. 1
Accesso ad un db con JDBC da java
La prima implementazione di questo modello è stato ODBC (Open DataBase
Connectivity), scritto da Microsoft nel 1991 ha le seguenti caratteristiche:



Scritto in linguaggio C, richiede l’utilizzo di ulteriori API per interfacciarsi con altri
linguaggi, quindi non è conveniente per applicazioni java
Non supporta tutti i comandi SQL standard
Non è di agevole utilizzazione
Per ovviare a questi inconvenienti, nel 1996 la Sun Microsystem ha introdotto la
tecnologia JDBC (non significa Java DataBase Connectivity ma è un marchio registrato),
le cui classi, incluse nella JDK, rispettano l’architettura descritta e garantiscono la completa
portabilità.
JDBC propone alcune soluzioni, noi ci occuperemo della soluzione basata sul modello twotier con driver Java e connessione diretta al database, in cui il Driver Manager utilizza il
driver per accedere direttamente al database.
Per fare questo è necessario prima di tutto scaricare il driver che si intende utilizzare e
renderlo disponibile all’ambiente Eclipse facendo i seguenti passi:
1. Andare all’indirizzo www.mysql.com/downloads/connector/j/ e scaricare la versione
.zip del driver attualmente mysql-connector-java-5.1.38.zip
2. Estrarre dallo zip il file mysql-connector-java-5.1.38.jar e copiarlo nella cartella del
progetto dentro al workspace di eclipse
3. In eclipse fare click con il tasto destro sul nome del progetto e selezionare nei menù
proposti prima Build Path e poi Add External Archives
4.
Tramite la finestra di dialogo proposta selezionare nella cartella del progetto il file
mysql-connector-java-5.1.38.jar precedentemente copiato .
5. A questo punto le classi del progetto avranno accesso al driver
Il Driver Manager rappresenta il livello di gestione di JDBC mentre i driver realizzano la
vera comunicazione con il DB.
I passi da compiere nel programma sono i seguenti:
ITIS A. Volta – Flavia Lollis
pag. 2
Accesso ad un db con JDBC da java
1. Importazione dei package java.sql
2. Registrazione dei driver JDBC – serve per caricare in memoria la classe del
driver contenuta nel jar. Per questo la classe Class ci mette a disposizione il metodo
statico forName(nomeClasse) che restituisce l’oggetto della classe della quale si
indica il nome come parametro di tipo stringa.
L’istruzione Class.forName("com.mysql.jdbc.Driver") restituisce un oggetto della
classe Driver, cioè di quella inclusa nel jar e che è stata scritta esplicitamente per il
db al quale si vuole accedere.
3. Apertura di una connessione con il DB - si deve creare un oggetto di tipo
connessione, e per farlo si utilizza il metodo fornito dal Driver Manager:
Connection dbconn = DriverManager.getConnection(URL, user, passwd);
In cui URL è una stringa che contiene le informazioni necessarie per stabilire la
connessione con il database, quindi deve contenere l’indirizzo della macchina sulla
quale il DBMS è in ascolto (IP o alias), la porta tramite la quale colloquiare ed il
nome del database, quindi ad esempio
URL = "jdbc:mysql://localhost:3306/palestra";
Inoltre, come per tutti gli accessi anche lo user e la password per l’accesso al
database, quindi per MySQL useremo utente root senza password (psw=””)
4. Creazione di un oggetto Statement – serve per il colloquio con il db, e viene
fornito dalla connessione:
Statement st= dbconn.createStatement();
mette a disposizione tutte le funzioni necessarie al colloqui con il db, come ad
esempio l’esecuzione di una query
5. Esecuzione di una query – la sintassi prevede che ogni query restituisca un
ResultSet, cioè un oggetto di tipo ResultSet:
String q = "SELECT descrcorso, prezzo FROM corsi";
ResultSet rs= st.executeQuery(q);
L’oggetto restituito implementa l’interfaccia java.sql.ResultSet e rappresenta la
tabella generata come risultato dell’esecuzione di una query,
Utilizzazione dell’oggetto ResultSet – utilizzando i metodi messi a disposizione
si possono manipolare i dati della tabella risultato, sulle cui righe ci si può muovere
tramite un cursore gestito dai metodi messi a disposizione
boolean next() – passa alla successiva riga di dettaglio
boolean previous() – passa alla precedente riga di dettaglio
boolean absolute(int n ) – passa alla riga di posizione n
boolean relative(int n) – passa n righe più avanti
per estrarre i dati delle colonne della tabella risultato si utilizzano i metodi
getXXX(String nomeAttr)
getXXX(int index)
ove XXX è il tipo della variabile che ci aspetta (String, int, float, …) , nomeAttr è il
nome della colonna del database, index è la posizione della colonna nel resultset
(NB nel resulset e non nella struttura della tabella). Per la query dell’esempio
precedente potremo dunque scrivere
String descr = rs.getString("descrcorso");
float pr = rs.getFloat("prezzo");
oppure
String descr = rs.getString(1);
ITIS A. Volta – Flavia Lollis
pag. 3
Accesso ad un db con JDBC da java
float pr = rs.getFloat(2);
scorrendo le righe della tabella risultato con il ciclo
while (rs.next())
{
…………
}
6. Esecuzione di un comando – si opera in modo analogo alle query di selezione,
creando una stringa che contenga l’istruzione SQL da eseguire (ad esempio per
cancellare una riga “DELETE from corsi where descrcorso=’Pippo’) e si esegue il
metodo executeUpdate(comando) dell’oggetto st passandogli l’istruzione.
String co="DELETE from corsi WHERE descrcorso='Pippo'";
int r = st.executeUpdate(co);
in cui r è il numero delle righe della tabella interessate dal comando: se r=0,
significa che nessuna riga soddisfava la condizione.
7. Chiusura degli oggetti ResultSet e Statement – è necessario effettuare la
chiusura di tutti gli oggetti utilizzati con il relativo metodo close():
rs.close();
st.close();
8. Chiusura della connessione – una volta terminati tutti gli accessi va chiusa
anche la connessione
dbconn.close();
Eventuali errori sql sono intercettati e viene sollevata un’eccezione di tipo SQLException
che deve essere gestita a programma tramite un try catch.
Per il programmatore dunque l’accesso al db è indipendente dal tipo del db stesso, mentre
in php siamo legati all’utilizzo di mysqli, classe dedicata al colloquio con mysql.
Riassumendo e confrontando i due linguaggi php e java
Php
Java
import java.sql.*;
Creare connessione al db $myconn=mysqli_connect(
Eseguire una query
Scorrimento resultset
ITIS A. Volta – Flavia Lollis
"localhost”,"root", "", "db");
//*carico driver
Class.forName(driver);
//creo connessione a db
Connection dbconn =
DriverManager.getConnection(UR
L, “root”, “”);
// creo statement per eseguire i
comandi
Statement st=
dbconn.createStatement();
$q=”SELECT desc,prezzo FROM
corsi”;
$res = mysqli_query(
$myconn, $q) ;
$numr = mysqli_num_rows
($res);
for($x=0; $x<$numr; $x++)
{
$resrow =
String q = "SELECT desc, prezzo
FROM corsi";
ResultSet res=
st.executeQuery(q);
while (res.next())
{
descr=res.getString("desc");
pr = res.getFloat("prezzo");
pag. 4
Accesso ad un db con JDBC da java
chiusura
mysqli_fetch_row($resultap);
$descr = $resrow[“desc”];
$pr = $resrow[“prezzo”];
}
mysql_close($myconn);
}
rs.close();
st.close();
dbconn.close();
Dal punto di vista del programma i passi fondamentali da compiere dunque sono gli stessi
con entrambi i linguaggi, ciò che cambia è il modo di compierli: con php abbiamo utilizzato
un’unica classe mysqli che include tutte le funzioni necessarie, ma il software è dedicato
all’utilizzo di MySQL.
Con java invece utilizziamo un’architettura più generalizzata che ci permette di scrivere del
codice del tutto portabile, cioè indipendente dal tipo di database al quale accede e per
renderlo indipendente anche dalla macchina, sarà sufficiente il semplice accorgimento di
utilizzare un file di configurazione contenente le stringhe personalizzate, cioè il nome del
driver e l’URL.
Nel caso in cui si cambiasse la macchina, o il tipo di database sarà sufficiente chiudere il
servizio, modificare il file di configurazione e riavviare il servizio per realizzare le modifiche
all’applicazione.
ITIS A. Volta – Flavia Lollis
pag. 5