63
1 JDBC © Matteo Magnani, Danilo Montesi – Università di Bologna Dati relazionali e JAVA: API JDBC

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

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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