
Accesso a database tramite JDBC
di Claudio De Sio Cesari
-Scenario
La tecnologia Java offre indubbiamente tanti vantaggi. Tra questi c'è sicuramente l'interfaccia JDBC che da qualche anno sfida "sfrontatamente" uno standard affermato come ODBC. JDBC infatti, permette alla stessa applicazione di accedere senza modifiche a diversi RDBMS. Ciò implica l'aggiunta ad un'applicazione Java, di per sé indipendente dalla piattaforma, anche l'indipendenza dal database engine. Caliamoci in uno scenario: supponiamo che una società crei un'applicazione Java che utilizza un RDBMS come DB2, lo storico prodotto della IBM. La stessa applicazione gira su diverse piattaforme come server Solaris e client Windows e Linux. Ad un certo punto, per strategie aziendali, i responsabili decidono di sostituire DB2, con un altro RDBMS questa volta di natura free: MySQL. A questo punto, l'unico sforzo da fare, è far migrare i dati da DB2 a MySQL, ma l'applicazione Java, continuerà a funzionare come prima...
-Definizione
JDBC viene spesso inteso come l'acronimo di Java Database Connectivity, anche se la Sun Microsystems non ha mai confermato tale corrispondenza. Si tratta di uno strato di astrazione software tra un'applicazione Java ed un database. La sua struttura a due livelli, permette di accedere a database engine differenti, a patto che questi supportino l'ANSI SQL 2 [1]. I due fondamentali componenti di JDBC sono:
Un'implementazione del vendor del RDBMS (o di terze parti) conforme alle specifiche delle API java.sql.
Un'implementazione da parte dello sviluppatore dell'applicazione.
-Implementazione del vendor (Driver JDBC)
Il vendor deve fornire l'implementazione di una serie di interfacce definite dal package java.sql, ovvero Driver, Connection, Statement, PreparedStatement, CallableStatement, ResultSet, DatabaseMetaData, ResultSetMetaData. Ciò significa che saranno fornite alcune classi magari impacchettate in un unico file archivio jar, che implementano i metodi delle interfacce appena citate. Solitamente tali classi appartengono a package specifici, ed i loro nomi sono spesso del tipo nomeDBnomeInterfacciaImplementata (per esempio: DB2Driver, DB2Connection...). Inoltre il vendor dovrebbe fornire allo sviluppatore anche una minima documentazione. Attualmente tutti i più importanti database engine, supportano driver JDBC [2].
-Implementazione dello sviluppatore (Applicazione JDBC)
Lo sviluppatore ha un compito piuttosto semplice: implementare del codice che sfrutta l'implementazione del vendor, seguendo pochi semplici passi. Un'applicazione JDBC deve:
Caricare un driver
Aprire una connessione con il database
Creare un oggetto Statement per interrogare il database
Interagire con il database
Gestire i risultati ottenuti
Il lettore si stupirà della semplicità e la potenza con cui verranno eseguiti tali passi studiando l'esempio che segue.
-Esempio di applicazione JDBC
Viene presentato di seguito una semplice applicazione che interroga un database. Viene sfruttato come driver l'implementazione della Sun del jdbc-odbc bridge, presente nella libreria standard di Java (JDK1.1 in poi):
-Analisi dell'esempio JDBCApp
-Conclusioni
L'argomento JDBC è tanto potente quanto facile da implementare. Si consiglia al lettore che voglia approfondire le sue conoscenze, la consultazione della documentazione della libreria standard ed in particolare dei package java.sql e javax.sql (JDK 1.4 in poi). Esiste anche un breve tutorial nella documentazione stessa ed altri sul sito http://java.sun.com/products/jdbc/index.html. Infatti, JDBC offre supporto anche alle stored procedure, alle transazioni, alle connection pool, ed altre caratteristiche avanzate per l'accesso ai database, come al solito con la classiche caratteristiche della tecnologia Java: sicurezza, semplicità, robustezza, indipendenza dalla piattaforma...
NOTE
La stragrande maggioranza dei database engine in circolazione supporta come linguaggio di interrogazione un soprainsieme dell'ANSI SQL 2. Ciò significa che esistono comandi che funzionano specificamente solo sui RDBMS su cui sono stati definiti (comandi proprietari) e che non sono parte dell'SQL standard. Questi comandi, semplificano l'interazione tra l'utente e il database, sostituendosi a comandi SQL standard più complessi. Ciò implica che è sempre possibile sostituire ad un comando proprietario del RDBMS utilizzato con un comando SQL standard, anche se più complesso. Un'applicazione Java-JDBC, che vuole mantenere una completa indipendenza dal database engine deve utilizzare solo comandi SQL standard, oppure prevedere appositi controlli lì dove si vuole per forza adoperare un comando proprietario. [torna indietro]
Esistono quattro tipologie diverse di driver JDBC caratterizzati da differenti potenzialità e strutture, per una lista aggiornata dei driver disponibili http://java.sun.com/products/jdbc/jdbc.drivers.html . [torna indietro]
Riga 6: è possibile
assegnare alla stringa driver
il nome di un altro driver disponibile (opzionale)
Riga 9: è
possibile assegnare alla stringa url
il nome di un'altra stringa di connessione (dipende dal driver JDBC
del database utilizzato e si legge dalla documentazione del driver).
Nel nostro caso, disponendo di una fonte dati (data source) ODBC
installata, basta sostituire il nome nella stringa il nome
myDataSource con quello della fonte dati.
Riga 12: è
possibile sostituire le stringhe myUserName e my Password
rispettivamente con la username e la password per accedere alla
fonte dei dati. Se non esistono username e password per la fonte
dati in questione, basterà utilizzare il metodo
DriverManager.getConnection(url).
Riga 17: sostituire nella
stringa myTable con il nome di una tabella valida
Righe 21 e 22:
sostituire le stringhe columnName1 e columnName2 con nomi di colonne
valide per la tabella in questione. [torna indietro]