JDBC: SQL NEI LINGUAGGI DI PROGRAMMAZIONE

Похожие документы
SQL. Laboratorio di Progettazione di Basi di Dati (CdS in Informatica e TPS)

SQL e linguaggi di programmazione Applicazioni ed SQL: architettura

Introduzione JDBC interfaccia java.sql driver caricare i driver

SQL e applicazioni. Capitolo 8. SQL e linguaggi di programmazione. Applicazioni ed SQL: architettura. Una difficoltà importante.

JDBC. A. Bechini Accesso a DataD con Java

JDBC versione base. Le classi/interfacce principali di JDBC

Come trattare il risultato di un comando SQL (relazioni) che

Non si deve fare ALCUN riferimento alla parte specifica di JDBC.

CORSO DI ALGORITMI E PROGRAMMAZIONE. JDBC Java DataBase Connectivity

Esercitazione su JDBC

SQL. Laboratorio di Progettazione di Basi di Dati (CdS in Informatica e TPS)

JDBC di base. Le classi/interfacce principali di JDBC

JDBC per l accesso Java a DB. Tito Flagella tito@link.it

Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, Capitolo 6:

JDBC: Introduzione. Java Database Connectivity (JDBC): parte 1. Schema dei legami tra le classi principali. Principali classi/interfacce di JDBC

Introduzione. 8- Programmazione di una base di dati attraverso JDBC ESEMPIO

PROVA FINALE Ingegneria del software

Java: la libreria delle classi

Lezione 9. Applicazioni tradizionali

Scheda 15 Accedere ai DataBase con JDBC

Caricamento della classe driver. Apertura della connessione. DriverManager.getConnection() Creazione di uno statement

SQL nei linguaggi di programmazione

Corso di Informatica Modulo T3 B2 - Database in rete

Sviluppo Applicazioni Mobile Lezione 12 JDBC. Dr. Paolo Casoto, Ph.D

Laboratorio di reti II: Gestione di database lato server

Esercitazione 4 JDBC

Al giorno d oggi, i sistemi per la gestione di database

Capitoli 8 e 9. SQL embedded. Applicazioni tradizionali Applicazioni Internet. Sistemi di basi di dati Raghu Ramakrishnan, Johannes Gehrke

Basi di Dati: Corso di laboratorio

19. LA PROGRAMMAZIONE LATO SERVER

APPENDICE. Procedure in SQL (1)

Programmazione Java Avanzata Spring - JDBC

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

GERARCHIE RICORSIVE - SQL SERVER 2008

JDBC. Dispense per il corso di Ingegneria del Web

JDBC Driver Manager. JDBC Architettura generale. JDBC - Tipi di dato. JDBC - Flusso applicativo. JDBC - Tipi di dato. ODBC Driver. Livello di gestione

Tecnologia e Applicazioni Internet 2011/12

Architettura MVC-2: i JavaBeans

Stored Procedures. Massimo Mecella Dipartimento di Ingegneria informatica automatica e gestionale Antonio Ruberti Sapienza Università di Roma

JDBC: SQL nei linguaggi di programmazione

Funzioni scalari in SQL. Capitolo 5. coalesce. nullif. Altre funzioni scalari. case

Data Base. Master "Bio Info" Reti e Basi di Dati Lezione 6

Dominio applicativo. Progettazione. v SQL incluso in codice applicativo v Embedded SQL v Cursori v Dynamic SQL v JDBC v Stored procedures

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Esercitazione query in SQL L esercitazione viene effettuata sul database viaggi e vacanze che prevede il seguente modello E/R:

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

Laboratorio Progettazione Web PHP e MySQL - Lezione 9. Andrea Marchetti IIT-CNR andrea.marchetti@iit.cnr.ita 2012/2013

PMF Integration Tools

DBMS ED APPLICAZIONI (CAPITOLO 6) SQL incluso in codice applicativo Embedded SQL Cursori Dynamic SQL JDBC Stored procedures

Riccardo Dutto, Paolo Garza Politecnico di Torino. Riccardo Dutto, Paolo Garza Politecnico di Torino

