La tecnologia Java ha ottenuto molto successo grazie all’accesso al database tramite JDBC, concorrente dell’ormai noto ODBC.
Nell’ottica multipiattaforma, le connessioni JDBC sono studiate per poter collegarsi a qualsiasi motore di database, indipendentemente dalla sua tipologia o dalla piattaforma di utilizzo. La rivoluzione sta nel fatto che nessuna riga di codice deve essere modificata nel caso si cambi il DBMS utilizzato: ad esempio, se un’azienda decide di migrare i propri dati da un database Oracle o da DB2 della IBM a un DBMS gratuito come MySQL, non sarà necessario apportare modifiche al programma o alle righe di codice dedicate alla gestione delle connessioni. JDBC si occupa di far comunicare Java con il nuovo database senza interventi di tipo applicativo.
JDBC consente una maggiore flessibilità nello sviluppo di applicazioni multidistribuite. Possiamo programmare una soluzione su Linux ed eseguirla su Windows o Macintosh, grazie alla possibilità di interagire con qualsiasi DBMS.
JDBC è l’acronimo di Java DataBase Connectivity, ovvero la connettività di Java ai database. È composto da due componenti principali: l’implementazione delle specifiche RDBMS del vendor, anche di terze parti, conforme alle specifiche API di java.sql e l’implementazione dell’applicazione da parte del programmatore.
L’implementazione delle interfacce del vendor è definita dal package java.sql e comprende: Connection, Driver, Statement, PreparedStatement, CallableStatement, ResultSet, ResultSetMetaData e DatabaseMetaData. La maggior parte dei vendor di terze parti fornisce una documentazione dettagliata sulle connessioni JDBC e spesso include codice già pronto per l’implementazione in pacchetti .JAR, semplificando ulteriormente il lavoro del programmatore.
Grazie a questa tecnica, l’implementazione da parte del programmatore risulta piuttosto semplice. Ecco i passi essenziali:
- Caricare il Driver
- Aprire una connessione al database
- Creare un oggetto Statement
- Interagire con il database
- Gestire e visualizzare i risultati ottenuti dalle ResultSet.
Facciamo un esempio:
import java.sql.*;
public class ProvaJDBC {
public static void main (String args[]){
try {
String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
Class.forName(driver);
String url = "jdbc:odbc:myDataSource";
Connection con = DriverManager.getConnection(url, "username", "password");
Statement cmd = con.createStatement();
String query = "SELECT * FROM nomeTabella";
ResultSet res = cmd.executeQuery(query);
while (res.next()) {
System.out.println(res.getString("nomeColonna1"));
System.out.println(res.getString("nomeColonna2"));
}
res.close(); // chiudere le risorse DB è obbligatorio
cmd.close();
con.close();
}
catch (SQLException e){
e.printStackTrace();
}
catch (ClassNotFoundException e){
e.printStackTrace();
}
}
}
Come abbiamo visto, con poche righe di codice abbiamo creato una connessione a un database ODBC/JDBC sul server, indipendentemente dal tipo di database o dalla piattaforma. Nella connessione passiamo i tre dati essenziali: il nome del database, un username e la sua password. Grazie al metodo executeQuery() dell’oggetto Statement, eseguiamo l’istruzione SQL impostata precedentemente in una stringa. Infine, con un ciclo while collegato al metodo next() del ResultSet (tabella calcolata dalla query eseguita), stampiamo a schermo i valori delle prime due colonne. È fondamentale ricordarsi di utilizzare i metodi close() per ogni oggetto aperto, come ResultSet, Statement e Connection; è noto che, quando si lavora con i database, è indispensabile liberare la memoria per garantire processi più veloci.
Infine, gestiamo anche due errori da tenere in considerazione: SQLException indica quando abbiamo commesso un errore in un’istruzione SQL, mentre ClassNotFoundException è utile nel caso in cui fallisca il caricamento della classe Driver con il metodo forName() della classe Class.
Per approfondire ulteriormente il capitolo JDBC, vi invito a consultare la documentazione completa della Sun Microsystems disponibile qui, dove potrete trovare tutorial ed esempi di sviluppo.