Grazie all'utilizzo dell'Inversion of Control è possibile iniettare nella nostra classe un oggetto di tipo JdbcTemplate
già inizializzato con un datasource. Esaminiamo il file di configurazione:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver" />
<property name="url" value="jdbc:derby://localhost:1527/library;create=true" />
<property name="username" value="app" />
<property name="password" value="app" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="bookDao" class="it.html.spring.book.BookJdbcDao">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
</beans>
JdbcDaoSupport
La classe JdbcDaoSupport
permette di agevolare l'utilizzo di JdbcTemplate
implementando direttamente i metodi setDatasource()
e setJdbcTemplate()
. Facendo estendere questa classe ai propri DAO sara sufficente iniettare un datasource per poter utilizzare un JdbcTemplate attraverso il metodo getJdbcTemplate()
(ereditato anch'esso da JdbcDaoSupport
).
public class BookJdbcDao extends JdbcDaoSupport implements BookDao {
...
//Inserimento
public void insert(Book book)
{
getJdbcTemplate().update("insert into book (isbn, autore, titolo) values (?, ?, ?)",
new Object[] { book.getIsbn(), book.getAuthor(), book.getTitle() });
}
}
SimpleJdbcTemplate
La classe SimpleJdbcTemplate aggiunge alcune funzionalità offerte da Java 1.5 alla classe base JdbcTemplate, semplificando ulteriormente le procedure di accesso ai dati.
Grazie al supporto dei parametri a lunghezza variabile è possibile passare direttamente i valori ai metodi di update senza dover utilizzare un array di oggetti.
public class BookJdbcDaoSupport extends SimpleJdbcDaoSupport implements BookDao {
public void insert(Book book) {
getSimpleJdbcTemplate().update("insert into book (isbn, autore, titolo) values (?, ?, ?)",
book.getIsbn(), book.getAutore(), book.getTitolo());
...
}
Con l'utilizzo dei generics e dell'autoboxing anche le query vengono notevolmente semplificate.
In particolare Spring fornisce la classe ParameterizedBeanPropertyRowMapper
, un'implementazione dell'interfaccia RowMapper
che si occupa di effettuare le operazioni di mapping viste in precedenza in maniera transparente allo sviluppatore.
//Query di un singolo oggetto
public Book findByISBN(String isbn) {
Book book = getSimpleJdbcTemplate().queryForObject("select * from books where isbn = ?",
ParameterizedBeanPropertyRowMapper.newInstance(Book.class),
isbn);
return book;
}
// Query di una lista di oggetti
public List findAllBooks() {
List books = (List) getJdbcTemplate().query( "select * from books",
ParameterizedBeanPropertyRowMapper.newInstance(Book.class));
return books;
}
Per effettuare delle prove è possibile scaricare l'esempio completo (progetto Eclipse)