PROVA FINALE Ingegneria del software Ing. Jody Marca jody.marca@polimi.it Laboratorio N 4
Cos è JDBC 2 JDBC significa Java Database Connectivity Standard definito da Sun MicroSystems per connettere programmi Java ai database relazionali E' costituito da un insieme di classi e interfacce scritte in Pure Java Si basa sul concetto di driver di database Il driver è una implementazione JDBC specifica per database Permette ai diversi fornitori di database di estendere lo standard con i loro specifici driver JDBC (Derby, PostgreSQL, Oracle, MySQL, MS SQL Server )
Cosa fa JDBC 3 Le principali funzionalità di JDBC sono: Stabilisce una connessione con il database Invia comandi SQL Processa il risultato dei comandi inviati
Step dell utilizzo di JDBC 4 Come si usa: Import del package java.sql.* Registrazione del driver del database da utilizzare Apertura connessione Creazione oggetto Statement Esecuzioni di Create, Drop, Delete, Insert e Update Esecuzione di Select e recupero dati dal ResultSet Utilizzo ResultSet Chiusura risorse ResultSet e Statement Chiusura connessione
Registrazione del driver 5 Per utilizzare un driver di database un'applicazione lo deve rendere disponibile applicazione (si chiama registrazione del driver) Questa operazione deve essere fatta prima di creare la prima connessione al database Class.forName(DRIVER).newInstance() La stringa DRIVER è database dependent Es. Derby org.apache.derby.jdbc.embeddeddriver Postgres org.postgresql.driver
Connessione 6 Per creare una connessione si utilizza il metodo getconnection(string url, String user, String pass) della classe java.sql.drivermanager Tutti i metodi di JDBC lanciano l'eccezione java.sql.sqlexception Una connessione rappresenta una sessione con uno specifico db; possono quindi gestire più connessioni contemporanee con uno o più db E' possibile: ottenere informazioni sulla struttura del db (metadata) gestire le transazioni
Url del JDBC 7 Per effettuare la connessione è necessario costruire URL da utilizzare nel metodo getconnection: La URL contiene varie informazioni indirizzo (e porta) dove risiede il database nome dell'istanza del database Es: jdbc:postgresql://[host]:[porta]/[dbname] jdbc:derby:[pathaldatabase] //Carico il driver solo Class.forName(DRIVER).newInstance(); //Apro la connessione Connection conn = DriverManager.getConnection(URL, USER, PASS);
Ricapitoliamo 8 DriverManager getconnection( url, user, passwd) : Connection crea <<interface>> Connection createstatement(): Statement close( ) isclosed( ): boolean getcatalog( ): String DerbyConnection PostgreSQLConnection
L interfaccica Statment 9 Per eseguire delle query è necessario creare un instanza Statement: Statement st = connessione.createstatement() Lo Statement offre metodi indipendenti dal DB per eseguire le diverse tipologie di query SQL: ResultSet executequery(string sql) interrogazione SQL con risultato int executeupdate(string sql) interrogazione senza risultato (creazione tabelle, aggiornamento tabelle,...), restituisce il numero di tuple coinvolte nell operazione boolean execute(string sql) invocazione procedure che restituiscono risultati multipli, o stringhe SQL sconosciute
L interfaccica Resulset 10 È ottenuta come parametro di ritorno del metodo executequery in una query di selezione Un ResultSet fornisce l'accesso ai dati di una tabella generati eseguendo uno Statement Ogni Statement gestisce un solo ResultSet alla volta Il risultato (della query) è rappresentato come enumerazione di tuple con cursore di scorrimento delle tuple Si possono ottenere i dati utilizzando i get dei datatype SQL definiti in Java
Recupero dei dati dal Resulset 11 I tipi di dati sono identificati da costanti intere della classe java.sql.types L interfaccia ResultSet offre metodi getxxx() per ottenere i valori di campi di tipi diversi. I metodi effettuano il mapping da tipi JDBC a tipi java: getstring(string columnname), getstring(int colnumber) getdate(string columnname), getdate(int colnumber) getint(string columnname), getint(int colnumber) geturl(string columnname), geturl(int colnumber) getobject(string columnname), getobject(int colnumber) Attenzione le colonne sono numerate a partire da 1
Mapping dei principali DataType SQL <-> Java 12 JDBC DataType Utilizzo SQL DataType Java DataType DATALINK Rappresenta SQL DATALINK DATALINK java.net.url DATE Data strutturata come giorno, DATE java.sql.date mese ed anno VARCHAR Stringa di lunghezza variabile VARCHAR String INTEGER interi a 32-bit con segno INTEGER int NULL Rappresenta NULL values NULL null per oggetti java, 0 per numeri, false per boolean JAVA_OBJECT Memorizzare oggetti Java Tipi definiti dall utente (solo negli ORDBMS) DOUBLE floating-point, doppia precisione con mantissa a 15 bit DOUBLE PRECISION Object double
Esempio 13 String DRIVER = "org.apache.derby.jdbc.embeddeddriver"; String URL = "jdbc:derby:databasedir", USER = "user", PASS = "pass" ; Class.forName(DRIVER).newInstance(); Connection connessione = DriverManager.getConnection(URL, USER, PASS); //Creo lo statement Statement st = connessione.createstatement(); //Eseguo una query di update st.executeupdate("update tabella SET numero = 0 WHERE stringa = 'prova' "); //Eseguo una query di select ResultSet rs = st.executequery("select stringa, numero FROM tabella "); //Scandisco il risultato while(rs.next()){ String stringaletta = rs.getstring(1); Integer interoletta = rs.getint( numero ); }
Metadati 14 Da ogni Resulset è possibile recuperare l interfaccia ResulSetMetadata per ispezionare i metadati ResultSetMetaData metadata = resulset.getmetadata(); I metodi di ispezione dei metadati del risultato sono: String getcatalogname() String gettablename() int getcolumncount() String getcolumnname() int getcolumntype(),
Chiusura delle risorse 15 Le connessioni sono risorse preziose per cui vanno rilasciate appena possibile Lo stesso vale per Statement e ResultSet La chiusura avviene utilizzando il metodo close() Connection.close() Statement.close(); ResultSet.close(); Una connessione aperta e inutilizzata spreca risorse
Esempio 16 Class.forName(DRIVER).newInstance(); Connection connessione = DriverManager.getConnection(URL, USER, PASS); Statement st = connessione.createstatement(); st.executeupdate( UPDATE tabella SET numero = 0 WHERE stringa = prova ); ResultSet rs = st.executequery( SELECT stringa, numero FROM tabella ); while(rs.next()){ String stringaletta = rs.getstring(1); Integer interoletta = rs.getint( numero ); } //Chiudo Resulset, Statement e Connection rs.close(); st.close(); connessione.close();
PreparedStatement 17 Sono statement parametrizzati utili quando a tempo di compilazione non si hanno info necessarie per specificare completamente la query si vuole compilare uno statement una sola volta, e poi eseguirlo più volte sostituendo i valori dei parametri al momento della esecuzione (sostituire parametri in più invocazioni dello stesso statement) Es: SELECT <select_fields> FROM <table_name> WHERE USER_ID =? (il punto di domanda viene sostituito a runtime con il valore)
PreparedStatement / 2 18 Sono istanziati dal metodo preparestatement(string sql) della classe Connection PreparedStatement offre I metodi ResultSet executequery(string sql) int executeupdate(string sql) boolean execute(string sql) setstring(int i, String s) assegna all i-mo parametro unbound la stringa s setdate(int parnumber, java.sql.date date) assegna all i-mo parametro unbound la data date.. Un metodo set per ogni tipo di dato JDBC.
Esercizio Creiamo un programma che si connette ad un db e effettua query di INSERT,SELECT e UPDATE Come database utilizzeremo Apache Derby in modalità Embedded. http://db.apache.org/derby Driver: "org.apache.derby.jdbc.embeddeddriver" URL di connessione: "jdbc:derby:[pathaldatabase]" Interprete SQL consigliato per la manipolazione del database: SQuirreL SQL. http://www.squirrelsql.org/