Basi di dati e Web (Moduli: Laboratorio e Siti Web centrati sui Dati) Prova scritta del 14 luglio 2008

Database e reti. Piero Gallo Pasquale Sirsi

Triggers. Basi dati attive. Trigger. Indipendenza della conoscenza

Il linguaggio SQL. è di fatto lo standard tra i linguaggi per la gestione di data base relazionali.

Corso sul linguaggio SQL

DBMS (Data Base Management System)

Accesso Web a Data Base

Dispensa di database Access

Lezione 8. Metadati, Viste e Trigger

JDBC: Java e database.

Definizione di domini

Volumi di riferimento

Università degli Studi di Bologna Facoltà di Ingegneria. Tecnologie Web L-A A.A Esercitazione 08 DAO e Hibernate

Tecnologie di Sviluppo per il Web

Abilità Informatiche A.A. 2010/2011 Lezione 9: Query Maschere Report. Facoltà di Lingue e Letterature Straniere

SQL Server Integration Services. SQL Server 2005: ETL - 1. Integration Services Project

GESTIONE INFORMATICA DEI DATI AZIENDALI

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Tale attività non è descritta in questa dispensa

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Sviluppo di applicazioni per basi di dati

2104 volume III Programmazione

15 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

DDL, VINCOLI D INTEGRITÁ, AGGIORNAMENTI E VISTE. SQL è più di un semplice linguaggio di interrogazione

14 - Packages. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Informatica per le discipline umanistiche 2 lezione 10

Algoritmi di Ricerca. Esempi di programmi Java

13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

MySQL Database Management System

Lavorare con JDBC L'impiego di JDBC è semplice, e solitamente si articola attraverso quattro passi:

Le query. Lezione 6 a cura di Maria Novella Mosciatti

Транскрипт:

JDBC: SQL NEI LINGUAGGI DI PROGRAMMAZIONE Disheng Qiu disheng.qiu@gmail.com

SQL e Applicazioni In applicazioni complesse, l utente non vuole eseguire comandi SQL, ma programmi, con poche scelte SQL non basta, sono necessarie altre funzionalità, per gestire: input (scelte dell utente e parametri) output (con dati che non sono relazioni o se si vuole una presentazione complessa) per gestire il controllo

Esempio: Ritiro Contanti Prelievo di 1000 Commessa usa SW per richiedere il prelievo Commessa riceve Ok e fornisce 1000 codice Conto saldo 0011 10.000 0231 1.500 Il software richiede aggiornamento DB

Esempio: Ritiro Contanti SW? Conto codice_utente saldo 0011 9.000 0231 1.500

Due mondi SW? Conflitto di impedenza ( disaccoppiamento di impedenza ) fra base di dati e linguaggio: linguaggi: operazioni su singole variabili o oggetti SQL: operazioni su relazioni (insiemi di ennuple)

Due mondi SW? Tipi di base: linguaggi: numeri, stringhe, booleani SQL: CHAR, VARCHAR, DATE,... Tipi strutturati disponibili: linguaggio: dipende dal paradigma SQL: relazioni e ennuple Accesso ai dati e correlazione: linguaggio: dipende dal paradigma e dai tipi disponibili; ad esempio scansione di liste o navigazione tra oggetti SQL: join (ottimizzabile)

DBMS con più funzionalità Incremento delle funzionalità di SQL Stored procedure Trigger Linguaggi 4GL

Stored procedure Sequenza di istruzioni SQL con parametri Memorizzate nella base di dati procedure AssegnaCitta(:Dip varchar(20), update Dipartimento set Città = :Citta where Nome = :Dip; :Citta varchar(20))

Estensioni SQL per il controllo Esistono diverse estensioni procedure CambiaCittaADip(:NomeDip varchar(20), :NuovaCitta varchar(20)) if( select * from Dipartimento where Nome = :NomeDip) = NULL insert into ErroriDip values (:NomeDip) else update Dipartimento set Città = :NuovaCitta where Nome = :NomeDip; end if; end;

Linguaggi 4GL Ogni sistema adotta, di fatto, una propria estensione Diventano veri e propri linguaggi di programmazione proprietari ad hoc : PL/SQL, Informix4GL, PostgreSQL PL/pgsql, DB2 SQL/PL 27/07/2009 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 6 10

