Programmazione Java Avanzata Spring - JDBC Ing. Gianluca Caminiti Riferimenti Spring http://www.springsource.org/ (scaricate il reference) Beginning Spring 2 - From Novice to Professional. APress. 2008 (Capitoli 4 e 5). Overview della Struttura Overview della Struttura Core Container Inversion Of Control (IoC) e Dependency Injection; Bean - creazione, gestione e manipolazione di oggetti (beans). Context – aggiunge le funzionalità JNDI, EJB, JMX, internazionalizzazione(I18N), ecc. Expression Language - linguaggio per interrogare e modificare oggetti a runtime. Data Access/Integration Livello di astrazione per l'accesso ai dati mediante tecnologie eterogenee tra loro (JDBC, Hibernate, ecc.) Spring AOP Aspect Oriented Programming. Supporto delle operazioni trasversali tra più oggetti (es. logging). Web Spring MVC Framework (moduli Web-Servlet e Web-Portlet). Testing Integrazione con JUnit, e presenza di Mock objects per il testing del codice in isolamento. DAO Il pattern Data Access Object (DAO) ha lo scopo di disaccoppiare l'accesso ai dati rispetto alla loro effettiva memorizzazione, fornendo un’astrazione per le operazioni da compiere sul database. Esso nasconde alle classi che si trovano nello strato di “servizio” dell’applicazione, gli specifici meccanismi di accesso al database. Lo strato di “Servizio” è quello che offre ai componenti interni o esterni, una serie di servizi (fra i quali quelli di accesso ai dati). DAO Gli oggetti DAO consentono la portabilità delle applicazioni da una sorgente di dati ad un'altra. Utilizzando gli oggetti DAO si disaccoppia l'implementazione della sorgente dati rispetto all'effettivo utilizzo. Questo consente di spostarsi da una sorgente dati ad un'altra senza dover cambiare la logica di business. DAO - Riferimenti http://java.sun.com/blueprints/corej2eepatterns/ Patterns/DataAccessObject.html JDBC JDBC (Java DataBase Connectivity) - connettore per database che permette ai programmi Java l’accesso alle basi di dati, indipendentemente dal DBMS utilizzato. È una API, (package java.sql), che serve ai client per connettersi a un database. Fornisce metodi per interrogare e modificare i dati. È orientata ai database relazionali e supporta il modello Object Oriented. JDBC L'architettura di JDBC prevede l’utilizzo di un “driver manager”, che espone alle applicazioni un insieme di interfacce standard e si occupa di caricare a run-time i driver opportuni per “pilotare” gli specifici DBMS. Le applicazioni Java utilizzano le JDBC API per comunicare con il JDBC driver manager. Il driver manager usa le JDBC driver API per parlare con i singoli driver che pilotano gli specifici DBMS. Il JDBC-ODBC Bridge è un driver che consente di interfacciarsi con i driver ODBC in ambiente Windows. JDBC Overview Il Driver manager è usato come factory per creare le connessioni al database. Le connessioni degli utenti al database sono tipicamente gestite mediante un pool di connessioni (es. Apache DBCP). Ciascuna connessione al database permette l’esecuzione di comandi SQL del tipo: CREATE, INSERT, UPDATE, DELETE e SELECT. JDBC Overview Vi sono tre tipi di istruzioni: Statement - l'istruzione viene inviata al database di volta in volta (nessun caching); Prepared Statement - l'istruzione è “cached”, viene compilata una sola volta, ciò rende più efficienti le chiamate successive; Callable Statement - usati per invocare stored procedure. JDBC Overview L’uso di istruzioni di aggiornamento (INSERT, UPDATE, DELETE) produce la restituzione di un valore numerico che indica quante tuple (righe) sono state interessate. L’esecuzione di query (SELECT) produce la restituzione di un oggetto ResultSet, sul quale si può iterare per estrarre ciascuna tupla (e da ogni tupla, i singoli campi). Spring JDBC Template Spring possiede alcune classi Template che facilitano la progettazione, occupandosi di tutto ciò che riguarda le connessioni al database e lasciando che l’utente si occupi della logica di accesso ai dati. Questo assicura che le connessione sia sempre chiusa, sia in caso positivo che negativo (eccezioni). Spring JDBC Template L’interfaccia RowMapper permette di associare alle righe del ResultSet le istanze di oggetti del dominio dell’applicazione. Si deve implementare il metodo mapRow che mappa i valori della riga corrente del result set sui campi del bean. Spring JDBC Template Spring JDBC si occupa della gestione delle eccezioni. Tutte le eccezioni lanciate da Spring JDBC sono sottoclassi di DataAccessException. DataAccessException è un tipo di RuntimeException (unchecked), per cui non siamo obbligati a gestirla. Al contrario, SQLException è una eccezione di tipo checked. Tuttavia, quando si lancia SQLException (cfr. codice) il framework JDBC di Spring, inserirà tale eccezione dentro una delle sottoclassi di DataAccessException e la rilancerà. Questo evita di doverla gestire esplicitamente. SpringExample18 Confronto fra JDBC tradizionale e JDBC Template SpringExample19 La classe NamedParameterJdbcTemplate permette di specificare i parametri delle query mediante dei nomi, invece di usare i segnaposto (‘?’). I parametri con nome migliorano la leggibilità e sono più semplici da gestire per la manutenzione. I parametri con nome possono essere specificati attraverso una Map, dove il nome del parametro è usato come chiave. SpringExample20 La classe SimpleJdbcTemplate necessita di Java 1.5 e permette di semplificare la scrittura del codice utilizzando le classi Template (cioè la programmazione generica), autoboxing, metodi con numero di argomenti variabili, ecc. SpringExample21 Gestione delle eccezioni. La gestione di eventuali eccezioni non va fatta nello strato DAO. Le eccezioni si devono lanciare e poi raccogliere nello strato di presentazione.