Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
PROVA FINALE – Ingegneria del software Ing. Jody Marca – [email protected]
Laboratorio N° 4
© 2015 – Jody Marca – Laboratorio numero 4
Cos’è JDBC
JDBC significa Java Database Connectivity
Standard definito da Sun MicroSystems per connettere
programmi Java ai database relazionali
E' costituito da un insieme di classi e interfacce scritte
in Pure Java
Si basa sul concetto di driver di database
Il driver è una implementazione JDBC specifica per
database
Permette ai diversi fornitori di database di estendere lo
standard con i loro specifici driver JDBC (Derby,
PostgreSQL, Oracle, MySQL, MS SQL Server …)
2
© 2015 – Jody Marca – Laboratorio numero 4
Cosa fa JDBC
Le principali funzionalità di JDBC sono:
Stabilisce una connessione con il database
Invia comandi SQL
Processa il risultato dei comandi inviati
3
© 2015 – Jody Marca – Laboratorio numero 4
Step dell’utilizzo di JDBC
Come si usa:
Import del package java.sql.*
Registrazione del driver del database da utilizzare
Apertura connessione
Creazione oggetto Statement
Esecuzioni di Create, Drop, Delete, Insert e Update
Esecuzione di Select e recupero dati dal ResultSet
Utilizzo ResultSet
Chiusura risorse ResultSet e Statement
Chiusura connessione
4
© 2015 – Jody Marca – Laboratorio numero 4
Registrazione del driver
Per utilizzare un driver di database un'applicazione lo
deve rendere disponibile applicazione (si chiama
registrazione del driver)
Questa operazione deve essere fatta prima di creare la
prima connessione al database
Class.forName(DRIVER).newInstance()
La stringa DRIVER è database dependent
Es. Derby org.apache.derby.jdbc.EmbeddedDriver
Postgres org.postgresql.Driver
5
© 2015 – Jody Marca – Laboratorio numero 4
Connessione
Per creare una connessione si utilizza il metodo
getConnection(String url, String user, String pass)
della classe java.sql.DriverManager
Tutti i metodi di JDBC lanciano l'eccezione
java.sql.SQLException
Una connessione rappresenta una sessione con uno
specifico db; possono quindi gestire più connessioni
contemporanee con uno o più db
E' possibile:
ottenere informazioni sulla struttura del db (metadata)
gestire le transazioni
6
© 2015 – Jody Marca – Laboratorio numero 4
Url del JDBC
Per effettuare la connessione è necessario “costruire” URL
da utilizzare nel metodo getConnection:
La URL contiene varie informazioni
indirizzo (e porta) dove risiede il database
nome dell'istanza del database
Es: jdbc:postgresql://[host]:[porta]/[dbname]
jdbc:derby:[PathAlDatabase]
//Carico il driver – solo
Class.forName(DRIVER).newInstance();
//Apro la connessione
Connection conn = DriverManager.getConnection(URL, USER, PASS);
7
© 2015 – Jody Marca – Laboratorio numero 4
Ricapitoliamo … 8
DriverManager
getConnection( url, user,
passwd) : Connection
<<interface>> Connection
createStatement(): Statement
close( )
isClosed( ): boolean
getCatalog( ): String
PostgreSQLConnection
crea
DerbyConnection
© 2015 – Jody Marca – Laboratorio numero 4
L’interfaccica Statment
Per eseguire delle query è necessario creare un’instanza
Statement: Statement st = connessione.createStatement()
Lo Statement offre metodi indipendenti dal DB per
eseguire le diverse tipologie di query SQL:
ResultSet executeQuery(String sql)
interrogazione SQL con risultato
int executeUpdate(String sql)
interrogazione senza risultato (creazione tabelle, aggiornamento
tabelle, ...), restituisce il numero di tuple coinvolte nell’operazione
boolean execute(String sql)
invocazione procedure che restituiscono risultati multipli, o stringhe
SQL sconosciute
9
© 2015 – Jody Marca – Laboratorio numero 4
L’interfaccica Resulset
È ottenuta come parametro di ritorno del metodo
executeQuery in una query di selezione
Un ResultSet fornisce l'accesso ai dati di una tabella
generati eseguendo uno Statement
Ogni Statement gestisce un solo ResultSet alla volta
Il risultato (della query) è rappresentato come
enumerazione di tuple con cursore di scorrimento delle
tuple
Si possono ottenere i dati utilizzando i get dei datatype
SQL definiti in Java
10
© 2015 – Jody Marca – Laboratorio numero 4
Recupero dei dati dal Resulset
I tipi di dati sono identificati da costanti intere della
classe java.sql.Types
L’interfaccia ResultSet offre metodi getXXX() per ottenere i valori di campi di tipi diversi. I metodi effettuano il mapping da tipi JDBC a tipi java:
getString(String columnName), getString(int colNumber)
getDate(String columnName), getDate(int colNumber)
getInt(String columnName), getInt(int colNumber)
getURL(String columnName), getURL(int colNumber)
getObject(String columnName), getObject(int colNumber)
Attenzione le colonne sono numerate a partire da 1
11
© 2015 – Jody Marca – Laboratorio numero 4
Mapping dei principali DataType SQL <-> Java 12
JDBC DataType Utilizzo SQL DataType Java DataType
DATALINK Rappresenta SQL DATALINK DATALINK java.net.URL
DATE Data strutturata come giorno,
mese ed anno
DATE java.sql.Date
VARCHAR Stringa di lunghezza variabile VARCHAR String
INTEGER interi a 32-bit con segno INTEGER int
NULL Rappresenta NULL values NULL null per oggetti java, 0 per
numeri, false per boolean
JAVA_OBJECT Memorizzare oggetti Java Tipi definiti
dall’utente (solo
negli ORDBMS)
Object
DOUBLE floating-point, doppia
precisione con mantissa a 15 bit
DOUBLE
PRECISION
double
© 2015 – Jody Marca – Laboratorio numero 4
Esempio
String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
String URL = "jdbc:derby:databasedir", USER = "user", PASS = "pass" ;
Class.forName(DRIVER).newInstance();
Connection connessione = DriverManager.getConnection(URL, USER, PASS);
//Creo lo statement
Statement st = connessione.createStatement();
//Eseguo una query di update
st.executeUpdate("UPDATE tabella SET numero = 0 WHERE stringa = 'prova' ");
//Eseguo una query di select
ResultSet rs = st.executeQuery("SELECT stringa, numero FROM tabella ");
//Scandisco il risultato
while(rs.next()){
String stringaLetta = rs.getString(1);
Integer interoLetta = rs.getInt(“numero”);
}
13
© 2015 – Jody Marca – Laboratorio numero 4
Metadati
Da ogni Resulset è possibile recuperare l’interfaccia
ResulSetMetadata per ispezionare i metadati
ResultSetMetaData metaData = resulset.getMetaData();
I metodi di ispezione dei metadati del risultato sono:
String getCatalogName()
String getTableName()
int getColumnCount()
String getColumnName()
int getColumnType(), …………
14
© 2015 – Jody Marca – Laboratorio numero 4
Chiusura delle risorse
Le connessioni sono risorse preziose per cui vanno
rilasciate appena possibile
Lo stesso vale per Statement e ResultSet
La chiusura avviene utilizzando il metodo close()
Connection.close()
Statement.close();
ResultSet.close();
Una connessione aperta e inutilizzata spreca risorse
15
© 2015 – Jody Marca – Laboratorio numero 4
Esempio
Class.forName(DRIVER).newInstance();
Connection connessione = DriverManager.getConnection(URL, USER, PASS);
Statement st = connessione.createStatement();
st.executeUpdate(“UPDATE tabella SET numero = 0 WHERE stringa = ‘prova’ ”);
ResultSet rs = st.executeQuery(“SELECT stringa, numero FROM tabella”);
while(rs.next()){
String stringaLetta = rs.getString(1);
Integer interoLetta = rs.getInt(“numero”);
}
//Chiudo Resulset, Statement e Connection
rs.close();
st.close();
connessione.close();
16
© 2015 – Jody Marca – Laboratorio numero 4
PreparedStatement
Sono statement parametrizzati utili quando
a tempo di compilazione non si hanno info necessarie
per specificare completamente la query
si vuole compilare uno statement una sola volta, e poi
eseguirlo più volte sostituendo i valori dei parametri al
momento della esecuzione (sostituire parametri in più
invocazioni dello stesso statement)
Es: SELECT <select_fields> FROM <table_name> WHERE
USER_ID = ? (il punto di domanda viene sostituito a
runtime con il valore)
17
© 2015 – Jody Marca – Laboratorio numero 4
PreparedStatement / 2
Sono istanziati dal metodo prepareStatement(String sql)
della classe Connection
PreparedStatement offre I metodi
ResultSet executeQuery(String sql)
int executeUpdate(String sql)
boolean execute(String sql)
setString(int i, String s)
assegna all’i-mo parametro unbound la stringa s
setDate(int parNumber, java.sql.Date date)
assegna all’i-mo parametro unbound la data date
….. Un metodo set per ogni tipo di dato JDBC …….
18
© 2015 – Jody Marca – Laboratorio numero 4
Esercizio
Creiamo un programma che si connette ad un db e
effettua query di INSERT,SELECT e UPDATE
Come database utilizzeremo Apache Derby in modalità
Embedded. http://db.apache.org/derby
Driver: "org.apache.derby.jdbc.EmbeddedDriver"
URL di connessione: "jdbc:derby:[PathAlDatabase]"
Interprete SQL consigliato per la manipolazione del
database: SQuirreL SQL. http://www.squirrelsql.org/