SW dialogano con il DBMS SW Linguaggi di programmazione (Java, Ruby, Python.. etc): SQL immerso ( Embedded SQL ) SQL dinamico Call Level Interface (CLI): SQL/CLI, ODBC, JDBC

SQL immerso le istruzioni SQL sono immerse nel programma redatto nel linguaggio ospite un precompilatore (legato al DBMS) viene usato per analizzare il programma e tradurlo in un programma nel linguaggio ospite (sostituendo le istruzioni SQL con chiamate alle funzioni di una API del DBMS)

SQL immerso, un esempio #include<stdlib.h> main(){ exec sql begin declare section; char *NomeDip = "Manutenzione"; char *CittaDip = "Pisa"; int NumeroDip = 20; exec sql end declare section; exec sql connect to utente@librobd; if (sqlca.sqlcode!= 0) { printf("connessione al DB non riuscita\n"); } else { exec sql insert into Dipartimento values(:nomedip,:cittadip,:numerodip); exec sql disconnect all; } }

SQL immerso, fasi Sorgente LP + SQL Precompilazione Precompilato LP Compilazione Codice oggetto Librerie (del DBMS) Collegamento Eseguibile

Call Level Interface Indica genericamente interfacce che permettono di inviare richieste a DBMS per mezzo di parametri trasmessi a funzioni standard SQL/CLI ( 95 e poi parte di SQL-3) ODBC: implementazione proprietaria di SQL/CLI JDBC: una CLI per il mondo Java

SQL immerso vs CLI SQL immerso permette precompilazione (e quindi efficienza) uso di SQL completo CLI indipendente dal DBMS permette di accedere a più basi di dati, anche eterogenee

JDBC Una API (Application Programming Interface) di Java (intuitivamente: una libreria) per l'accesso a basi di dati, in modo indipendente dalla specifica tecnologia JDBC è una interfaccia, realizzata da classi chiamate driver: l'interfaccia è standard, mentre i driver contengono le specificità dei singoli DBMS (o di altre fonti informative)

I driver JDBC (A titolo di curiosità; ne basta uno qualunque) Esistono quattro tipi di driver (chiamati, in modo molto anonimo, tipo 1, tipo 2, tipo 3, tipo 4): 1. Bridge JDBC-ODBC: richiama un driver ODBC, che deve essere disponibile sul client; è comodo ma potenzialmente inefficiente 2. Driver nativo sul client: richiama un componente proprietario (non necessariamente Java) sul client 3. Driver puro Java con server intermedio ("middleware server"): comunica via protocollo di rete con il server intermedio, che non deve risiedere sul client 4. Driver puro Java, con connessione al DBMS: interagisce direttamente con il DBMS

27/07/2009 Atzeni-Ceri-Paraboschi-Torlone, Basi di dati, Capitolo 6 19 I driver JDBC

Il funzionamento di JDBC, in breve Caricamento del driver Apertura della connessione alla base di dati Richiesta di esecuzione di istruzioni SQL Elaborazione dei risultati delle istruzioni SQL

