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