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.