JDBC(TM) Database Access
Introduzione Nato nel 1996 1998 JDBC2 (cursori scorrevoli, supporto tipi SQL avanzati) JDBC3 in fase di rilascio JDBC e ODBC si basano sulla stessa idea: comunicare con il gestore dei driver che usa i driver registrati per comunicare con il DB Elenco driver: http://industry.java.sun.com/products/jdbc/drivers
Schema JDBC Applicazione java API JDBC Gestore driver JDBC API driver JDBC Bridge JDBC/ODBC Driver JDBC Se non ho il driver JDBC per quel db uso la seconda strada ma non è performante e non è supportato driver ODBC DB DB
Tipi di driver JDBC/ODBC bridge , lento Scritti parte in Java e parte in codice nativo comunicano con API client DB. Occorre installare libreria Java e codice specifico per la piattaforma Librerie Java pure che usano un protocollo indipendente dal db che inviano richieste a componente server che traduce nel protocollo specifico del DB Librerie JAVA pure che traducono direttamente nel protocollo specifico del DB 1 e 2 non si usano mai. 3 e 4 sì. Dettagli irrilevanti per noi.
Uso tipico di JDBC Two tier (due livelli) funziona ma è critica busisness e viste collegate Tree tier (tre livelli) logica di business e viste scollegati (è meglio) Client (presentazione visiva) JDBC Protocollo db DB Client (presentazione visiva) HTTP,RMI,ecc.. DB Logica di business JDBC Protocollo db
Installazione di JDBC JDBC è stato progettato per rendere le cose semplici. Questo significa che l'API JDBC rende facile la gestione dei compiti del db, come semplice SELECT. La prima cosa che dovete fare è verificare che ci sono le seguenti impostazioni. Per fare questo dovete sequire le seguenti fasi: Installare Java e JDBC sulla vostra macchina. Installare un driver sulla vostra macchina Installare un DBMS se necessario
Url di database Sintassi (per collegarsi al db) simile a URL internet Sintassi generica jdbc:nom sottoprotocollo: altro Es. jdbc:db2:MIODATABASE jdbc:pointbase:MIODATABASE jdbc:odbc:rubrica Per MySQL si usa: jdbc:mysql://localhost:3306/nomeDB Per Oracle si usa: jdbc:oracle:thin:@localhost:1521:xe
Creare la connessione Nomi delle classi driver JDBC com.ibm.db2.jdbc.app.DB2Driver (file tipo classs) com.mysql.jdbc.Driver (MySQL) oracle.jdbc.driver.OracleDriver (Oracle) Referenziare la libreria contenente il driver (.zip o .jar) classpath o IDE Registrare il driver caricandone la classe Class.forName (“oracle.jdbc.driver.OracleDriver“); Registrare il driver nel driver manager Impostare le proprietà di sistema via codice ad esempio leggendole da un file di proprietà
Aprire la connessione Si apre la connessione con la classe Connection Connection conn= DriverManager.getConnection(url,username,password); (restituisce un oggetto connection) Es. Connection conn = DriverManager.getConnection(“jdbc:oracle:thin:@localh ost:1521:xe”,“ ad”,“pass”);
Esempi Esempio di JDBC-ODBC bridge (compilato) Esempio di driver JDBC per PointBase (compilato)
Eseguire comandi SQL Creare un oggetto Statement Statement stat= conn.createStatement(); Creare la stringa SQL String command= “UPDATE libri SET prezzo=prezzo-5.00 WHERE titolo NOT LIKE ‘%HTML%’” Chiamare il metodo executeUpdate restituisce un intero, le righe influenzate dal comando) stat.executeUpdate(command); Per estrarre dati si esegue ExecuteQuery che restituisce un oggetto di tipo ResultSet ResultSet rs = stat.executeQuery(“SELECT * FROM libri”); Il metodo generico execute restituisce un valore boolean che si può testare per sapere se l’SQL restituisce un ResultSet
Eseguire comandi SQL (cont.) Occorre poi ciclare sul result set while(rs.next()) { rs.getString(1); //accesso tramite indice colonna, inizia //da 1 non da zero rs.getDouble(“prezzo”); } Nota: tipi di dati Java non proprio uguali a quelli SQL (pag298 man Java2)
METADATI Servono pe ottenere informazioni sul databse o sulla tabella Info sul database DatabaseMetaData meta= conn.getMetaData(); ResultSet rs = meta.getTables(null, null, null,new String[] {“TABLE”}); Restituisce un set di risultati con info su tutte le tabelle Info su una tabella ResultSetMetaData metatab= rs.getMetaData(); for(int i=0;i<metatab.getColumnCount();i++) {String nomeCol = metatab.getColumnLabel(i); ..}
JDBC2 Result set scorrevoli In JDBC1 esisteva solo il metodo next(), JDBC2 prevede anche il metodo previous() e la possibilità di avere un resultset modificabile(JDBC1 no) Statement stat = conn.createStatement(type, concurrency); Es. Statement stat = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSI TIVE,ResultSet.CONCUR_READ_ONLY); permette di avere rs scorrevole e non sensibile a modifiche apportate al db e in sola lettura Altri metodi sono: absolute(n), relative(n),first(),last(),beforeFirst(), afterLast(),isFirst,etc.
JDBC2(cont) Result set aggiornabile Statement stat= conn.createStatement(ResultSet.TYPE_SCROLL_INSENSI TIVE,ResultSet.CONCUR_UPDATABLE); Per aggiornare ResultSet rs= stat.executeQuery(“select * from libri”); while(rs.next()) { double prezzo=rs.getDouble(“prezzo”); rs.updateDouble(“prezzo”,prezzo*1.2); rs.updateRow(); } updateRow rende le modifiche permanenti sul db anche deleteRow() e insertRow()
Transazioni Le transazioni servono per garantire integrità del DB(tutte op a buon fine o annullate) Per default connessione in modo autocommit (inviati subito) Per transazione conn.setAutoCommit(false); Statement stat= conn.createStatement(); stat.executeUpdate(cmd1); stat.executeUpdate(cmd2); conn.commit() o se errore conn.rollback()