Molto spesso mi capita di trovarmi di fronte a richieste di aiuto per la connessione di Java ad un database. Così mi sono messo a scrivere questo articolo in cui spiegherò come effettuare questa connessione, prendendo come modello un database MySQL e utilizzando il driver JDBC Connector-J, che è liberamente scaricabile nel sito dedicato al DBMS in questione.
Introduco questo articolo offrendo una brevissima panoramica sui vari modi a disposizione del programmatore per poter connettere un’applicazione Java con un database in generale. Vi sono essenzialmente 2 modi:
In questo articolo tratterò solamente la prima alternativa, mentre per la seconda mi limiterò a descriverla brevemente, visto che il dettaglio verrà approfondito in un prossimo articolo.
Quando si ha la possibilità di utilizzare un driver JDBC specifico per un determinato database è preferibile scegliere la prima opzione. Questo perchè l’utilizzo di un driver JDBC fornisce un accesso diretto al database, ottimizzato per esso, senza alcuna perdita di prestazioni. E’ il produttore stesso del database, infatti, che distribuisce il driver JDBC ed in questo modo vengono sfruttate a pieno tutte le caratteristiche del database. Graficamente ecco cosa succede:
Java –> Driver JDBC –> Database
Quando, invece, non si possiede un driver JDBC specifico, si può tranquillamente ricorrere al bridge JDBC-ODBC. Questa caratteristica, da un lato, offre una estrema maneggevolezza: in tutti quei casi in cui non sia facilmente reperibile un driver JDBC (a volte, infatti, non esiste un driver JDBC apposito per un database), è possibile scaricare un driver ODBC ed utilizzare un DSN ODBC di sistema per potervi accedere. Driver ODBC, infatti, esistono oramai per quasi tutti i database esistenti, essendo ODBC uno standard de facto realizzato da Microsoft per la connettività dei database.
Dall’altro lato, però, questa opportunitò ha uno svantaggio: la perdita di prestazioni. Quando si utilizza questa opzione, infatti, i passi che vengono eseguiti per la connessione sono 2: Java si connette al bridge JDBC-ODBC; questo si connette al DSN ODBC di sistema; quest’ultimmo, infine, utilizza il driver ODBC per agganciarsi al database. Graficamente, quindi:
Java –> Bridge JDBC-ODBC –> Driver ODBC –> Database
Il reperimento dei dati e gli aggiornamenti, quindi, sono più lenti perchè seguono una strada più lunga e vi è, effettivamente, una perdita di prestazioni. Ribadisco, comunque, che quest’ultima scelta è senza dubbio molto comoda in tutti quei casi in cui non si desisdera distribuire driver JDBC con l’applicazione, delegando all’utente “l’onere” di fornire un DSN ODBC per il database.
Vediamo, ora, come si fa per connettere un’applicazione Java con un database MySQL facendo uso dell’apposito driver JDBC (chiamato Connector-J). Innanzitutto è necessario scaricare il driver, direttamente dal sito di MySQL. Il seguente link permette di accedere direttamente alla pagina dedicata a Connector-J.
Poi si può scegliere una delle seguenti alternative, per poter utilizzare il driver JDBC:
Io, personalmente, preferisco la seconda alternativa poichè svincola l’utente dall’avere driver preinstallati nella macchina. Scompattando in JAR nella cartella dell’applicazione, infatti, esso sarà già disponibile per la distribuzione assieme all’applicazione; il driver sarà contenuto nel pacchetto di installazione dell’applicazione e quest’ultima saprà esattamente dove andarlo a cercare.
A questo punto tutto è pronto per la scrittura dell’applicazione. Innanzitutto è doveroso ricordare che vi sono diversi tipi di connessione al database: una connessione mediante autenticazione (con nomeutente e password) e una connessione anonima. Non sempre la connessione anonima è supportata, per questo si darà la possibilità a chi scrive l’applicazione di scegliere che tipo di connessione effettuare.
Per facilitare il tutto ho scritto una classe apposita che permette al programmatore di astrarre da tutti i dettagli della connessione vera e propria e che mette a disposizione una serie minimale di metodi per la connessione, l’interrogazione del database, l’aggiornamento, la disconnessione ed il reperimento di eventuali errori riscontrati. Il codice della classe Database.java non è stato pubblicato qui per problemi di spazio e formattazione, ma lo potete trovare al seguente link.
La classe fornisce 2 costruttori: il primo prende un solo parametro, che rappresenta il nome del database MySQL al quale connettersi (per l’accesso anonimo); il secondo, invece, prevede l’introduzione, oltre al nome del database, anche di un nome utente e di una password (per l’accesso tramite autenticazione).
Vi è poi il metodo connetti(), che permette di evitare di preoccuparsi di tutti i dettagli della connessione. Questo metodo effettua la connessione al database utilizzando tutti i parametri passati al costruttore e ritorna un valore booleano: se ritorna true la connessione è avvenuta con successo, altrimenti si sono verificati dei problemi.
Il metodo disconnetti(), al contrario, permette di terminare la connessione con il database.
Sono, poi, forniti due metodi per l’accesso al database: eseguiQuery() e eseguiAggiornamento(). Questi due metodi sono i metodi principali della classe, che sono effettivamente utilizzati per reperire le informazioni dal database e per poterlo aggiornare.
Il primo prende un parametro di tipo String, che rappresenta la query di tipo SELECT da eseguire sul database. Viene restituito un Vector contenente tutti i record restituiti dalla query, sottoforma di array di stringhe. Ciascun record, quindi, è rappresentato da un array di Stringhe, dove ciascun elemento dell’array è l’equivalente di un campo del record.
Il secondo metodo prende anch’esso una stringa come parametro, che rappresenta una query da eseguire sul database. In questo caso, però, la query che viene eseguita è di aggiornamento (UPDATE, DELETE, INSERT). Il metodo ritorna true se l’aggiornamento è andato a buon fine, false altrimenti.
Se vi sono stati degli errori è possibile reperirli tramite il metodo getErrore() che ritorna il messaggio dell’ultimo errore che è avvenuto.
Vi è poi il metodo isConnesso() che indica se l’applicazione ha effettuato effettivamente la connessione con il database oppure no. Questo meotdo ritorna true se il metodo connetti() ha ritornato true e, viceversa, ritorna false se il metodo connetti() ha ritornato false.
Vediamo un semplice esempio di utilizzo di questa classe. Come possiamo vedere è molto semplice utilizzarla e non ci si deve preoccupare di tutta la gestione della connessione e delle relative eccezioni che possono essere lanciate:
Database db = new Database("nome");
if ( !db.connetti() ) {
System.out.println("Errore durante la connessione.");
System.out.println( db.getErrore() );
System.exit(0);
}// Eseguo una query sul database. La tabella si chiama Tbl.
Vector v = db.eseguiQuery( "SELECT * FROM Tbl;" );
// Stampiamo i risultati:
i = 0;
while ( i<v.size() ) {
String[] record = (String[]) v.elementAt(i);
System.out.println("Record numero " + (i+1) );
for (int j=0; j<record.length; j++) {
System.out.println( record[j] );
}
}// Eseguo un aggiornamento sul campo 'nomecampo' della tabella Tbl:
String qry = "UPDATE Tbl SET nomecampo=valore WHERE nomecampo>0;";
if ( !db.eseguiAggiornamento(qry) ) {
System.out.println("Errore nell'aggiornamento!");
System.out.println( db.getErrore() );
}// Ora chiudo la connessione col Database:
db.disconnetti();
Come ho già detto, questa classe offre un set minimale di metodi per l’accesso al database. E’ possibile (anzi, auspicabile) ampliarla in modo da poter offrire anche tutto un set di metodi per il reperimento dei Metadati, per l’utilizzo dei PreparedStatement e per altri scopi, ma questo esula dagli obiettivi di questo articolo.
Per qualsiasi altra informazione, dubbio o richiesta, come sempre affidatevi ai commenti! Buona Programmazione.
Tags:bridge connessione database dbms driver dsn java jdbc mysql odbc
2 Risposte
nino
March 21st, 2008 at 10:38
1Estremamente semplice e “sereno”,ma chiaramente concreto !
Spero di trovarne ancora di queste lezioni.
BradipoMissile
March 21st, 2008 at 13:39
2@ nino
Grazie mille per il tuo commento, sono contento che la lezione ti sia stata d’aiuto. Ovviamente il merito dell’articolo va a LeleFT!
RSS Iscriviti ai Feed dei commenti di questo articolo · TrackBack URI
Lascia un commento... please!!!
Autori
Categories
Calendario
Tag Cloud
Sondaggio
Blog Amici
Gente "Avanti"
Siti Interessanti
Benvenuto!
Pensieri / Aggiornamenti
Qualche statistica
Blog segnalato su