JDBC - Università degli Studi di Roma "Tor Vergata"

Corso di Basi di Dati – 12 novembre 2001
1
Univers ità di R oma T or Vergata
F acoltà di Ingegneria
Cors o di B as i di Dati
A.A. 2001/2002
-DYD 'DWDEDVH &RQQHFWLYLW\
Andrea D'Ambrogio
[email protected]
12 novembre 2001
[email protected]
!"
#$%&'((%)"**"+
Corso di Basi di Dati – 12 novembre 2001
2
,
0
$SSOLFD]LRQ 6 FR .
DFFHVV/
'%
1
La maggior parte delle applicazioni SW attuali (soprattutto in ambito
gestionale) sono basate sul paradigma C/S (client/server) con il server
che gestisce l’accesso ad uno o più DB sottostanti
1
Per la gestione di tali DB si fa solitamente uso di DBMS relazionali, che
mettono a disposizione funzionalità necessarie per applicazioni missioncritical, quali:
2 Concorrenza (accesso multiutente)
2 Gestione della distribuzione
2 Gestione delle transazioni
2 Throughput elevato
2 Data recovery
3
Nell’ambito dei DBMS relazionali il SQL (Structured Query Language)
fornisce ai programmatori uno strumento per definire e manipolare dati
in modo standard e universale, indipendentemente dallo specifico
DBMS sottostante
3
In modo analogo, l' APIJDBC (Java Data Base Connectivity) mette a
disposizione uno strumento standard per l' accesso trasparente a DBMS
relazionali (tramite SQL) da applicazioni realizzate in Java
[email protected]
1
4565758
595:;<=>>;?8@6@8A
Corso di Basi di Dati – 12 novembre 2001
$SSOLFDWLR B
C
C
C
Presentation layer: gestisce
la raccolta delle richieste
utente e la presentazione dei
risultati forniti dal sistema
software
Application processing layer:
incapsula la logica mediante
cui il sistema software
realizza specifiche
funzionalità
Data management layer:
gestisce l'accesso ai dati del
sistema software
(tipicamente tramite DBMS)
3
OD\HUV
Presentation layer
Application processing
layer
Data management
layer
[email protected]
DEFEGEH
EIEJKLMNNKOHPFPHQ
Corso di Basi di Dati – 12 novembre 2001
$UFKLWHWWXUR
& S
Presentation
Thin-client
model
Client
WZRWLHU
Server
Data management
Application
processing
Client
Presentation
Application processing
Fat-client
model
4
Server
Data
management
[email protected]
2
TUVUWUX
UYUZ[\]^^[_X`V`Xa
Corso di Basi di Dati – 12 novembre 2001
c
$UFKLWHWWXU b
c
5
&6 WKUHHWLHU
In una architettura C/S three-tier i tre strati applicativi
vengono eseguiti da processi distinti che possono essere
ospitati su host distribuiti ed eterogenei
Rispetto alle architetture C/S two-tier si ottengono
miglioramenti in termini di:
d
d
d
d
d
performance
flessibilità
manutenibilità
riusabilità
scalabilità
Presentation
Client
Server
Server
Application
processing
Data
management
[email protected]
efgfhfi
fjfklmnoolpiqgqir
(VHPSL s
Corso di Basi di Dati – 12 novembre 2001
Gt
DUFK u
6
&6 WKUHHWLHU
Internet banking system
Client
HTTP interaction
Datab ase server
Web server
Client
SQL query
Account service
provision
SQL
Customer
account
database
Client
Client
[email protected]
3
vwxwywz
w{w|}~€€}z‚x‚zƒ
Corso di Basi di Dati – 12 novembre 2001
$SSOLFD]LRQ „
…
7
-'%&
JDBC è un insieme di classi e interfacce, scritte nel linguaggio di
programmazione Java, per l'esecuzione di istruzioni SQL. Riferimenti:
†
†
…
Sun Microsystems, JDBC 1.2 API, January 1998
Sun Microsystems, JDBC 2.1 API, November 1999
…
Essendo realizzate in Java, le applicazioni JDBC possono essere
implementate sia come applicazioni stand-alone che come applet da
eseguire all'interno di browser web (con vantaggi rispetto a soluzioni
web di tipo CGI in termini di manutenibilità, robustezza, sicurezza e
facilità di sviluppo)
…
JDBC può essere usato come strumento per la realizzazione di
architetture C/S sia di tipo two-tier (fat o thin client) che di tipo three-tier
Rispetto a soluzioni proprietarie per l'accesso remoto a DBMS (es.
Oracle SQL*Net/Net8) JDBC fornisce un vantaggio considerevole,
ovvero l'indipendenza dallo specifico DBMS usato
[email protected]
vwxwywz
w{w|}~€€}z‚x‚zƒ
3DVV ‡
‰
‰
‰
‰
‰
‰
‰
WLSLF ‡
Corso di Basi di Dati – 12 novembre 2001
G‡
XQ
DSSOLFD]LRQ ˆ
8
-'%&
Caricamento del driver JDBC
Apertura della connessione al DB, specificando l'URL del
DB (nella forma jdbc:<subprotocol>:<subname>)
Eventuale interrogazione del DBMS al fine di ricavare
informazioni su funzionalità aggiuntive messe a
disposizione
Eventuale recupero di metainformazioni (schema del DB)
Definizione ed invio dell'istruzione SQL
Elaborazione dei risultati (la transazione viene completata
quando tutti i risultati sono stati recuperati)
Chiusura della connessione al DB
[email protected]
4
Š‹Œ‹‹Ž
‹‹‘’“””‘•Ž–Œ–Ž—
Corso di Basi di Dati – 12 novembre 2001
™
'ULYH ˜
9
-'%&
Il driver JDBC è il componente fondamentale di una applicazione JDBC
Il driver permette di stabilire la connessione con il database, e
implementa il protocollo necessario per la comunicazione tra client
(applicazione JDBC) e server (DBMS)
Dal punto di vista dell'API, realizzare un driver JDBC significa
implementare l'interfaccia java.sql.Connection
Dal punto di vista del protocollo, l'oggetto istanziato dalla classe che
implementa tale interfaccia converte le richieste di trasporto delle
istruzioni SQL secondo due possibili modalità:
š
Conversione in chiamate native del DBMS (driver types 1 e 2)
š
™
™
™
™
Conversione in network stream da inviare ad un componente remoto in
grado di realizzare la connessione al DBMS (driver types 3 e 4)
™
Inoltre, il driver JDBC deve essere in grado di effettuare il mapping tra i
tipi di dato del JDBC (definiti in java.sql.Types) ed i tipi di dato del
DBMS, ed interpretare le sequenze di escape SQL
La specifica JDBC permette di introdurre estensioni ai tipi di dato, per
creare tipi SQL user-defined e mapparli su classi Java
[email protected]
Š‹Œ‹‹Ž
‹‹‘’“””‘•Ž–Œ–Ž—
Corso di Basi di Dati – 12 novembre 2001
-'%›
10
GULYHU 7\SH JDBC-ODBC bridge
Richiede l'installazione di un driver ODBC (Open Data Base
Connectivity). Converte le richieste JDBC in richieste ODBC,
inviate al driver ODBC mediante chiamate native.
Un driver JDBC di tipo 1 (sun.jdbc.odbc.JdbcOdbcDriver) è
incluso all'interno del Sun JDK (Java Development Kit).
Client
Application
(Java)
œŸž
JDB C
Dr iver
T ype 1
¡§©¨¢£ª ¤¦ª ¥
ODB C
Dr iver
²©³´µ©¶¸·¹¶¸µ
«­µ©¬¯º®±» » °
DB MS
[email protected]
5
¼½¾½¿½À
½Á½ÂÃÄÅÆÆÃÇÀȾÈÀÉ
Corso di Basi di Dati – 12 novembre 2001
-'%Ê
11
GULYHU 7\SH Native API
Si interfaccia direttamente ad un driver per uno specifico DBMS o
ad un'API specifica, come ad es. la Oracle OCI (Oracle Call
Interface).
Un esempio di driver JDBC di tipo 2 è il driver JDBC OCI fornito
con il DBMS Oracle.
Client
Application
(Java)
Ë̟Í
JDB C
Dr iver
T ype 2
ÎÏÔ ÐÑÒ¦Ó
ÏÕ Õ
Vendor
API
Ö¦×ØÚÙÛÜ
Ý©Þ ×ß©à¸á¹à¸ß
ß©âã ã
DB MS
[email protected]
äåæåçåè
åéåêëìíîîëïèðæðèñ
Corso di Basi di Dati – 12 novembre 2001
-'%ò
12
GULYHU 7\SH Open Protocol-Net
Invia le richieste JDBC ad una sorgente dati remota mediante un
protocollo di rete vendor-neutral (host redirection).
Un esempio di driver JDBC di tipo 3 è il driver RmiJdbc
sviluppato da INRIA/France Mediation Project
Client
Application
(Java)
óôŸõ
JDB C
Dr iver
T ype 3
üÚýþÿ
ö¦÷øÚÿ ùúû
Net
S er ver
Gateway
üÿý
DB MS
[email protected]
6
"!#
$% %"!'&)()(*
Corso di Basi di Dati – 12 novembre 2001
-'%
+
13
GULYHU 7\SH Proprietary Protocol-Net
Invia le richieste JDBC ad una sorgente dati remota mediante un
protocollo di rete vendor-specific (host redirection).
Un esempio di driver JDBC di tipo 4 è il driver JDBC Thin fornito
con il DBMS Oracle.
Client
Application
(Java)
,-/.
JDB C
Dr iver
T ype 4
89
0 1 5
3 4'67
9 2
1:;=<>;=:
76?6
:6@
Net
S er ver
Gateway
3A
?;0 1
:A
@ @
DB MS
[email protected]
Corso di Basi di Dati – 12 novembre 2001
14
2UDFOH -'%& GULYHUV
BCDCECFCGC H"IJ
KL L"I'MF)ND)NFO
[email protected]
7
15
-'%&
Corso di Basi di Dati – 12 novembre 2001
DPELHQW
_
^
L
&RPXQLFD]LRQH FOLHQWVHUYHU
PQRQSQTQUQ V"WX
YZ Z"W'[T)\R)\T]
[email protected]
PQRQSQTQUQ V"WX
YZ Z"W'[T)\R)\T]
Corso di Basi di Dati – 12 novembre 2001
16
2UDFOH -'%& 7KLQ 'ULYHU
`
`
`
`
`
`
Driver di tipo 4 scritto interamente in Java (quindi platform-independent)
e conforme allo standard JDBC 1.2
Usa i Java sockets per la connessione diretta al server Oracle ed è
usato tipicamente per lo sviluppo di applet JDBC, sia in configurazione
two-tier che three-tier (ma può essere usato anche per applicazioni
Java stand-alone)
Fornisce una propria implementazione (emulazione) dello stack TCP/IP
di Oracle Net8 e, nel caso delle applet, richiede che il browser abbia la
capacità di supportare i Java sockets
Richiede che sia in esecuzione un TNS listener che accetti connessioni
tramite socket TCP/IP sul DB server
Non richiede che sia installato software Oracle sul lato client (il driver
JDBC Thin può essere scaricato con l'applet da eseguire). Anche se il
protocollo HTTP è stateless, una volta che il driver JDBC stabilisce la
connessione con il server, la comunicazione mantiene lo stato
Esegue connessioni con ogni DB Oracle versione 7.2.3 o successive
[email protected]
8
abcbdbebfb g"hi
jk k"h'le)mc)men
-'% o
q
Corso di Basi di Dati – 12 novembre 2001
2&p
17
'ULYHU
q
Driver di tipo 2 orientato allo sviluppo di applicazioni C/S Java o
middleware Java-based (Oracle Web Application Server)
Converte le richieste JDBC in chiamate alla OCI (Oracle Call Interface),
che sono poi inviate al DB server Oracle tramite Net8
E' scritto parte in Java e parte in C, e l'uso di chiamate native rende il
driver platform-specific
Richiede l'installazione di Net8 sul lato client e la presenza delle librerie
OCI (è però compatibile con tutte le versioni di Oracle e supporta tutti gli
adattatori Net8)
Può essere usato nelle seguenti configurazioni:
q
q
q
r
r
Con una applicazione Java in esecuzione sul client in configurazione twotier
Con una applicazione Java in esecuzione su middle tier in una
configurazione three-tier
Con un Java servlet in esecuzione su middle tier in una configurazione
three-tier
r
[email protected]
stutvtwtxt y"z{
|} }"z'~w)u)w€
Corso di Basi di Dati – 12 novembre 2001
5HTXLVLW 
†
L ‚
DPELHQW ƒ
G
18
VLVWHPD
0LFURVRI„
:LQGRZ …
17
†
Sun Microsystems Java Developer's Kit (JDK) versione 1.0.2 e 1.1.x (i
driver JDBC per Oracle 8.1.5 non sono compatibili con il JDK versione
1.2)
†
Installazione degli Oracle Java Server Products (creazione directory
jdbc in [ORACLE_HOME])
Aggiunta delle voci
‡
[ORACLE_HOME]\jdbc\lib\classes102.zip (JDK 1.0.2) o
‡
[ORACLE_HOME]\jdbc\lib\classes111.zip (JDK 1.1.x)
alla variabile d'ambiente CLASSPATH
†
Aggiunta della voce
‡
[ORACLE_HOME]\lib
alla variabile d'ambiente PATH (solo per driver JDBC OCI)
[email protected]
9
ˆ‰Š‰‹‰Œ‰‰ Ž"
‘’ ’"'“Œ)”Š)”Œ•
Corso di Basi di Dati – 12 novembre 2001
*HWWLQ–
19
VWDUWHG
Per una semplice applicazione JDBC che si connetta ad un database
Oracle (in esecuzione sull'host myhost con SID orcl) ed esegua una
query occorre sviluppare codice per implementare i seguenti passi:
1. Importazione package Java
2. Registrazione dei driver JDBC
3. Apertura connessione verso il DB
4. Creazione di un oggetto Statement
5. Esecuzione della query con ritorno di oggetto ResultSet
6. Elaborazione dei risultati in ResultSet
7. Chiusura di ResultSet
8. Chiusura di Statement
9. Chiusura della connessione
[email protected]
—˜™˜š˜›˜œ˜ "žŸ
¡ ¡"ž'¢›)£™)£›¤
,PSRUWD]LRQH SDFNDJ¥
9
20
-DYD
Aldilà del tipo di driver usato, il codice
dell’applicazione JDBC deve contenere le
seguente direttive di import:
¦
import java.sql.*
import java.math.*
¦
9
Corso di Basi di Dati – 12 novembre 2001
Qualora si volessero usare le Oracle JDBC
Extensions (non necessarie per lo sviluppo di
semplici applicazioni JDBC) vanno anche importati
i seguenti package:
¦
¦
oracle.jdbc.driver.*
oracle.sql.*
[email protected]
10
§¨©¨ª¨«¨¬¨ ­"®¯
°± ±"®'²«)³©)³«´
Corso di Basi di Dati – 12 novembre 2001
5HJLVWUD]LRQ µ
GH ¶
GULYH ·
21
-'%&
I driver Oracle installati sul sistema vanno registrati
eseguendo l’istruzione:
DriverManager.registerDriver (new
oracle.jdbc.driver.OracleDriver());
oppure, in alternativa, l’istruzione:
Class.forName(“oracle.jdbc.driver.
OracleDriver”);
[email protected]
§¨©¨ª¨«¨¬¨ ­"®¯
°± ±"®'²«)³©)³«´
$SHUWXU ¸
»
Corso di Basi di Dati – 12 novembre 2001
FRQQHVVLRQ µ
YHUV ¹
Lº
22
'%
driver JDBC OCI
Connection conn = DriverManager.getConnection
("jdbc:oracle:oci8:@MyHostString", "scott", "tiger");
s e MyHos tS tring è una entry in T NS NAME S .OR A corris pondente a
myhos t, altrimenti:
»
Connection conn = DriverManager.getConnection
("jdbc:oracle:oci8:@(description=(address=(host=myhost)
(protocol=tcp)(port=1521))(connect_data=(sid=orcl)))",
"scott", "tiger");
driver JDBC Thin
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@myhost:1521:orcl", "scott", "tiger");
oppure, in alternativa:
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@(description=(address=(host=myhost)
(protocol=tcp) (port=1521))(connect_data=(sid=orcl)))",
"scott", "tiger");
[email protected]
11
¼½¾½¿½À½Á½ Â"ÃÄ
ÅÆ Æ"Ã'ÇÀ)Ⱦ)ÈÀÉ
Corso di Basi di Dati – 12 novembre 2001
23
*HVWLRQH TXHU\
Ê
Creazione oggetto Statement
Statement stmt = conn.createStatement();
Ê
Esecuzione query
ResultSet rset = stmt.executeQuery ("SELECT nome,cognome
FROM Dipendente, Commesso WHERE Dipendente.DipId =
S elezione
riga
Commesso.DipId");
Ê
E laborazione ris ultati
S elezione
colonne
while (rset.next())
System.out.println (rset.getString(1), rset.getString(2));
un oggetto di clas s e ResultSet definis ce implicitamente un curs ore, il
cui nome può es s ere ottenuto invocando il metodo getCursorName()
[email protected]
¼½¾½¿½À½Á½ Â"ÃÄ
ÅÆ Æ"Ã'ÇÀ)Ⱦ)ÈÀÉ
Corso di Basi di Dati – 12 novembre 2001
&KLXVXU Ë
9
24
RJJHWWL
Chiusura oggetto ResultSet
rset.close();
9
Chiusura oggetto Statement
stmt.close();
9
Chiusura oggetto Connection
conn.close();
[email protected]
12
ÌÍÎÍÏÍÐÍÑÍ Ò"ÓÔ
ÕÖ Ö"Ó'×Ð)ØÎ)ØÐÙ
Corso di Basi di Dati – 12 novembre 2001
8Ú
25
HVHPSLR
import java.sql.*;
import java.math.*;
import java.io.*;
class JdbcTest {
public static void main (String args []) throws SQLException {
DriverManager.registerDriver (new
oracle.jdbc.driver.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:
@myhost:1521:ORCL", "scott", "tiger");
Statement stmt = conn.createStatement ();
ResultSet rset = stmt.executeQuery ("SELECT nome,cognome FROM
Dipendente, Commesso WHERE Dipendente.DipId = Commesso.DipId");
while (rset.next ())
System.out.println (rset.getString (1), (rset.getString (2));
rset.close();
stmt.close();
conn.close();
}
}
[email protected]
ÛÜÝÜÞÜßÜàÜ á"âã
äå å"â'æß)çÝ)çßè
Corso di Basi di Dati – 12 novembre 2001
&RPSLOD]LRQé
éëê
26
HVHFX]LRQH
υ Compilazione file sorgente Java (JdbcTest.java)
prompt> javac JdbcTest.java
o
Esecuzione
prompt> java JdbcTest
p
Output a video
Paolo
Rossi
Mario
Rossi
Paolo
Bianchi
Mario
Verdi
[email protected]
13
PDSSLQJV
ìíîíïíðíñí ò"óô
õö ö"ó'÷ð)øî)øðù
'DWDW\SH
ú
StandardJDBC
Datatypes
Corso di Basi di Dati – 12 novembre 2001
27
JavaNativeDatatypes SQLDatatypes OracleExtensions
java.sql.Types.CHAR
java.lang.String
CHAR
oracle.sql.CHAR
java.sql.Types.VARCHAR
java.lang.String
VARCHAR2
oracle.sql.CHAR
java.sql.Types.LONGVARCHAR java.lang.String
LONG
oracle.sql.CHAR
java.sql.Types.NUMERIC
java.math.BigDecimal
NUMBER
oracle.sql.NUMBER
java.sql.Types.DECIMAL
java.math.BigDecimal
NUMBER
oracle.sql.NUMBER
java.sql.Types.BIT
boolean
NUMBER
oracle.sql.NUMBER
java.sql.Types.INTEGER
int
NUMBER
oracle.sql.NUMBER
java.sql.Types.REAL
float
NUMBER
oracle.sql.NUMBER
java.sql.Types.FLOAT
double
NUMBER
oracle.sql.NUMBER
java.sql.Types.DOUBLE
double
NUMBER
oracle.sql.NUMBER
java.sql.Types.BINARY
byte[]
NUMBER
oracle.sql.NUMBER
java.sql.Types.DATE
java.sql.Date
DATE
oracle.sql.DATE
java.sql.Types.TIME
java.sql.Time
DATE
oracle.sql.DATE
java.sql.Types.TIMESTAMP
javal.sql.Timestamp
DATE
oracle.sql.DATE
⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
[email protected]
ûüýüþüÿüü
ÿýÿ
Corso di Basi di Dati – 12 novembre 2001
2UDFOH -'%& ([WHQVLR
SQL Datatype
28
7\SHV
JDBC Extensions
for SQL Datatypes
Oracle
Extensions
ROWID
oracle.jdbc.driver.OracleTypes.ROWID
oracle.sql.ROWID
user-defined types of the REF CURSOR
category
oracle.jdbc.driver.OracleTypes.CURSOR java.sql.ResultSet
BLOB
oracle.jdbc.driver.OracleTypes.BLOB
oracle.sql.BLOB
CLOB
oracle.jdbc.driver.OracleTypes.CLOB
oracle.sql.CLOB
BFILE
oracle.jdbc.driver.OracleTypes.BFILE
oracle.sql.BFILE
Collections (varrays and nested tables)
oracle.jdbc.driver.OracleTypes.ARRAY
oracle.sql.ARRAY
⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
[email protected]
14
!""#$%&%&'
3/64/ VWRUH (
*
Corso di Basi di Dati – 12 novembre 2001
SURFHGXUHV L )
29
-'%&
SQL92 escape syntax
CallableStatement cs1 = conn.prepareCall
( "{call proc (?,?)}" ) ;
CallableStatement cs2 = conn.prepareCall
( "{? = call func (?,?)}" ) ;
*
Oracle escape syntax
CallableStatement cs3 = conn.prepareCall
( "begin proc (:1, :2); end;" ) ;
CallableStatement cs4 = conn.prepareCall
( "begin :1 := func(:2,:3); end;" ) ;
Sull'oggetto di classe CallableStatement restituito da conn.prepareCall()
vanno invocati i metodi per l'inserimento dei parametri e l'esecuzione della
stored procedure. Per l’esecuzione si usa il metodo execute() quando è
necessario gestire i risultati (restituiti tramite un oggetto della classe ResultSet)
oppure, in alternativa, il metodo executeUpdate(), quando non è prevista la
restituzione di risultati (ad es. in caso di INSERT, UPDATE, DELETE, etc.)
[email protected]
+,-,.,/,0,12345526$/7&-7&/8
:
'RFXPHQWD]LRQ 9
Corso di Basi di Dati – 12 novembre 2001
30
+70/
JDBCTM - Connecting Java and Databases in JDKTM
:
1.1.x Documentation
Oracle8i JDBC Developer's Guide and Reference in
Oracle Documentation Library (Oracle8i Java Products,
Release 8.1.5)
[email protected]
15