10-Java EE 1 - 48p [Compatibility Mode]

Java EE 1
Ingegneria del Software
Andrea Bei
Applicazioni di classe Enterprise
Sono sistemi informatici utilizzati in medie o grandi organizzazioni a
supporto di sistemi informativi critici. Ad esempio:
ERP (Enterprise Resource Planning): Contabilità, Personale, Inventario,
.Controllo di gestione
CRM (Customer Relationship Management): sistemi per la gestione dei
clienti, dei contatti ed il tracciamento degli eventi associati ai clienti
SRM (Service Request Management): gestione e processamento di richieste
Una applicazione di classe Enterprise deve avere le seguenti
caratteristiche:
Performante: deve servire più richieste concorrenti (multiuser) in maniera
efficiente. Tale caratteristica si ottiene attraverso i servizi di caching e
pooling.
Distribuita: i componenti devono poter essere distribuiti su server diversi
Scalabile: l’applicazione deve garantire il mantenimento dei tempi di
risposta all’aumentare degli utenti concorrenti. (ad es: deve essere
possibile scalare orizzontalmente mediante il clustering)
Sicura: gli utenti devono essere autenticati e autorizzati
Affidabile
Portabile
Transazionale
2
Application Server (AS)
Le applicazioni component based possono essere installate in
component container ( o più semplicemente container)
Un AS è costituito da un insieme di container per componenti di
diverso tipo (EJB Container, WEB Container, WEB Server)
Lo scopo principale di un container è gestire il ciclo di vita dei
componenti (creazione, distruzione, pooling, passivazione, …)
Tra gli altri principali servizi offerti dagli application server
Gestione
Gestione
Gestione
Gestione
dello stato
della sicurezza
dell’accesso ai dati
delle transazioni
Per essere installato (il termine corretto è deploy) su un AS un
componente deve aderire ad opportune specifiche
3
Java EE
Java Enterprise Edition è un insieme di tecnologie e API
Supporta un approccio component-based per la progettazione, lo
sviluppo, l’assemblaggio e la messa in esercizio di applicazioni di classe
enterprise
Definisce le specifiche per i vendor di application server Java EEcompliant
Comprende le seguenti principali tecnologie/API
JSP Java Server Pages
JSF Java Server Faces
Java Servlets Servlet API
Web Services
EJB Enterprise JavaBeans
JNDI Java Naming and Directory Interface
JDBC 2.0 Extensions Java Database Connectivity Extensions
RMI-IIOP RMI over Internet Inter-Orb Protocol
JMS Java Message Service
Java Mail Java Mail
JAF JavaBeans Activation Framework
JTA Java Transaction API
XML Extensible Markup Language
JMX Java Management Extensions
4
Application Server
Tra gli application server Java EECompliant più conosciuti:
IBM WebSphere
Oracle WebLogic Server
JBoss (Open Source)
Glassfish (Open Source)
Tomcat (Open Source)
Tutti gli AS elencati sopra sono dotati di
Web Container + EJB Container tranne
Tomcat
5
Componenti e strati J2EE
Sfruttando le tecnologie offerte dalle piattaforme Java SE+
Java EE è possibile sviluppare applicazione con caratteristiche
"Enteprise"
Le tecnologie fondamentali sono: JDBC, Servlet, JSP, EJB,
JNDI
J2EE Application Server
Applicazione
Persistenza
JDBC
Presentazione
Servizi
Dominio
JNDI
6
Il percorso didattico
Presentazione
Persistenza
Architettura "semplice"
1.
2.
Presentazione
JDBC
Servlet
Persistenza
Architettura "media" complessità
1.
JSP
2.
MVC
Architettura "semplice", Lo strato di
presentazione
Presentazione (Client Tier)
Browser (Thin Client)
Interpreta le pagine HTML generate
dinamicamente dai componenti web
Applet (Thin/Thick Client)
Piccole applicazioni Java realizzate mediante le
API Swing
Sono eseguite all’"interno" del browser (su una
JVM associata al browser)
Sono classi che estendono java.applet.Applet o
javax.swing.JApplet
8
Lo strato di persistenza
Persistenza (EIS Tier)
E’ lo strato responsabile della persistenza dei dati.
E’ implementato da sistemi EIS (Enterprise
Information System). Questi possono essere:
DBMS (relazionali (RDBMS), a oggetti (ODBMS), …)
Sistemi ORM (Object Relational Mapping) (es: Hibernate)
creano una rappresentazione a oggetti di dati memorizzati in
database relazionali
Sistemi Informativi preesistenti (Sistemi Legacy)
Nel caso comune in cui il sistema EIS coincide con
un RDBMS la comunicazione tra lo strato di
business (servizio + dominio) e lo strato di
persistenza avviene mediante JDBC
9
JDBC
JDBC (Java DataBase Connectivity) è una API per
l’accesso a DataBase relazionali
Permette ad applicazioni JAVA di eseguire istruzioni SQL
su database relazionali e gestire i risultati restituiti.
JDBC definisce delle classi per rappresentare:
connessioni a database
istruzioni SQL
result sets (insieme dei record restituiti da una Query SQL)
database metadata (dati che descrivono la struttura del DB),
ecc.
è organizzata in diversi "strati": l’applicazione vede solo
lo strato superiore, che è indipendente dal database che
viene interrogato
il compito di interfacciarsi effettivamente con il
database è delegato ad una serie di driver sottostanti,
che possono essere scritti in codice Java o nativo.
10
JDBC
Presentazione
Applicazione
Servizi
Dominio
Persistenza
11
ODBC
ODBC (Open DataBase Connectivity) è una API
Microsoft per l’accesso a RDBMS
Nei sistemi operativi Microsoft è presente il Data Source
Administrator che permette di dichiarare al sistema
operativo le fonti dati ODBC usate
Una fonte dati ODBC è caratterizzata da:
un nome: il DSN (Data Source Name)
un driver ODBC per la comunicazione con il DBMS (Oracle, SQL
Server, Access)
il riferimento ad un database (il nome del DB)
Le applicazioni instaurano una connessione con il
database riferendosi al nome della fonte dati ODBC
relativa.
12
JDBC
JDBC-ODBC Bridge Driver:
implementa un "ponte" di comunicazione tra JDBC e ODBC;
Permette ad applicazioni JAVA (tramite JDBC) di accedere a
database registrati via ODBC
API Native: convertono chiamate JDBC in chiamate alle
API proprietarie dei vari DBMS (Oracle, Sybase,
Informix, DB2, Postgres, MySQL)
Driver 100% JAVA
Basati su un protocollo indipendente dal DBMS (JDBC-Net):
traducono le chiamate JDBC in un protocollo indipendente dal
DBMS. Tale protocollo viene poi ritradotto da un server nel
protocollo specifico del DBMS. Il server permette di connettere
una applicazione sviluppata interamente in JAVA ai vari DBMS.
Basati sul protocollo del DBMS: traducono le chiamate JDBC nel
protocollo usato dal DBMS. Questo permette una chiamata
diretta dal client al server DBMS
13
JDBC
14
JDBC:
JDBC Classi, interfacce e metodi principali
Classe java.sql.DriverManager: fornisce le funzionalità base di un
gestore di driver. I metodi sono:
Connection getConnection(url,user,password): crea una connessione con un DB
void setLoginTimeout(int): imposta il timeout di connessione
int getLoginTimeout(): restituisce il timeout di connessione
setLogStream( PrintStream ): imposta lo Stream di log
PrintStream getLogStream(): accede allo Stream di Log
void println(String): scrive un messaggio sul Log
Interfaccia java.sql.Connection: rappresenta una connessione con uno
specifico database. I metodi sono:
void close(): chiude la connessione
Statement createStatement(): crea e restituisce un oggetto di tipo Statement
DatabaseMetaData getMetaData(): restituisce informazioni sulla struttura del
database
setAutoCommit(boolean): indica se presente o no l’autocommit (default=true)
commit(): rende effettive le istruzioni SQL eseguite dall’ultimo commit
rollback(): annulla le istruzioni SQL eseguite dall’ultimo commit
15
JDBC:
JDBC Classi, interfacce e metodi principali
Classe java.sql.Statement: un oggetto di tipo Statement è usato
per eseguire delle istruzioni SQL. I metodi sono:
ResultSet executeQuery( String ): esegue una Query SQL. Restituisce
un oggetto di tipo ResultSet che rappresenta il risultato della Query
int executeUpdate( String ): esegue una istruzione SQL che modifica la
struttura o i dati del database( CREATE, INSERT, ecc..). int è il numero
di righe modificate
boolean execute( String ): esegue un comando SQL di interrogazione o
modifica
ResultSet getResultSet(): restituisce il risultato dell’ultima istruzione
SQL eseguita con execute (null se l’istruzione era di modifica)
int getUpdateCount(): restituisce il numero di righe coinvolte
nell’ultima istruzione SQL eseguita con execute.
void setQueryTimeout(int) e int getQueryTimeout(): accesso al timeout
Classe java.sql.ResultSet: un oggetto di tipo ResultSet rappresenta
il risultato di una Query. I metodi sono:
getXXX("Nome Campo") con XXX=Float,String,Byte,Short;Long …..
Restituisce del record corrente il valore del campo passato come
argomento
next() : Aggiorna il puntatore al record corrente facendolo avanzare di
un record
in JDBC2.0 ci sono anche: absolute(int), relative(int) e previous()
16
Connessione con un DBMS
JDBC-ODBC Driver / API Native
Per effettuare una connessione con un DBMS è necessario:
Effettuare l’import delle classi del package java.sql
Caricare il driver di accesso a DB con l’istruzione
Class.forName(<path completo della classe che implementa il driver>);
individua carica ed esegue il link della classe passata come
parametro
Instaurare la connessione con il DBMS con l’istruzione:
Connection con = DriverManager.getConnection(url, <login>,
<password>);
url è di tipo String ed ha la sintassi "jdbc:<subprotocol>:<subname>"
dove:
<subprotocol>: è il sottoprotocollo (es: odbc)
<subname>: serve ad identificare la sorgente dei dati.
17
Connessione con un DBMS
esempi
Es: connessione con il DBMS Access libreria.mdb associato ad una fonte
dati ODBC chiamata "libreria" con login="libreria" e password="libreria"
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:libreria";
Connection con =DriverManager.getConnection(url, "libreria",
"libreria");
Es: connessione con il DBMS open source Postgres "mynewdb" sulla
macchina 192.168.0.3 (www.postgresql.org)
Class.forName( "org.postgresql.Driver" );
String url = "jdbc:postgresql://192.168.0.3/mynewdb";
Connection con = DriverManager.getConnection( url, USER , PASS );
18
Connessione con un DBMS esempi
Es: connessione con db Oracle
1.
Copiare i file contenenti i driver (scaricabili dal sito Oracle) classes12.zip,
jndi.zip in $ORACLE_HOME/jdbc/lib/
2.
aggiornare il CLASSPATH inserendo
"$ORACLE_HOME/jdbc/lib/classes12.zip:$ORACLE_HOME/jdbc/lib/jndi.zip"
1.
Eseguire la connessione al DataBase
Class.forName("oracle.jdbc.driver.OracleDriver");
String
url="jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=150.146.1.98)
(PORT=1521))(CONNECT_DATA=(SID=ID_DB)))";
Connection con =DriverManager.getConnection(url, "login", "password");
19
Istruzioni SQL
Stabilita una connessione è possibile eseguire istruzioni SQL
creare un oggetto di tipo Statement. Se la connessione è descritta
dall’oggetto con l’istruzione è:
Statement stmt = con.createStatement();
invocare i metodi dell’oggetto Statement:
int executeUpdate("<istruzione SQL>"): per istruzioni di tipo CREATE,
DROP, DELETE, INSERT, UPDATE
stmt.executeUpdate("create table Anagrafica"+
"( Nome varchar(32)," +
" Cognome
varchar(32))");
ResultSet executeQuery("<istruzione SQL>") è usato per query
stmt.executeQuery("select * from Libro"+
" where Titolo like \"Moby Dick%\" ");
20
Accesso al risultato delle query
Il metodo executeQuery restituisce un oggetto di tipo ResultSet
Un ResultSet è l’insieme di record che costituiscono il risultato di
una query.
Su quest’insieme viene mantenuto un puntatore alla posizione
corrente.
l puntatore viene posto sul primo record alla prima invocazione del
metodo next.
String query = "SELECT Titolo, ISBN FROM Libro";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String s = rs.getString("Titolo");
String c = rs.getString("ISBN");
System.out.println(s + "
" + c);
}
21
Esempio
import java.sql.*;
class provaJDBC {
public static void main(String arg[]) throws Exception
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url="jdbc:odbc:libreria";
Connection con=DriverManager.getConnection(url,"libreria","libreria");
Statement stmt = con.createStatement();
stmt.executeUpdate("create table Anagrafica"+
"( Nome varchar(32)," +
" Cognome varchar(32))");
stmt.executeUpdate("insert into Anagrafica values (‘Giacomo’,’Leopardi’)");
ResultSet rs=stmt.executeQuery("select Nome,Cognome from Anagrafica");
while (rs.next())
{
System.out.println(rs.getString("Nome")+"
"+rs.getString("Cognome"));
}
}}
22
Transazioni
una transazione è un insieme di operazioni su un database
che soddisfa le seguenti proprietà (ACID)
1.
Atomicity
le operazioni vengono eseguite in modo atomico
"tutte a buon fine o nessuna"
2.
Consistency:
l’esecuzione della transazione fa transitare il db da uno stato
consistente ad un altro stato consistente (durante l’esecuzione è
possibile la "non consistenza")
3.
Isolation
le transazioni concorrenti sono isolate l’una dall’altra. L’una non
deve vedere i dati che l’altra sta modificando.
4.
Durability
i dati sopravvivono a crash. Esiste un log transazionale che registra
tutte le operazioni eseguite sul db. E’ possibile risalire ad un punto
di consistenza.
23
Transazioni
I comandi classici dei DBMS per la gestione delle transazioni
sono:
COMMIT
rende definitivo sul DB ciò che è stato fatto dalla transazione
chiude la transazione
ROLLBACK
annulla sul DB ciò che è stato fatto dalla transazione.
riporta il DB allo stato consistente in cui era prima che iniziasse
la transazione
per soddisfare la Atomicity e la Consistency viene eseguito se una
delle operazioni della transazione non va a buon fine
24
Transazioni ed eccezioni
disabilito ’AutoCommit
try {
con.setAutoCommit(false);
PreparedStatement updateSales = con.prepareStatement(
"UPDATE COFFEES SET SALES = ?
se arrivo qui le operazioni
WHERE COF_NAME LIKE ?");
SQL sono andate a buon
updateSales.setInt(1, 50);
fine. eseguo il COMMIT e
updateSales.setString(2, "Colombian");
chiudo la transazione.
updateSales.executeUpdate();
PreparedStatement updateTotal = con.prepareStatement(
"UPDATE COFFEES SET TOTAL = TOTAL + ? WHERE COF_NAME LIKE
?");
updateTotal.setInt(1, 50);
updateTotal.setString(2, "Colombian");
se qualche operazione
updateTotal.executeUpdate();
SQL non va a buon fine
con.commit();
viene catturata
con.setAutoCommit(true);
l’eccezione.
}
eseguo il ROLLBACK e
catxh (SQLException e){
annullo la transazione
if (con!=null) con.roolback()}
25
Es: sito WEB di una catena di librerie
Ogni libreria possiede un accesso WEB
Il fornitore del servizio fornisce un WEB Server che pubblica su WEB i
dati relativi ai libri venduti (Autore, Titolo, Prezzo, Disponibilità nei vari
punti vendita, ecc.)
I dati sui libri e sulla loro disponibilità vengono inseriti da un operatore
di ogni libreria in base ai libri acquistati e venduti
Cliente
libreria 1
libreria 2
Application
DBMS Server
Internet
libreria N
26
Esempio: sito WEB di una catena di librerie
Use Case Diagram
27
Esempio: sito WEB di una catena di librerie
nome
Prezzo
Titolo
Editore
Anno
copie
Cod libreria
LIBRERIA
LIBRO
(1,1)
GENERE
(1,1)
(1,n)
(1,n)
(1,1)
ISBN
Cod_genere
Genere
Schema ER
( può essere fatto
in UML !)
(1,n)
AUTORE
Cod_autore
Cognome
Nome
Anno di nascita
Luogo di nascita
28
Esempio: sito WEB di una catena di librerie
Architettura Applicativa (Package Diagram)
Strato di dominio
In questo caso è un semplice Facade verso il DB. Deve:
Incapsulare le istruzioni (SQL) di comunicazione con il DB
Offrire al livello superiore metodi indipendenti dal paradigma relazionale
E’ composto da
classi dette "DAO" (Data Access Object): incapsulano la logica di
connessione e le istruzioni SQL (in questo caso una sola)
classi dette Value Objects o DTO (Data Transfer Object) sevono per
rappresentare "a oggetti" i dati relazionali
Strati di servizio/applicazione
Strato di persistenza (un db MS Access)
Servizio/
Applicazione
Dominio
Persistenza
29
Esempio: sito WEB di una catena di
librerie
Class Diagram
Dominio
DAO
Value
Objects
30
Esempio: sito WEB di una catena di librerie
I metodi principali della classe Libreria
public Libreria(fonteDatiODBC, userODBC, passwordODBC): costrutt.
public Collection ricercaPerGenere(String genere): restituisce una
Collection di oggetti di tipo Libro con il genere passato come parametro.
public Collection ricercaPerAutore(String nome): restituisce una
Collection di oggetti di tipo Libro scritti dall’autore passato come param.
public Collection ricercaPerTitolo(String titolo):restituisce una
Collection contenente gli oggetti di tipo Libro che hanno il titolo passato
come parametro.
public void inserisciLibro(Libro l): insert nel database dei dati
dell’oggetto Libro
private int inserisciAutore(Autore a): insert nel database dei dati
dell’oggetto Autore. Ritorna il codiceAutore, un numero che identifica
univocamente l’autore.
public void aggiornaCopie(String ISBN,String lib,int copie):
Aggiorna le copie del libro ISBN della libreria lib. Copie può essere
positivo o negativo
public Libro getSchedaLibro(String ISBN): restituisce l’ oggetto di
tipo Libro che ha come ISBN il codice passato come parametro
31
Implementazione:il DB Access libreria.mdb
AUTORE
Cod_autore
Cognome
0 Melville
1 Hesse
3 Dick
4 Hofstader
5 Russel
6 Pirsig
7 Clarke
Nome
Herman
Herman
Philip
Douglas
Bertrand
Robert
Arthur
COPIE
Libreria
1
1
1
2
2
3
ISBN
88-347-0098-8
88-450-0701-1
88-460-0739-2
88-450-0701-1
88-459-0699-X
88-459-0734-1
Anno_di_nascita
1819
1847
1920
1945
1872
1928
1917
Luogo_di_nascita
New York
Estonia
New York
New York
New York
Minnesota
Inghilterra
LIBRERIA
Copie
10
16
30
15
20
40
Cod_Libreria
Nome
1 Feltrinelli
2 Apogeo
3 Ricordi
32
Implementazione:il DB Access libreria.mdb
LIBRO
ISBN
88-347-0098-8
88-450-0701-1
88-459-0468-7
88-459-0699-X
88-459-0734-1
88-459-0755-4
88-459-1095-4
88-460-0739-2
88-7819-669-X
Titolo
Ubik
Storia della filosofia occidentale
Amicizia
Knulp
Lo Zen e l'arte della manutenz…
Goedel, Escher, Bach
Moby Dick
Lila
2001: Odissea nello spazio
Editore Anno Cod_autor Cod_genere
Fanucci
1969
3
2
Mondadori 1977
5
0
Newton
1920
1
1
Newton
1915
1
1
Adelphi
1974
6
1
Adelphi
1992
4
0
Adelphi
1851
0
1
Adelphi
1985
6
1
Mondadori 1968
7
2
Prezzo
L. 20.000
L. 15.000
L. 5.000
L. 5.000
L. 18.000
L. 20.000
L. 18.000
L. 15.000
L. 16.000
GENERE
Cod_genere
0
1
2
3
Genere
Saggio
Romanzo
Fantascienza
Giallo
33
Value Objects: Libro
class Libro {
String ISBN;
String titolo;
String editore;
int anno;
Autore autore;
String genere;
int prezzo;
// serve ha mantenere tutte le informazioni di
//un Libro compreso i dettagli sull’autore
Libro (String ISBN, String titolo, String editore, Int anno,
Autore autore, String genere, Int prezzo) {
this.ISBN=ISBN;
this.titolo=titolo;
..
this.autore=autore;
}
public String getISBN()
{ return ISBN;}
public void setISBN(String ISBN)
{ this.ISBN=ISBN;} ...
34
Value Objects: Autore
class Autore {
// serve ha mantenere tutte le informazioni
// su un autore
String nome;
String cognome;
int dataDiNascita;
String luogoDiNascita;
Autore (String nome, String cognome, int dataDiNascita,
String luogoDiNascita)
{
this.nome=nome;
this.cognome=cognome;
...
}
public String getNome()
{ return nome;}
public void setNome(String nome)
{ this.nome=nome;}
...
35
Libreria: implementazione del
costruttore
import java.sql.*;
import java.io.*;
class Libreria
{
Connection con=null;
Statement stmt=null;
String fonteDatiODBC=null;
String userODBC=null;
String passwordODBC=null;
import java.util.*;
Libreria(String fonteDatiODBC,String userODBC, String passwordODBC)
// costruttore
{
this.fonteDatiODBC= fonteDatiODBC;
this.userODBC= userODBC;
this.passwordODBC= passwordODBC;
}
36
Libreria:implementazione di metodi di
utilità
...
private ResultSet executeQuery(String Query)
{ // questo metodo serve solo per catturare le eccezioni del metodo
// executeQuery
ResultSet rs=null;
try
{ rs=stmt.executeQuery(Query); }
catch(SQLException e)
{
System.out.println("Problemi con l'esecuzione della Query SQL: "+
Query);}
return(rs);
}
37
Libreria:implementazione di metodi di
utilità
private void createConnection() {
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// carico il driver JdbcOdbc
} catch(ClassNotFoundException e)
{ System.out.println("Driver Jdbc-Odbc non presente"+e.getMessage()); }
String url="jdbc:odbc:"+fonteDatiODBC;
Try
{
con = DriverManager.getConnection(url, userODBC, passwordODBC); //eseguo la connessione
stmt=con.createStatement();
// creo un oggetto di tipo Statement
} catch(SQLException e) {
System.out.println("Problemi nella apertura di sessione con la fonte dati "+
fonteDatiODBC+"\n"+"verificare l'esistenza della fontedati e la correttezza di User e
Password");} }
private void closeConnection() {
Con.close();
Con=null;
Stmt=null}
38
Libreria:implementazione di ricercaPerGenere
public Collection ricercaPerGenere(String genere) {
createConnection();
String Query="SELECT ISBN,Titolo,Editore,Anno,Genere,Prezzp,
"
Cognome,Nome,Anno_di_Nascita,"
"
Luogo_di_Nascita "+
"FROM Genere, Libro , Autore"+
"WHERE Genere.Cod_genere=Libro.Cod_genere "+
"AND Genere.genere = '"+genere+"'"+
"AND Libro.cod_autore=Autore.cod_autore";
Collection a = new ArrayList();
ResultSet rs=null;
rs=executeQuery(Query);
try {
while (rs.next()) {
Autore autore=
new Autore(rs.getString(7),rs.getString(8), rs.getString(9), rs.getString(10));
Libro libro=
new Libro(rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4),
rs.getString(5), rs.getString(6),autore);
a.add(libro);
}
} catch(SQLException e) {System.out.println("Errore nella navigazione del
ResultSet");}
closeConnection();
return a;}
39
Libreria: implementazione di inserisciAutore
private int inserisciAutore(Autore a) { // la classe Autore ha solo metodi setter e
createConnection();
// getter per le variabili cognome, nome,
int cod_autore=0;
// annoDiNascita, luogoDiNascita
String query="SELECT * "+
// verifico se l’autore è già presente
"FROM Autore "+
"WHERE Nome='"+a.getNome()+"' and Cognome='"+a.getCognome()+"’";
try {
ResultSet rs=executeQuery(Query);
if (rs.next()) {
cod_autore=rs.getInt("Cod_autore");
closeConnection();
return(cod_autore);
// se è gia presente retituisco il codice relativo
}
query="SELECT MAX(Cod_autore) FROM Autore";
// altrimenti seleziono il massimo Cod_autore
ResultSet rs=executeQuery(Query);
rs.next();
cod_autore=rs.getInt(1)+1;
// il nuovo Cod_autore è il max + 1
Query="INSERT INTO AUTORE (cod_autore,Cognome,Nome,Anno_di_nascita,Luogo_di_nascita) "+
" VALUES ("+cod_autore+",'"+a.getCognome()+"','"+a.getNome()+"',"+
a.getAnnoDiNascita()+",'"+a.getLuogoDiNascita()+"')";
int rc=executeUpdate(Query);
} catch(SQLException e)
{System.out.println("Errore nella navigazione del ResultSet");}}
closeConnection();}
40
Libreria: implementazione di inserisciLibro
public void inserisciLibro(Libro l) { // la classe Libro ha solo metodi
createConnection();
// setter e getter per le variabili ISBN,Titolo, .
String stmt="SELECT * "+
"FROM Libro "+
"WHERE ISBN='"+l.getISBN();
try {
ResultSet rs=executeQuery(stmt);
if (!rs.next())
// se non è gia presente lo inserisco
{
stmt="SELECT Cod_Genere) "+
// seleziono il codice genere dalla descrizione
" FROM Genere"+
// suppongo che i generi siano precaricati nel DB
" WHERE Genere.Genere="+l.getGenere();
ResultSet rs=executeQuery(stmt);
rs.next();
int codGenere=rs.getInt(1);
int codAutore=inserisciAutore(L.getAutore()); //inser. l’autore se manca o ricavo il
codice
stmt="INSERT INTO Libro (ISBN,Titolo,Editore,Anno,Cod_Autore,Cod_Genere,Prezzo)"+ "
VALUES
("+l.getISBN()+","+l.getTitolo()+","+l.getEditore()+","+l.getAnno()+","+codAutore+
","+codGenere+","+l.getPrezzo()+")";
int rc=executeUpdate(stmt);
} catch(SQLException e) {System.out.println("Errore nella navigazione del
ResultSet");}}
closeConnection();}
41
Libreria: implementazione di
aggiornaCopie
public void aggiornaCopie(String ISBN,String lib,int copie)
{
createConnection();
// ricavo il codice libreria
String stmt= "SELECT Cod_Libreria "+
"FROM Libreria "+
"WHERE Libreria.Nome="+lib;
try {
ResultSet rs=executeQuery(stmt);
rs.next();
int codLibreria=rs.getInt(1);
String stmt="UPDATE Copie SET Copie = Copie+"+copie+
" WHERE ISBN='"+ISBN+"' AND"+
"
Libreria="+codLibreria;
if (executeUpdate(stmt)==0) // il negozio non aveva nemmeno una copia
{
// inserisco una riga con il numero di copie
stmt="INSERT INTO Copie ( ISBN, Libreria, Copie ) "+
"VALUES('"+ISBN+"',"+lib+","+copie+")";
int rc=executeUpdate(stmt);
}} catch(SQLException e)
{System.out.println("Errore nella navigazione del ResultSet");}
closeConnection();}
42
Un esempio di uso della classe
Libreria
import java.sql.*; import java.io.*;import java.util.*;
import Libreria;
import Libro;
import Autore;
class provaJDBC{
public static void main(String args[])
throws Exception
{
Libreria l=new Libreria("libreria","libreria","libreria");
System.out.println(" prima dell’inserimento ");
Collection c=l.ricercaPerGenere("Romanzo");
Iterator i = c.iterator();
while (i.hasNext()) {
Libro libro = (Libro)i.next();
System.out.println(libro.getTitolo()+" "+ libro.getISBN());
}
Autore autore=new Autore();
autore.setCognome("Pennac");
autore.setNome("Daniel");
autore.setAnnoDiNascita(1944);
autore.setLuogoDiNascita("Casablanca");
43
Un esempio di uso della classe
Libreria
Libro lib=new Libro();
lib.setISBN("88-07-70072-7");
lib.setTitolo("Signor Malaussene");
lib.setEditore("Feltrinelli");
lib.setAnno(1995);
lib.setGenere("Romanzo");
lib.setPrezzo(20.000);
lib.setAutore(autore) ;
l.inserisciLibro(lib);
System.out.println(" dopo l’inserimento ");
c=l.ricercaPerGenere("Romanzo");
Iterator i = c.iterator();
while (i.hasNext()) {
Libro libro = (Libro)i.next();
System.out.println(libro.getTitolo()+" "+
libro.getISBN());
}
}
}
44
Esecuzione di provaJDBC
C:\jdk1.3.1_03>java provaJDBC
prima dell'inserimento
Lo Zen e l'arte della manutenzione della motocicletta 88-459-0734-1
Lila 88-460-0739-2
Moby Dick 88-459-1095-4
Knulp 88-459-0699-X
Amicizia 88-459-0468-7
dopo l'inserimento
Lo Zen e l'arte della manutenzione della motocicletta 88-459-0734-1
Lila 88-460-0739-2
Moby Dick 88-459-1095-4
Knulp 88-459-0699-X
Amicizia 88-459-0468-7
Signor Malaussene 88-07-70072-7
C:\jdk1.3.1_03>
45