Uno degli aspetti fondamentali quando si costruisce un'applicazione è la persistenza dei dati, per realizzare la quale, nel mondo Java, esiste una varietà numerosa di API e framework, come JDBC o Hibernate, dei quali parleremo nelle prossime lezioni.
Spring si inserisce in questo contesto mettendo a disposizione tutte queste tecnologie in un ambiente altamente flessibile, sfruttando appieno le potenzialità offerte dalla Dependency Injection e dall'Aspect Oriented.
In particolare Spring supporta:
- JDBC
- Java Persistence API (JPA)
- Java Data Objects (JDO)
- Hibernate
- Common Client Interface (CCI)
- iBATIS SQL Maps
- Oracle TopLink
Nelle prossime lezioni sarà illustrato attraverso frammenti di codice come utilizzare Spring per l'acesso ai dati mediante l'utilizzo di JDBC e Hibernate. Lo scopo degli esempi mostrati sarà quello di persistere un database di libri.
Il modello per l'esempio
Creiamo il nostro modello da persistere: è composto da una semplice classe Book
contenente le proprietà necessarie per rappresentare un libro e dai relativi metodi accessori.
public class Book {
String isbn;
String author;
String title;
public String getIsbn() { return isbn; }
public void setIsbn(String isbn) { this.isbn = isbn; }
public String getAuthor() { return author; }
public void setAuthor(String author) { this.author = author; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
}
Questa classe rappresenta l'entità base da salvare in database.
Database
La persistenza del modello sarà effettuata nella tabella books
del database library
; di seguito i dettagli di connessione e creazione della tabella.
CONNECT 'jdbc:derby://localhost:1527/library;create=true'; CREATE TABLE BOOKS ( ISBN VARCHAR(13) NOT NULL, AUTHOR VARCHAR(20), TITLE VARCHAR(20), PRIMARY KEY (ISBN));
Prerequisito essenziale per poter testare gli esempi che verranno proposti è l'installazione di un database. Una possibile scelta è Apache Derby, un database open source estremamente leggero e di facile configurazione.
Per avviare il server basterà semplicemente eseguire il file startServerNetwork.bat
presente nella sottodirectory bin
del path dove è stato installato Apache. A questo punto sarà possibile aprire la console applicativa attraverso il comando ij
, da dove lanciare i comandi mostrati in figura 3.
Data Access Object
Una delle peculiarità principali di Spring è quella di favorire la scrittura di codice modulare favorendone il riuso. Per questa ragione Spring incoraggia l'utilizzo del DAO (Data Access Object), un pattern architetturale che ha come scopo quello di separare le logiche di business da quelle di accesso ai dati.
L'idea alla base di questo pattern è quello di descrivere le operazioni necessarie per la persistenza del modello in un'interfaccia e di implementare la logica specifica di accesso ai dati in apposite classi.
In figura è mostrato il diagramma UML dell'architettura che sarà utilizzata negli esempi che seguiranno. La logica di business necessaria per la persistenza del nostro modello è descritta nella classe BookDao
, mentre nella classe BookJdbcDao
troviamo un'implementazione specifica di questa interfaccia rivolta a gestire le logiche di accesso ai dati mediante tecnologia JDBC.
In questo scenario è possibile notare come grazie all'utilizzo del pattern DAO sia possibile con poco sforzo fornire ulteriori implementazioni della classe BookDao
per introdurre nuove logiche di accesso ai dati (ad esempio per l'utilizzo di Hibernate un ipotetico BookHibernateDao
).
L'interfaccia DAO che utilizeremo per i nostri scopi sarà così fatta:
public interface BookDao {
public void insert(Book book);
public void update(Book book);
public void delete(String isbn);
public Book findByISBN(String isbn);
public List<Book> findAllBooks();
public int bookCount();
}