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 …)
© 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
© 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
© 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
© 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
© 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);
© 2015 – Jody Marca – Laboratorio numero 4
Ricapitoliamo …
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
© 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
© 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
© 2015 – Jody Marca – Laboratorio numero 4
Mapping dei principali DataType SQL <-> Java
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”);
}
© 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(), …………
© 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
© 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();
© 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)
© 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 …….
© 2015 – Jody Marca – Laboratorio numero 4
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/