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|}~}zxz 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|}~}zxz 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