con Java.
Lezione 9 - Ripasso SQL, Gestione Dati Permanenti con DAO
RIPASSO DATABASE
DBMS
Il DBMS (DataBase Management System) è un sistema SW progettato per
consentire creazione, manipolazione e interrogazione efficiente dei database. È il
nostro modo di interfacciarci con la base di dati, parte fondamentale di
un’applicazione che vuole mantenere dati in modo permanente.
https://dev.mysql.com/downloads/installer/
Un database in genere contiene gruppi di entità simili che condividono gli stessi attributi
ma che hanno i propri valori per essi. Tali gruppi sono detti tipi di entità.
Una chiave minimale è detta superchiave e di queste ne viene scelta una che è la
chiave primaria. In realtà, nei diagrammi ER, tale concetto non esiste, ma
possiamo metterci avanti!
Una chiave si indica annerendo il pallino degli attributi chiave o barrandoli con una
linea nera con pallino ad un’estremità se la chiave è composta da più attributi;
altrimenti si indica sottolineando il nome.
MODELLO ER - ASSOCIAZIONI
Ogni volta che un attributo di un tipo di entità si riferisce a un altro tipo di entità, allora sussiste una
qualche associazione. Un tipo di associazione tra n tipi di entità E1, E2, …, En definisce un insieme di
legami tra le entità di questi tipi. Ognuno di questi tipi di entità si dice partecipare all’associazione.
➔ cardinalità: Si applica alle associazioni binarie (a 2 entità) e specifica il numero massimo di istanze
di associazione a cui può partecipare un’entità. Si hanno 1:1, 1:N, N:1 e N:M.
➔ partecipazione: Specifica se l’esistenza di un’entità dipende dal suo essere correlata ad un’altra
attraverso il tipo di associazione; in pratica, ci dice il numero minimo di istanze a cui ogni entità può
partecipare. Può essere totale (minimo 1) o parziale (minimo 0).
ESEMPIO SQL 1
ESEMPIO SQL 2
PROGETTAZIONE LOGICA
Si divide in due parti:
1) Per ogni tipo di entità E si costruisce una relazione R che contiene tutti gli
attributi di E.
2) Come PK di R si sceglie un attributo chiave di E che può essere un singolo
attributo o anche più attributi.
2) TRADUZIONE ASSOCIAZIONI 1:1
1) Per ogni tipo di associazione R si individuano le relazioni S e T corrispondenti
ai tipi di entità che partecipano ad R.
2) Si segue uno dei seguenti approcci:
a) Basato su chiavi esterne: Si sceglie una delle due relazione (S) e vi si inserisce come FK la
PK di T, rendendola attributo di S e denotandola tramite una sottolineatura tratteggiata. Come
S è meglio scegliere una relazione con partecipazione totale a R. In S si inseriscono tutti gli
attributi semplici di R.
b) Basato sulla relazione fusione: Si possono fondere i due tipi di entità e l’associazione in
un’unica relazione solo se entrambe le entità hanno partecipazione totale ad essa.
c) Basato sulla reale associazione: SI crea una terza relazione R inserendovi le PK di S e T
come FK verso S e T. La PK di R sarà una delle due FK.
3) TRADUZIONE ASSOCIAZIONI 1:N
1) Per ogni tipo di associazione R si individua l’associazione S che partecipa
come 1.
2) Si inserisce in S la PK di T come FK verso T e tutti gli attributi semplici del tipo
di associazione.
La listaValori deve elencare i valori nello stesso ordine degli attributi, se non li si
specifica nella listaAttributi.
UPDATE
UPDATE è l’istruzione che consente di aggiornare le tuple, modificando i valori di
una relazione.
[WHERE condizioni]
ESERCIZI
● A partire dall’esempio ER 2, creare un database su MySQL passando
attraverso la progettazione logica.
● Popolare le tabelle realizzate con almeno 5 righe ciascuna.
● Fare l’UPDATE di tutte le righe di Corso, cambiando il nome in “JavaGaldus”.
● Cancellare tutte le righe da Master; quindi ripopolarle.
● Recuperare il codice si Docente e Corso di tutte le associazioni esistenti tra
essi.
GESTIONE DATI PERMANENTI
JDBC
JDBC (Java DataBase Connectivity) è una API Java che permette di connettersi
e di eseguire query con il database. Questo ci consente di interrogare e gestire un
database a partire da Java, così da salvare dati in modo permanente così da
poterli recuperare a nuovi avvii delle nostre applicazioni.
1. Connetterci al DB
2. Eseguire interrogazioni e aggiornamenti del DB
3. Elaborare i risultati ottenuti dal DB
STRUTTURA DI JDBC
JDBC è quindi un insieme di classi e interfacce orientate alla comunicazione con
database di varia natura. Tali tipi sono inclusi nel pacchetto java.sql che quindi
abbiamo il bisogno di importare in qualsiasi nostra applicazione Java che voglia
sfruttare tali servizi.
Tra questi tipi, quelli più importanti sono:
★ Classe DriverManager
★ Interfaccia Driver
★ Interfaccia Connection
★ Interfaccia PreparedStatement
★ Interfaccia ResultSet
DRIVER
Il problema fondamentale di aprire una comunicazione con un DB è che stiamo
cercando di mettere in comunicazione due applicazioni diverse che non sono state
progettate per avere punti di interfacciamento.
Serve quindi un driver, un programma che faccia come ponte tra la nostra
applicazione Java e il database.
Ogni tipo di database ha però regole diverse e quindi il driver cambia a seconda
del DBMS in uso.
Noi usiamo SQL, quindi useremo il driver apposito scaricabile al seguente link:
https://drive.google.com/file/d/1ylaQ_fUcuLlJoxdqrhHkgmDCCN5uwG9Q/view?us
p=sharing
INSTALLARE IL DRIVER
Il driver è spesso posto in un JAR messo a disposizione dal produttore del DBMS.
Esso deve essere aggiunto al Classpath della nostra applicazione, in quanto
rappresenta una libreria.
Per farlo, basta seguire i passi visti per l’import di librerie tramite JAR!
La stringa url deve seguire un determinato formato, inoltre si noti che tale metodo
solleva un nuovo tipo di eccezione! Si raccomanda di effettuare ogni operazione
riguardante i database in un blocco try-catch che gestisca almeno SQLException!
FORMATO DI URL
Cosa ha bisogno di conoscere il DriverManager?
➔ Il tipo del database, per capire che driver usare.
➔ L’indirizzo del database, per capire dove trovarlo.
➔ Le credenziali d’accesso, per capire chi vuole accedervi.
➔ Il nome dello schema a cui riferirsi.
Queste informazioni sono interne alla Stringa url.
Essa segue il seguente formato:
jdbc:mysql://[host:port], [host:port], ...
/[database][?proprietà1][=valore1][&proprietà2][=valore2]...
PARTI DI URL
❏ mysql Nel nostro caso, ma potrebbe essere un qualsiasi altro DBMS!
❏ host Nome dell’host che è quasi sempre localhost.
❏ port Numero della porta. Non lo si mette se di default (3306).
❏ database Nome dello schema.
❏ proprietà Specifiche di connessione, come user e password!
Ad ES:
stmt.setString(1, “admin”);
stmt.setString(2, “psw”);
ESEGUIRE GLI STATEMENT
Eseguire una query è diverso dall’eseguire un altro tipo di operazione poiché una query dà come ritorno
un certo numero di righe frutto dell’interrogazione. Per questo motivo, il metodo per eseguire le query è
diverso da quello usato per le altre operazioni (a cui ci riferiamo come updates).
❖ ResultSet executeQuery()
➢ Esegue lo statement a cui si fa riferimento, facendo tornare un set di risultati.
Per un update:
❖ int executeUpdate()
➢ Esegue lo statement a cui si fa riferimento, facendo tornare il numero di righe da esso aggiornate.
Ad ES:
Dobbiamo chiudere:
❏ L’oggetto Connection
❏ L’oggetto PreparedStatement
❏ L’oggetto ResultSet
ESEMPIO DI QUERY
ESERCIZI
● Attraverso l’uso di JDBC, popolare il database creato nell’esercizio
precedente con un certo numero di righe.
● Per ogni tabella, effettuare la stampa in un file di tutto il contenuto della
tabella. Deve esserci un file per tabella!
DAO
UN PROBLEMA… PERSISTENTE
La persistenza dei dati di una applicazione Java attraverso JDBC è sicuramente
utile, ma richiede che vengano generate manualmente delle query SQL che sono
stringhe che vengono passate come argomenti a delle funzioni.
Quello che si va a fare è una sorta di traduzioni da classi Java a istruzioni SQL e
viceversa!
Questa traduzione è operata per ogni classe del modello che necessita
persistenza e per ogni operazione sul database!
➔ Separare in classi ad hoc tutto il codice che gestisce gli accessi al DB.
➔ Ottenere classi dell’applicazione indipendenti da quelle di interazione con il
DB, magari riutilizzando delle parti.
Qui un buon riferimento a comprendere la teoria del DAO con un buon esempio.
SOLUZIONE DI DAO
Separare le classi in: