![Page 1: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/1.jpg)
1
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Dati relazionali e JAVA: API JDBC
![Page 2: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/2.jpg)
2
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Obiettivi
• Impareremo a utilizzare l’API JDBC, che permette a un programma scritto in Java di connettersi e manipolare dati relazionali.
• Motivazioni della nascita di JDBC.• Connessione a una sorgente di dati tabellari.• Manipolazione dei dati.
![Page 3: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/3.jpg)
3
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Utente Casuale
DBMS e SQL
• La necessita' di manipolare basi di dati indipendentemente dal sistema utilizzato ha portato alla standardizzazione di SQL.
• Semplici comandi SQL sono utilizzabili su qualsiasi sistema.
SQL
DBMS
DB
DBMS
DB
![Page 4: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/4.jpg)
4
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
DBMS e SQL
• Purtroppo, SQL non e’ sempre sufficiente.• E' spesso necessario immergere SQL in altri
linguaggi (applicazioni).• Applicazioni che utilizzano SQL devono
comunicare con i DBMS.• Inizialmente, la connessione alle basi di dati
variava a seconda del sistema.
![Page 5: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/5.jpg)
5
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
DBMS, SQL e ODBC
• Per ovviare a queste difficolta', Microsoft ha prodotto ODBC (Open Database Connectivity).
• ODBC e' un'API, scritta in C, che tramite driver specifici rende trasparente il tipo di DBMS.
DBMS
DB
Client
ODBCDriver
DBMS
DB
ODBCDriver
ODBCAPI
![Page 6: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/6.jpg)
6
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
DBMS, SQL, ODBC e Java
• Il linguaggio C non e' portabile, e i driver ODBC devono essere installati su ogni client.
• Problematico in caso di client via internet.• Ricco di opzioni complicato.• Nasce JDBC. DBMS
DBClientJava
JDBCDriver
JDBCDriver
JDBCAPI
DBMS
DB
![Page 7: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/7.jpg)
7
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Principali passi nell’utilizzo di JDBC
• Apertura di una connessione con un DBMS.• Scambio di dati (query e aggiornamenti).• Chiusura della connessione.
![Page 8: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/8.jpg)
8
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Connessione a un database
• La connessione a un database avviene attraverso un Driver, che dipende dal sistemacon il quale si vuole comunicare.
• Il Driver traduce i metodi dell’API JDBC in istruzioni comprensibili al DBMS utilizzato.
• Bisogna mettere a conoscenza il programmajava di dove reperire il Driver necessario.
• Questa operazione si chiama registrazionedel Driver.
![Page 9: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/9.jpg)
9
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Registrazione del Driver
• Inizialmente e’ necessario creare una istanzadel Driver.
Class.forName(nome_del_driver);• Il nome del driver identifica una classe Java.• La prima parte del nome identifica le directory dentro
alle quali cercare la classe. • “com.cloudscape.core.RmiJdbcDriver”• “com.mysql.jdbc.Driver”• “org.postgresql.Driver”
![Page 10: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/10.jpg)
10
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Registrazione del Driver
• Invece di utilizzare un metodo all’interno del programma, e’ possibile registrare il Driver passandolo come parametro, al momento dell’esecuzione.
$ java -Djdbc.drivers = Driver App.class
![Page 11: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/11.jpg)
11
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Apertura della connessione
• A questo punto si apre la connessione. • Il metodo DriverManager.getConnection()
riceve come parametro un URL che identificaun server DBMS.
• A partire dalla struttura dell’URL, viene automaticamente cercato un Driver che possa gestirlo.
• Il metodo, tramite il Driver, apre una connessione e ritorna un oggetto di tipoConnection.
![Page 12: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/12.jpg)
12
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Apertura della connessione
• Gli url dipendono dal Driver e dal server, e tipicamente hanno una struttura simile ai seguenti esempi:
• jdbc:mysql://localhost/demo• jdbc:postgresql://localhost:8000/test• jdbc:cloudscape:rmi:db1
![Page 13: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/13.jpg)
13
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Riepilogo: ottenere una connessione
Class.forName(driver).newInstance();try{
con=DriverManager.getConnection(url,””,””);// Qui utilizzare la connessione
}catch (SQLException sql) {// gestione eccezione...}finally {
try {con.close();}catch (SQLException ex) {// gest. eccezione...}}
![Page 14: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/14.jpg)
14
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Riepilogo: ottenere una connessione
• In pratica, una connessione si puo’ aprire tramite due righe di codice:
Class.forName(driver).newInstance();con=DriverManager.getConnection(url,””,””);• Se il Driver viene registrato dall’esterno, e’
addirittura sufficiente una sola istruzione.• Vediamo brevemente come viene aperta la
connessione.
![Page 15: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/15.jpg)
15
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Esmpio di apertura di una connessione
DB
DriverManager
Applicazione java
Classe del framework java
DBMS
![Page 16: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/16.jpg)
16
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Caricamento (creazione) di un Driver
DB
DriverManager
Class.forName(driver).newInstance();
![Page 17: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/17.jpg)
17
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Registrazione del Driver
DB
DriverManager
DriverManager.registerDriver(this);
Class.forName(driver).newInstance();
![Page 18: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/18.jpg)
18
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Eventuale registrazione di altri Driver
DB
DriverManager
Class.forName(driver2).newInstance();
DriverManager.registerDriver(this);
![Page 19: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/19.jpg)
19
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Richiesta di connessione
DB
DriverManager
DriverManager.getConnection(url);
![Page 20: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/20.jpg)
20
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Selezione del Driver opportuno
DB
getDrivers(url);
DriverManager
DriverManager.getConnection(url);
![Page 21: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/21.jpg)
21
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Apertura della connessione
DB
DriverManager
Driver.connect(url);
DriverManager.getConnection(url);
![Page 22: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/22.jpg)
22
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Restituzione della connessione
DB
DriverManager
API
![Page 23: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/23.jpg)
23
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Esempio di interrogazione SQL
• Prima di analizzare i dettagli di JDBC, vediamoun esempio di una tipica e semplice espressione SQL:
SELECT Cognome, StipendioFROM Impiegato• Le istruzioni SQL che vogliamo valutare sono
utilizzate direttamente dai metodi Java.stringaSQL = “SELECT Cognome, Stipendio ” +
“FROM Impiegato”
![Page 24: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/24.jpg)
24
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Esempio di interrogazione SQL
• Questa interrogazione si esegue facilmente in due passi:
• Si ottiene dalla connessione un oggettoStatement:
Statement sttm = con.getStatement();• Si esegue la query e si ottiene il risultato:ResultSet rs = sttm.executeQuery(stringaSQL);
![Page 25: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/25.jpg)
25
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Ottenere il risultato di una interrogazione
Class.forName(driver).newInstance();try{
con=DriverManager.getConnection(url,””,””);Statement sttm = con.getStatement();ResultSet rs = sttm.executeQuery(stringaSQL);
}catch (SQLException sql) {// gestione eccezione...}finally {con.close();}
![Page 26: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/26.jpg)
26
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Utilizzo del risultato
• Un ResultSet contiene il risultato dell’interrogazione, accessibile tramite un cursore e alcuni metodi per recuperarne il contenuto.
• Il cursore inizialmente e’ posizionato prima della prima riga.
• La riga successiva si ottiene tramite il metodo next(), che ritorna true quando tale riga e’ presente.
• Quando viene raggiunta l’ultima riga, next() ritorna false e il ResultSet viene chiuso automaticamente.
![Page 27: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/27.jpg)
27
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Utilizzo del risultato
while( rs.next() ) { rs.getString(1);rs.getInt(2);// Estrarre valori da tutte le colonne richieste
}
![Page 28: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/28.jpg)
28
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Scrollable e Updatable Result Sets
• Gli oggetti di tipo ResultSet visti finora sonopercorribili dalla prima all’ultima riga una voltasoltanto, e non possono essere aggiornati.
• E’ possibile utilizzare ResultSet percorribili tramite un accesso random e aggiornabili.
• Per maggiori informazioni:http://java.sun.com/j2se/1.4.2/docs/api/
ALL CLASSES ResultSet
![Page 29: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/29.jpg)
29
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Equivalenze di tipo
Tipo SQL Metodo Java
BIGINT getLong()BINARY getBytes()BIT getBoolean()CHAR getString()DATE getDate()DECIMAL getBigDecimal()DOUBLE getDouble()FLOAT getDouble()INTEGER getInt()
![Page 30: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/30.jpg)
30
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Equivalenze di tipo
LONGVARBINARY getBytes()LONGVARCHAR getString()NUMERIC getBigDecimal()OTHER getObject()REAL getFloat()SMALLINT getShort()TIME getTime()TIMESTAMP getTimestamp()TINYINT getByte()VARBINARY getBytes()VARCHAR getString()
![Page 31: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/31.jpg)
31
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Punto della situazione
Driver
DriverManager
Connection
Statement•executeQuery()
ResultSet•next()•getXXX()
![Page 32: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/32.jpg)
32
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Un esempio di utilizzo
• Vedremo ora un esempio pratico di come JDBC possa contribuire al fine di riutilizzare la stessa applicazione con diversi DBMS.
• Per rendere l’esempio piu’ significativo, introduciamo una nuova classe che ci permette di ottenere informazioni sul DBMS a cui ci connettiamo.
• Tale classe si puo’ ottenere tramite il metodo Connection.getMetaData().
![Page 33: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/33.jpg)
33
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
DatabaseMetaData
• Gli oggetti di tipo DatabaseMetaData mettono a disposizione moltissimi metodi, che potranno essere scelti volta per volta utilizzando la documentazione della classe.
• Nell’esempio utilizzeremo i due seguenti:– getDatabaseProductName() – getDatabaseProductVersion()
![Page 34: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/34.jpg)
34
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Elementi dell’esempio
DB
DB
JDBCDemo.class
com/mysql/jdbc/Driver
sun/jdbc/odbc/JdbcOdbcDriver
DB
properties.cfgproperties2.cfgproperties3.cfg
![Page 35: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/35.jpg)
35
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
I file properties.cfg
Driver: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost/DEMO
Driver: sun.jdbc.odbc.JdbcOdbcDriverurl: jdbc:odbc:db1
Driver: sun.jdbc.odbc.JdbcOdbcDriverurl: jdbc:odbc:Impiegato
properties.cfg
properties2.cfg
properties3.cfg
![Page 36: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/36.jpg)
36
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
JDBCDemo.java (1)
String cfgFile = "properties.cfg";
// getting connection parameters
if (args.length != 0)
cfgFile = args[0];
init(cfgFile);
![Page 37: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/37.jpg)
37
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
JDBCDemo.java (2)
String sqlQuery = "SELECT Cognome, Stipendio FROM Impiegato";
con = DriverManager.
getConnection(url,"","");
DatabaseMetaData db = con.getMetaData();
System.out.println("DBMS: " + db.getDatabaseProductName() +
" version " + db.getDatabaseProductVersion());
![Page 38: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/38.jpg)
38
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
JDBCDemo.java (3)
Statement stmt = con.createStatement();
System.out.println(sqlQuery);
ResultSet rs = stmt.executeQuery(sqlQuery);
while (rs.next()) {
System.out.print(rs.getString(1));
System.out.println("\t" + rs.getInt(2));
}
![Page 39: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/39.jpg)
39
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Esempio 1
DB
DB
DB
Driver
url
![Page 40: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/40.jpg)
40
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Esempio 2
DB
DB
DB
Driverurl
![Page 41: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/41.jpg)
41
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Esempio 3
DB
DB
DBurl
Driver
![Page 42: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/42.jpg)
42
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Esecuzione esempio 1
E:\jdbc>java JDBCDemo properties.cfgDBMS: MySQL version 4.0.16-nt
SELECT Cognome, Stipendio FROM ImpiegatoRossi 45Bianchi 36Verdi 40Neri 45Rossi 80Lanzi 73Borroni 40
Franco 46
![Page 43: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/43.jpg)
43
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Esecuzione esempio 2
E:\jdbc>java JDBCDemo properties2.cfgDBMS: ACCESS version 04.00.0000
SELECT Cognome, Stipendio FROM ImpiegatoRossi 45Bianchi 36Verdi 40Neri 45Rossi 80Lanzi 73Borroni 40
Franco 46
![Page 44: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/44.jpg)
44
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Esecuzione esempio 3
E:\jdbc>java JDBCDemo properties3.cfgDBMS: EXCEL version 08.00.0000
SELECT Cognome, Stipendio FROM ImpiegatoBianchi 36Rossi 80Neri 45Verdi 40Lanzi 73Franco 46Rossi 45
Borroni 40
![Page 45: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/45.jpg)
45
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Statement
• Abbiamo visto come un oggetto di tipo Statement possa essere utilizzato per compiere una interrogazione, tramite il metodo executeQuery().
• Lo stesso oggetto puo’ anche essere utilizzato per aggiornare il database.
• A questo scopo si utilizza il metodo executeUpdate().
![Page 46: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/46.jpg)
46
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Statement
• Utilizzo di Statement.executeUpdate():• UPDATE• INSERT• DELETE• CREATE TABLE• DROP TABLE• ALTER TABLE
![Page 47: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/47.jpg)
47
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Statement
• Esempio di utilizzo:stringaSQL = “DELETE FROM Vigili ” +
“WHERE Matricola=0012”;int righe = sttm.executeUpdate(stringaSQL);• righe contiene il numero di righe
modificate dal comando diaggiornamento.
![Page 48: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/48.jpg)
48
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Prepared Statement
• Nel caso si debba ripetere piu’ volte un’istruzione SQL in cui cambiano solo alcuni valori, si puo’ preparare uno statement SQL parametrizzato, in cui sia possibile assegnare volta per volta i valori di alcune variabili.
![Page 49: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/49.jpg)
49
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Prepared Statement
SELECT Nome FROM Vigili WHERE Matricola =
2 FASI:
Preparazione:
parametro_1 = 1024;
execute(); // SELECT Nome FROM Vigili WHERE Matricola = 1024
parametro_1 = 1027;
execute(); // SELECT Nome FROM Vigili WHERE Matricola = 1027
Utilizzo:
![Page 50: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/50.jpg)
50
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Prepared Statement (Java)
Preparazione:update = con.prepareStatement(
"UPDATE Vigili SET Nome = ? " + "WHERE Matricola = ?" );
Utilizzo:update.setString(1, “Marco" );update.setInt(2, 1024 );update.executeUpdate();
![Page 51: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/51.jpg)
51
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Prepared Statements
Preparazione:select = con.prepareStatement(
"SELECT Nome FROM Vigili " + "WHERE Matricola = ? ");
Utilizzo:select.setInt(1, 1027 );select.executeQuery();
![Page 52: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/52.jpg)
52
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Callable Statement
• Per completezza, bisogna ricordare un terzo tipo di Statement: CallableStatement.
• Un CallableStatement serve per eseguireStoredProcedures.
• Non approfondiremo ulteriormente questoargomento.
![Page 53: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/53.jpg)
53
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
SQLException
• JDBC fornisce 4 tipi specifici di eccezioni: BatchUpdateException DataTruncation SQLException SQLWarning
• SQLException e’ la classe da cui derivano le altre, e mette a disposizione due metodi per recuperare i codici di errore:– getErrorCode()– getSQLState()
![Page 54: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/54.jpg)
54
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Gestione di una SQLException
try { // codice JDBC } catch ( SQLException SQLe) {
while( SQLe != null) {System.out.println(SQLe.getMessage());System.out.print(“EC: ”+SQLe.getErrorCode()); System.out.println (“ SS: ”+SQLe.getSQLState()); SQLe = SQLe.getNextException();
} }
![Page 55: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/55.jpg)
55
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Punto della situazione
DatabaseMetaData
Driver
DriverManager
Connection
Statement
ResultSet int•next()•getXXX()
executeQuery() executeUpdate()
-Statement-PreparedStatement-CallableStatement
SQLException
try/catch
![Page 56: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/56.jpg)
56
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
DataSource
• Abbiamo visto come utilizzare un Driver e un indirizzo di un database per creare una connessione.
• E’ possibile introdurre un livello di astrazione superiore.
• L’utilizzo di un oggetto DataSource, oltre a rendere il codice piu’ portabile, puo’ aumentare l’efficienza dell’applicazione, utilizzando particolari tipi di connessione.
• Per approfondimenti: http://java.sun.com/j2se/1.4.2/docs/api/PooledConnection e XAConnection.
![Page 57: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/57.jpg)
57
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Connessione con Driver e DriverManager
DBDriver
URL
La connessione e’ effettuata a basso livello,dovendo specificare la locazione del Driver
e l’indirizzo del database.
![Page 58: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/58.jpg)
58
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Connessione tramite DataSource
DS
Una DataSource e’ un oggettologico indipendente dalla
locazione e dal tipo di base di dati.
jdbc/MyDB
![Page 59: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/59.jpg)
59
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Connessione tramite DataSource
DB
DS JNDI
Un servizio Java Naming and Directory Interfacepermette di gestire la sorgente dei dati,provvedendo a passare all’applicazione
l’oggetto richiesto.
![Page 60: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/60.jpg)
60
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
DataSource
import javax.naming.*; import javax.sql.*;
Context ctx = new InitialContext();DataSource ds =
(DataSource)ctx.lookup("jdbc/MyDB" ); Connection con =
ds.getConnection("utente", "password" );
![Page 61: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/61.jpg)
61
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Punto della situazione
DatabaseMetaData
Driver
DriverManager
Connection
Statement
ResultSet int•next()•getXXX()
executeQuery() executeUpdate()
-Statement-PreparedStatement-CallableStatement
SQLException
try/catchContext
DataSource
![Page 62: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/62.jpg)
62
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Concetti avanzati
• Quanto visto finora e’ sufficiente per connettersi e interagire con una base di dati, in modo semplice ma efficace.
• JDBC offre pero’ funzionalita’ avanzate, di cui si potrebbe avere bisogno.– Transazioni.– Batch updates.– Gestione di altri tipi di dato (CLOB, BLOB, Array).– Rowsets.
• Riferirsi alla webliografia per approfondimenti.
![Page 63: Dati relazionali e JAVA: API JDBC2 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Obiettivi • Impareremo a utilizzare l’API JDBC, che permette a un programma](https://reader033.vdocuments.pub/reader033/viewer/2022060509/5f2505f981f6ad41c47e4af3/html5/thumbnails/63.jpg)
63
JDBC© Matteo Magnani, Danilo Montesi – Università di Bologna
Webliografia
• Pagina principale su JBDC:http://java.sun.com/products/jdbc/• Elenco di risorse didattiche su JDBC:http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/index.html• Driver disponibili:http://servlet.java.sun.com/products/jdbc/drivers