Un programma con JDBC import java.sql.*; public class PrimoJDBC { public static void main(string[] arg){ Connection con = null ; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:corsi"; con = DriverManager.getConnection(url); } catch(exception e){ System.out.println("Connessione fallita"); } try { Statement query = con.createstatement(); ResultSet result = query.executequery("select * from Corsi"); while (result.next()){ String nomecorso = result.getstring("nomecorso"); System.out.println(nomeCorso); } }catch (Exception e){ System.out.println("Errore nell'interrogazione"); } } }

Un altro programma con JDBC, 1 import java.lang.*; import java.sql.*; class ProvaSelectJDBC { public static void main(string argv[]) { Connection con = null; try { Class.forName("com.ibm.db2.jcc.DB2Driver"); } catch (ClassNotFoundException exclass) { System.err.println("Fallita connessione al database. Errore 1"); } try { String url = "jdbc:db2:db04"; con = DriverManager.getConnection(url); } catch (SQLException exsql) { System.err.println("Fallita connessione al database. "+ exsql.geterrorcode() + " " + exsql.getsqlstate() + exsql.getmessage()); }

Un altro programma con JDBC, 2 } try{ String padre = ""; String figlio = "" ; String padreprec = ""; Statement query = con.createstatement(); String querystring = "SELECT Padre, Figlio FROM Paternita ORDER BY Padre"; ResultSet result = query.executequery(querystring); while (result.next()){ padre = result.getstring("padre"); figlio = result.getstring("figlio"); if (!(padre.equals(padreprec))){ System.out.println("Padre: " + padre + "\n Figli: " + figlio);} else System.out.println( " " + figlio ) ; padreprec = padre ; } } catch (SQLException exsql) { System.err.println("Errore nell'interrogazione. "+ exsql.geterrorcode() + " " + exsql.getmessage() ); } }

Preliminari L'interfaccia JDBC è contenuta nel package java.sql import java.sql.*; Il driver deve essere caricato (trascuriamo i dettagli) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connessione: oggetto di tipo Connection che costituisce un collegamento attivo fra programma Java e base di dati; viene creato da String url = "jdbc:odbc:corsi"; con = DriverManager.getConnection(url);

Preliminari dei preliminari: origine dati ODBC Per utilizzare un driver JDBC-ODBC, la base di dati (o altro) deve essere definita come "origine dati ODBC" In Windows (con YYY, avendo già definito la base di dati xxx.yyy da collegare): Pannello di controllo Strumenti di amministrazione Opzione "Origini dati ODBC" Bottone "Aggiungi" ("Add") Nella finestra di dialogo "Crea Nuova origine dati" selezionare YYY Driver" e nella successiva selezionare il file xxx.yyy attribuirgli un nome (che sarà usato da ODBC e quindi da JDBC)

Esecuzione dell'interrogazione ed elaborazione del risultato Esecuzione dell'interrogazione Statement query = con.createstatement(); ResultSet result = query.executequery("select * from Corsi"); Elaborazione del risultato while (result.next()){ String nomecorso = } result.getstring("nomecorso"); System.out.println(nomeCorso);

Statement Un'interfaccia i cui oggetti consentono di inviare, tramite una connessione, istruzioni SQL e di ricevere i risultati forniti Un oggetto di tipo Statement viene creato con il metodo createstatement di Connection I metodi dell'interfaccia Statement: executeupdate per specificare aggiornamenti o istruzioni DDL executequery per specificare interrogazioni e ottenere un risultato execute per specificare istruzioni non note a priori executebatch per specificare sequenze di istruzioni Vediamo executequery

ResultSet I risultati delle interrogazioni sono forniti in oggetti di tipo ResultSet (interfaccia definita in java.sql) In sostanza, un result set è una sequenza di ennuple su cui si può "navigare" (in avanti, indietro e anche con accesso diretto) e dalla cui ennupla "corrente" si possono estrarre i valori degli attributi Metodi principali: next() getxxx(posizione) es: getstring(3); getint(2) getxxx(nomeattributo) es: getstring("cognome"); getint("codice")

Specializzazioni di Statement PreparedStatement premette di utilizzare codice SQL già compilato, eventualmente parametrizzato rispetto alle costanti in generale più efficiente di Statement permette di distinguere più facilmente istruzioni e costanti (e apici nelle costanti) i metodi setxxx(, )permettono di definire i parametri CallableStatement premette di utilizzare "stored procedure", come quelle di Oracle PL/SQL o anche le query memorizzate (e parametriche) di Access

ResultSet Query: Select * from conto where saldo > 500 *Statement e il metodo executequery invia la query al DBMS codice_utente saldo 0011 10.000 0231 1.500 0110 1.050 0123 25 1000 300

ResultSet Query: Select * from conto where saldo > 500 *Statement e il metodo executequery invia la query al DBMS ResultSet cattura il risultato tabellare next() itera il cursore getinteger(nomecolonna) restituisce il valore codice_utente saldo 0011 10.000 0231 1.500 0110 1.050 0123 25 1000 300

import java.sql.*; import javax.swing.joptionpane; public class SecondoJDBCprep { public static void main(string[] arg){ try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:corsi"; Connection con = DriverManager.getConnection(url); PreparedStatement pquery = con.preparestatement( "select * from Corsi where NomeCorso =?"); } } pquery.setstring(1,param); ResultSet result = pquery.executequery(); while (result.next()){ String nomecorso = result.getstring("nomecorso"); System.out.println(nomeCorso); } } catch (Exception e){ System.out.println("Errore"); }

import java.sql.*; import javax.swing.joptionpane; public class TerzoJDBCcall { public static void main(string[] arg){ try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:corsi"; Connection con = DriverManager.getConnection(url); CallableStatement pquery = con.preparecall("{call querycorso(?)}"); String param = JOptionPane.showInputDialog( "Nome corso (anche parziale)?"); param = "*" + param + "*"; pquery.setstring(1,param); ResultSet result = pquery.executequery(); while (result.next()){ String nomecorso = result.getstring("nomecorso"); System.out.println(nomeCorso); } }catch (Exception e){ System.out.println("Errore"); } } }

Altre funzionalità Molte, fra cui username e password aggiornamento dei ResultSet richiesta di metadati gestione di transazioni

Transazioni in JDBC Scelta della modalità delle transazioni: un metodo definito nell'interfaccia Connection: setautocommit(boolean autocommit) con.setautocommit(true) (default) "autocommit": ogni operazione è una transazione con.setautocommit(false) gestione delle transazioni da programma con.commit() con.rollback() non c è begin transaction

Esempio Consideriamo la classe Student: package model; import java.util.date; public class Student { private String firstname; private String lastname; private int code; private Date birthdate; } public String getfirstname() { return firstname; } public void setfirstname(string firstname) { this.firstname = firstname; } // seguono tutti gli altri metodi getter e setter

Esempio E il database university: CREATE TABLE students ( code integer NOT NULL, firstname character varying(64) NOT NULL, lastname character varying(64) NOT NULL, birthdate date NOT NULL, CONSTRAINT pk_students PRIMARY KEY (code) )

Ambiente DBMS a scelta (PostgreSQL, MySQL, DB2, Oracle, SQLServer) consigliato: PostgreSQL Driver JDBC per il DBMS scelto con postgresql 8.4 scaricare il driver http://jdbc.postgresql.org/download/postgresql-8.4-701.jdbc4.jar con altri DBMS, scaricare un driver appropriato (se non lo trovate: http://developers.sun.com/product/jdbc/drivers) Ambiente Java standard Nota bene: il.jar del driver deve essere nel CLASSPATH

Le classi fondamentali di JDBC Package java.sql (va importato) Classe DriverManager Interfaccia Driver Interfaccia Connection Interfaccia PreparedStatement Interfaccia ResultSet

Un Esempio Nel seguito, con riferimento ad nostro studio di caso, descriveremo le seguenti operazioni Operazione n.1: Caricare il driver Operazione n.2: Aprire una connessione Operazione n.3: Definire l istruzione SQL Operazione n.4: Gestire il risultato Operazione n.5: Rilascio delle risorse

Operazione n.1: Caricare il Driver Creare un oggetto della classe Driver Driver d = new org.postgresql.driver(); Registrare il driver sul DriverManager DriverManager.registerDriver(d); A questo punto il driver è disponibile

Operazione n.1: Caricare il Driver Le operazioni precedenti sono equivalenti alla istruzione: Class.forName("org.postgresql.Driver"); Vedi classe documentazione classe java.lang.class Soluzione vantaggiosa: Il nome della classe è indicato con una stringa che può essere letta da un file di configurazione Disaccoppiamento dallo specifico DBMS Non è necessario ricompilare il codice se si cambia il DBMS, basta modificare la stringa nel file di configurazione

Operazione n.2: Connessione Ottenere una connessione dal DriverManager per farlo è necessario specificare: host, dbms, db utente e password URI ( indirizzo completo) della connessione specifica server, porta e database Sintassi jdbc:<sottoprotocollo>:<parametri>

Operazione n.2: Connessione URI per PostgreSQL jdbc:postgresql:<basedati> jdbc:postgresql://<host>/<basedati> jdbc:postgresql://<host>:<porta>/<basedati> URI per Access jdbc:odbc:<sorgenteodbc> NB: la sorgente ODBC deve essere registrata sotto Windows: pannello di controllo, Strumenti di amministrazione, origine dati odbc sotto Linux: file odbc.ini (o.odbc.ini) Esempi jdbc:postgresql:university jdbc:postgresql://127.0.0.1/university jdbc:postgresql://193.204.161.14:5432/university jdbc:odbc:university

Operazione n.2: Connessione Creazione della connessione Connection DriverManager.getConnection( String uri,string utente,string password); Esempio Connection connection; connection = DriverManager.getConnection( "jdbc:postgresql:university,"postgres"postgres ); Attenzione: ottenere una connessione è un operazione costosa creare troppe connessioni comporta problemi di prestazioni nel corso di SIW saranno illustrate tecniche per superare questo problema

Nell Esempio Confiniamo in una classe, DataSource, le operazioni necessarie per ottenere la connessione il suo compito è servire connessioni alle altre classi che ne hanno bisogno metodo Connection getconnection() che restituisce una nuova connessione ad ogni richiesta E' una soluzione artigianale usata solo a fini didattici

La classe DataSource import java.sql.*; public class DataSource { private String dburi = "jdbc:postgresql://localhost/university"; private String user = "postgres"; private String password = "postgres"; } } public Connection getconnection() throws Exception { Class.forName("org.postgresql.Driver"); Connection connection = DriverManager.getConnection(dbURI, user, password); return connection;

Operazione n.3: Istruzione SQL Vediamo ora il codice JDBC che esegue istruzioni SQL per: salvare (rendere persistenti) oggetti nel db cancellare oggetti dal db trovare oggetti dal db Vedi classe StudentRepository Concentriamoci in particolare sul codice dei singoli metodi, piuttosto che del progetto di tale classe

Operazione n.3: Istruzione SQL Per eseguire una istruzione SQL è necessario creare un oggetto della classe che implementa PreparedStatement creato dall'oggetto Connection invocando il metodo: PreparedStatement preparestatement(string s); La stringa s è una istruzione SQL parametrica: i parametri sono indicati con il simbolo? Esempio 1 String insert = "insert into students(code, firstname, lastname, birthdate) values (?,?,?,?)"; statement = connection.preparestatement(insert); Esempio 2 String delete = "delete from students where code=?"; statement = connection.preparestatement(delete);

Operazione n.3: Istruzione SQL I parametri sono assegnati mediante opportuni metodi della classe che implementa PreparedStatement metodi setxxx (<numpar>, <valore>) un metodo per ogni tipo, il primo argomento corrisponde all'indice del paramentro nella query, il secondo al valore da assegnare al parametro Esempio 1 (cont.) PreparedStatement statement; String insert = "insert into students(code, firstname, lastname, birthdate) values (?,?,?,?)"; statement = connection.preparestatement(insert); statement.setint(1, student.getcode()); statement.setstring(2, student.getfirstname()); statement.setstring(3, student.getlastname()); long secs = student.getbirthdate().gettime()); statement.setdate(4, new java.sql.date(secs));

Operazione n.3: Istruzione SQL JDBC usa java.sql.date, mentre la classe Student usa java.util.date Le istruzioni long secs = student.getbirthdate().gettime()); statement.setdate(4, new java.sql.date(secs)); servono a "convertire" una data da una rappresentazione all'altra Per i dettagli vedi la documentazione

Operazione n.3: Istruzione SQL Una volta assegnati i valori ai parametri, l'istruzione può eseguita Distinguiamo due tipi di operazioni: aggiornamenti (insert, update, delete) modificano lo stato del database interrogazioni (select) non modificano lo stato del database ritornano una sequenza di tuple

Operazione n.3: Istruzione SQL Aggiornamenti (insert, delete, update) vengono eseguiti invocando il metodo executeupdate() sull'oggetto PrepareStatement Esempio 1 (cont.) PreparedStatement statement; String insert = "insert into students(code, firstname, lastname, birthdate) values (?,?,?,?)"; statement = connection.preparestatement(insert); statement.setstring(1, student.getcode()); statement.setstring(2, student.getfirstname()); statement.setstring(3, student.getlastname()); long secs = student.getbirthdate().gettime()); statement.setdate(4, new java.sql.date(secs)); statement.executeupdate();

Operazione n.3: Istruzione SQL Interrogazioni (select) vengono eseguiti invocando il metodo executequery() che ritorna il risultato in un oggetto ResultSet Esempio 2 (cont.) PreparedStatement statement; String query = "select * from students where code=?"; statement = connection.preparestatement(query); statement.setint(1,code); ResultSet result = statement.executequery();

Operazione n.4: Gestire il risultato di una query Un oggetto della classe ResultSet rappresenta la collezione di ennuple restituita da una query SQL (istruzione SELECT) Per gestire il risultato offre vari metodi: metodo boolean next() per scorrere le ennuple (analogo ad un iteratore) metodi getxxx(string attributo) per acquisire i valori degli attributi Es.: int getint(string attributo); Es.: String getstring(string attributo);

Operazione n.4: Gestire il risultato di una query Il metodo next() Moves the cursor forward one row from its current position. A ResultSet cursor is initially positioned before the first row; the first call to the method next makes the first row the current row; the second call makes the second row the current row, and so on. When a call to the next method returns false, the cursor is positioned after the last row. Any invocation of a ResultSet method which requires a current row will result in a SQLException being thrown. Returns: true if the new current row is valid; false if there are no more rows

Operazione n.4: Gestire il risultato di una query Connection connection = this.datasource.getconnection(); String retrieve = "select * from students where code=?"; PreparedStatement statement = connection.preparestatement(retrieve); statement.setint(1, code); ResultSet result = statement.executequery(); Student student = null; if (result.next()) { student = new Student(); student.setcode(result.getint("code")); student.setfirtsname(result.getstring("firstname")); student.setlastname(result.getstring("lastname")); long secs = result.getdate("birthdate").gettime(); birthdate = new java.util.date(secs); student.setbirthdate(birthdate); }

Operazione n.4: Gestire il risultato di una query List<Student> students = new LinkedList<Student>(); Connection connection = this.datasource.getconnection(); PreparedStatement statement; String query = "select * from students"; statement = connection.preparestatement(query); ResultSet result = statement.executequery(); while(result.next()) { Student student = new Student(); student.setcode(result.getint("code")); student.setfirstname(result.getstring("firstname")); student.setlastname(result.getstring("lastname")); student.setbirthdate(new java.util.date(result.getdate ("birthdate").gettime())); students.add(student); }

Operazione n.5: rilascio delle risorse connessione, statement, ResultSet devono essere sempre "chiusi" dopo essere stati usati l'operazione di chiusura corrisponde al rilascio di risorse L approccio seguito in queste lezioni è semplicistico, un modo più sofisticato e corretto richiede la conoscenza del meccanismo delle eccezioni che verrà introdotto nel corso di Sistemi informativi su Web

Esercizio Studiare il codice della classe StudentRepository Spiegare a che cosa serve l'istruzione if (findbyprimarykey(student.getcode())!=null) { del metodo public void persist() Scrivere il codice del metodo: public void update(student student) che aggiorna nel database la tupla corrispondente all'oggetto passato come parametro. Suggerimento: usare il metodo findbyprimarykey()

Esercizio Creare il database olympic: CREATE TABLE athletes ( code integer NOT NULL, name character varying(64) NOT NULL, nation character varying(64) NOT NULL, birthdate date NOT NULL, height double precision, CONSTRAINT pk_athletes PRIMARY KEY (code) )

Esercizio Creare la classe Athlete: package olympic; import java.util.date; public class Athlete { private int code; private String name; private String nation; private double height; private Date birthdate; public Athlete(){} } // metodi getter e setter

Esercizio Scrivere e testare il codice della classe AthleteRepository Oltre ai metodi: persist(athlete a) delete(athlete a) update(athlete a) findbyprimarykey(int code) findall() scrivere il codice del metodo public List<Athlete> findtallathletes(double h) che ritorna gli atleti con altezza maggiore del parametro h