J D B C DISPENSE
Introduzione JDBC (Java Database Connectivity) è un interfaccia completamente Java utilizzata per eseguire istruzioni SQL sui database. L'API JDBC si trova nel pacchetto java.sql; contiene poche classi concrete, è composta principalmente da interfacce indipendenti dal database. JDB è composto da due componenti principali: una implementazione delle specifiche RDBMS del Vendor, ovvero dello specifico database (mysql, oracle, etc) che è conforme alle specifiche API di java.sql. una serie di classi che il programmatore può usare per interrogare il database indipendentemente da quale specifico database si sta usando. Per il primo punto (interfacciarsi con lo specifico database) si caricano gli appositi driver che l'azienda proprietaria dello specifio tipo di database (ese: oracle) avranno sviluppato. Prima di poter fare qualsiasi operazione con un database bisogna quindi caricare i driver. Le operazioni da eseguire per utilizzare un database quindi sono: 1. caricamento driver 2. apertura connessione al database 3. esecuzione istruzione 4. elaborazione risultato 5. chiusura connessione Ovviamente i passaggi 1, 2 e 5 li farò solo una volta, non tutte le volte che devo
interrogare il database. Vediamo i singoli passaggi. Connessione Caricare la classe corrispondente allo specifico driver (che è proprio della base di dati che si vuole utilizzare): Class.forName("com.mysql.jdbc.Driver"); Quando il driver viene caricato in memoria, si registra con la classe java.sql.drivemanager come un driver per base di dati disponibile. Ottenere una connessione alla base di dati: Connection con = DriverManager.getConnection(url,user,psw) Il valore di ritorno è un oggetto che implementa l'interfaccia java.sql.connection; La base di dati è identificata da un URL JDBC in un modo che è specifico del driver; individuare la base di dati; Durante la chiamata, l'oggetto DriverManager chiede a tutti i driver registrati se riconoscono l'url e usa quello che gli risponde di sì per costruire l'oggetto connessione. Passo l'username e la password per accedere al database Esecuzione query SQL Bisogna prima di tutto creare un oggetto Statement (classe: java.sql.statement) tramite il metodo createstatement() dell'interfaccia Connection: Statement stmt = con.createstatement(); per eseguire una query che produce dati, si usa il metodo executequery(string query) dell'oggetto Statement; i risultati vanno salvati in un oggetto ResultSet: ResultSet rs = stmt.executequery("select * FROM..."); ResultSet prende i dati dallo Statement che l'ha generato, quindi se lo Statement viene chiuso o usato per un'altra query, vengono automaticamente chiusi anche tutti gli oggetti ResultSet ad esso collegati. Per consultare il ResultSet: while(rs.next()) { String s = rs.getstring("nome attrib ); int i = rs.getint("nome attrib );... Chiudere la Connessione con il Database Per chiudere la connessione con il database utilizzo: con.close();
Vediamo 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(); Con poche righe di codice, si è creati una connesisone ad un database ODBC / JDBC nel 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. Ricordarsi sempre di utilizzare i metodi close() per ogni oggetto aperto, in questo caso per il ResultSet, per la Statement e per la Connection; infatti molti programmatori sanno che quando si lavora con i database è indispensabile liberare la memoria, anche per avere dei processi più veloci.
Operazioni di Aggiornamento Ovviamente devo poter eseguire anche query che non ritornano risultati, ovvero inserimento, modifca ed eliminazione di elementi da una tabella. L oggetto ResultSet, come si può intuire, non è più necessario visto che l operazione non restituisce più risultati. È sufficiente richiamare il metodo executeupdate() in Statement permette di effettuare operazioni che non tornano risultati ma solo il conteggio delle righe modificate. int count = stmt.executeupdate( stringa query ); Se non si sa se verranno o meno restituiti dei dati, si può usare execute() (sempre in Statement): torna un boolean true se è stato prodotto uno o più ResultSet, false se è stato tornato solo un conteggio: boolean b = stmt.execute(sql); A questo punto si possono usare i metodi getresultset() e getupdatecount(), il primo per ottenere il ResultSet in caso excecute abbia ritornato ture, il secondo per ottenere il numero di righe modificate. NB: né GetResultSet() né getupdatecount() dovrebbero venir chiamate più di una volta per richiesta.