20. Applicazione Web MVC in un'architettura a 3 livelli – Esempio 6, SQL Server Express
20.1. Il database SQL Server Express
In questa versione, memorizzeremo l'elenco delle persone in una tabella del database SQL Server Express 2005 disponibile all'URL [http://msdn.microsoft.com/vstudio/express/sql/]. Le schermate seguenti provengono dal client EMS Manager Lite per SQL Server Express [http://www.sqlmanager.net/fr/products/mssql/manager], un client di amministrazione gratuito per il DBMS SQL Server Express.
Il database si chiama [dbpersonnes]. Contiene una tabella denominata [PERSONNES]:

La tabella [PERSONNES] conterrà l'elenco delle persone gestite dall'applicazione web. È stata creata utilizzando le seguenti istruzioni SQL:
- Riga 2: La chiave primaria [ID] è di tipo intero. L'attributo IDENTITY indica che se viene inserita una riga senza un valore per la colonna ID della tabella, SQL Express genererà un numero intero per questa colonna. In IDENTITY(1, 1), il primo parametro è il primo valore possibile per la chiave primaria, mentre il secondo è l'incremento utilizzato per generare i numeri.
La tabella [PERSONS] potrebbe avere il seguente contenuto:

Sappiamo che quando si inserisce un oggetto [Person] tramite il nostro livello [DAO], il campo [id] di questo oggetto è uguale a -1 prima dell'inserimento e ha un valore diverso da -1 in seguito; questo valore è la chiave primaria assegnata alla nuova riga inserita nella tabella [PERSONNES]. Vediamo un esempio per capire come determinare questo valore.
![]() |
![]() |
L'istruzione SQL
restituisce l'ultimo valore inserito nel campo ID della tabella. Deve essere eseguita dopo l'inserimento. Ciò differisce dai DBMS [Firebird] e [Postgres], in cui il valore della chiave primaria del record aggiunto veniva interrogato prima dell'inserimento, ma è analogo alla generazione della chiave primaria nel DBMS MySQL. Lo useremo nel file [people-sqlexpress.xml], che contiene le istruzioni SQL eseguite sul database.
20.2. Il progetto Eclipse per i livelli [DAO] e [service]
Per sviluppare i livelli [DAO] e [service] della nostra applicazione con il database [SQL Server Express], useremo il seguente progetto Eclipse [mvc-personnes-06]:

Il progetto è un semplice progetto Java, non un progetto web Tomcat.
Cartella [src]
Questa cartella contiene il codice sorgente per i livelli [dao] e [service]:

Tutti i file con [sqlexpress] nel nome potrebbero essere stati modificati o meno rispetto alle versioni Firebird, Postgres e MySQL. Di seguito descriviamo solo quelli che sono stati modificati.
Cartella [database]
Questa cartella contiene lo script per la creazione del database SQL Express per gli utenti:
![]()
cartella [lib]
Questa cartella contiene gli archivi richiesti dall'applicazione:
![]() |
Si noti la presenza del driver JDBC [sqljdbc.jar] per il DBMS [SQL Server Express]. Tutti questi file fanno parte del classpath del progetto Eclipse.
20.3. Il livello [DAO]
Il livello [dao] è il seguente:

Stiamo evidenziando solo le modifiche rispetto alla versione [Firebird].
Il file di mappatura [personne-sqlexpress.xml] è il seguente:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap>
<!-- alias class [Person] -->
<typeAlias alias="Personne.classe"
type="istia.st.mvc.personnes.entites.Personne"/>
<!-- mapping table [PERSONNES] - object [Person] -->
<resultMap id="Personne.map"
class="istia.st.mvc.personnes.entites.Personne">
<result property="id" column="ID" />
<result property="version" column="VERSION" />
<result property="nom" column="NOM"/>
<result property="prenom" column="PRENOM"/>
<result property="dateNaissance" column="DATENAISSANCE"/>
<result property="marie" column="MARIE"/>
<result property="nbEnfants" column="NBENFANTS"/>
</resultMap>
<!-- list of all persons -->
<select id="Personne.getAll" resultMap="Personne.map" > select ID, VERSION, NOM,
PRENOM, DATENAISSANCE, MARIE, NBENFANTS FROM PERSONNES</select>
<!-- get a specific person -->
<select id="Personne.getOne" resultMap="Personne.map" >select ID, VERSION, NOM,
PRENOM, DATENAISSANCE, MARIE, NBENFANTS FROM PERSONNES WHERE ID=#value#</select>
<!-- add a person -->
<insert id="Personne.insertOne" parameterClass="Personne.classe">
insert into
PERSONNES(VERSION, NOM, PRENOM, DATENAISSANCE, MARIE, NBENFANTS)
VALUES(#version#, #nom#, #prenom#, #dateNaissance#, #marie#,
#nbEnfants#)
<selectKey keyProperty="id">
select @@IDENTITY as value
</selectKey>
</insert>
<!-- update a person -->
<update id="Personne.updateOne" parameterClass="Personne.classe"> update
PERSONNES set VERSION=#version#+1, NOM=#nom#, PRENOM=#prenom#, DATENAISSANCE=#dateNaissance#,
MARIE=#marie#, NBENFANTS=#nbEnfants# WHERE ID=#id# and
VERSION=#version#</update>
<!-- delete a person -->
<delete id="Personne.deleteOne" parameterClass="int"> delete FROM PERSONNES WHERE
ID=#value# </delete>
<!-- obtain the value of the primary key [id] of the last person inserted -->
<select id="Personne.getNextId" resultClass="int">select
LAST_INSERT_ID()</select>
</sqlMap>
Questo è lo stesso contenuto di [people-firebird.xml] con le seguenti piccole differenze:
- l'istruzione SQL "Person.insertOne" è stata modificata nelle righe 29–37:
- l'istruzione SQL INSERT viene eseguita prima dell'istruzione SELECT, che recupera il valore della chiave primaria della riga inserita
- l'istruzione SQL insert non specifica un valore per la colonna ID nella tabella [PERSONNES]
Ciò riflette l'esempio di inserimento discusso nella Sezione 20.1. Si noti che il problema degli inserimenti simultanei da parte di thread diversi, descritto per MySQL nella Sezione 19.3, è presente anche qui.
La classe di implementazione [DaoImplCommon] del livello [dao] è la stessa delle tre versioni precedenti.
La configurazione del livello [dao] è stata adattata al DBMS [SQL Express]. Pertanto, il file di configurazione [spring-config-test-dao-sqlexpress.xml] è il seguente:
<?xml version="1.0" encoding="ISO_8859-1"?>
<!DOCTYPE beans SYSTEM "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- data source DBCP -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value>
</property>
<property name="url">
<value>jdbc:sqlserver://localhost\\SQLEXPRESS:4000;databaseName=dbpersonnes</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value>msde</value>
</property>
</bean>
<!-- SqlMapCllient -->
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource">
<ref local="dataSource"/>
</property>
<property name="configLocation">
<value>classpath:sql-map-config-sqlexpress.xml</value>
</property>
</bean>
<!-- the [dao] layer access classes -->
<bean id="dao" class="istia.st.mvc.personnes.dao.DaoImplCommon">
<property name="sqlMapClient">
<ref local="sqlMapClient"/>
</property>
</bean>
</beans>
- righe 5-19: Il bean [dataSource] ora fa riferimento al database [dbpersonnes] di [SQL Express], il cui amministratore è [sa] con la password [msde]. Il lettore dovrebbe modificare questa configurazione in base al proprio ambiente.
- Riga 31: La classe [DaoImplCommon] è la classe di implementazione per il livello [dao]
La riga 11 richiede alcune spiegazioni:
<value>jdbc:sqlserver://localhost\\SQLEXPRESS:4000;databaseName=dbpersonnes</value>
- //localhost: indica che il server SQL Express si trova sulla stessa macchina della nostra applicazione Java
- \\SQLEXPRESS: è il nome di un'istanza di SQL Server. Sembra che più istanze possano essere eseguite contemporaneamente. È quindi opportuno specificare il nome dell'istanza a cui ci si sta rivolgendo. Questo nome può essere ottenuto utilizzando [SQL Server Configuration Manager], che in genere viene installato insieme a SQL Express:


- 4000: porta di ascolto di SQL Express. Dipende dalla configurazione del server. Per impostazione predefinita, utilizza porte dinamiche, che non sono note in anticipo. In tal caso, nell'URL JDBC non viene specificata alcuna porta. Qui abbiamo utilizzato una porta fissa, la porta 4000. Questa viene impostata tramite configurazione:
![]() |
- L'attributo dataBaseName specifica il database con cui si desidera lavorare. Si tratta di quello creato con il client EMS:

Una volta apportate queste modifiche, possiamo passare alla fase di test.
20.4. Test per i livelli [dao] e [service]
I test per i livelli [dao] e [service] sono gli stessi della versione [Firebird]. I risultati ottenuti sono i seguenti:
![]() |
Possiamo vedere che i test sono stati superati con successo con l'implementazione [DaoImplCommon]. Non sarà necessario derivare questa classe, come invece era necessario con il DBMS [Firebird].
20.5. Test dell'applicazione [Web]
Per testare l'applicazione web con il DBMS [SQL Server Express], creiamo un progetto Eclipse [mvc-personnes-06B] in modo simile a quello utilizzato per creare i precedenti progetti web.
Distribuiamo il progetto web [mvc-personnes-05B] all'interno di Tomcat:
![]() | ![]() |
Viene avviato il DBMS SQL Server Express. Il contenuto della tabella [PERSONNES] è quindi il seguente:

Viene quindi avviato Tomcat. Utilizzando un browser, richiediamo l'URL [http://localhost:8080/mvc-personnes-06B]:

Aggiungiamo una nuova persona utilizzando il link [Add]:
![]() | ![]() |
Verifichiamo l'aggiunta nel database:

Il lettore è invitato a eseguire altre operazioni [modifica, elimina].








