• Non ci sono risultati.

PROVA FINALE – Ingegneria del software

N/A
N/A
Protected

Academic year: 2021

Condividi "PROVA FINALE – Ingegneria del software"

Copied!
19
0
0

Testo completo

(1)

Ing. Jody Marca – [email protected]

Laboratorio N° 4

(2)

© 2015 – Jody Marca – Laboratorio numero 4

Cos’è JDBC

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 …)

(3)

© 2015 – Jody Marca – Laboratorio numero 4

Cosa fa JDBC

Le principali funzionalità di JDBC sono:

Stabilisce una connessione con il database Invia comandi SQL

Processa il risultato dei comandi inviati

(4)

© 2015 – Jody Marca – Laboratorio numero 4

Step dell’utilizzo di JDBC

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

(5)

© 2015 – Jody Marca – Laboratorio numero 4

Registrazione del driver

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

(6)

© 2015 – Jody Marca – Laboratorio numero 4

Connessione

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

(7)

© 2015 – Jody Marca – Laboratorio numero 4

Url del JDBC

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);

(8)

© 2015 – Jody Marca – Laboratorio numero 4

Ricapitoliamo …

DriverManager getConnection( url, user,

passwd) : Connection

<<interface>>

Connection

createStatement(): Statement close( )

isClosed( ): boolean getCatalog( ): String

PostgreSQLConnection

crea

DerbyConnection

(9)

© 2015 – Jody Marca – Laboratorio numero 4

L’interfaccica Statment

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

(10)

© 2015 – Jody Marca – Laboratorio numero 4

L’interfaccica Resulset

È 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

(11)

© 2015 – Jody Marca – Laboratorio numero 4

Recupero dei dati dal Resulset

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

(12)

© 2015 – Jody Marca – Laboratorio numero 4

Mapping dei principali DataType SQL <-> Java

JDBC DataType Utilizzo SQL DataType Java DataType

DATALINK Rappresenta SQL DATALINK DATALINK java.net.URL DATE Data strutturata come giorno,

mese ed anno

DATE java.sql.Date 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)

Object

DOUBLE floating-point, doppia

precisione con mantissa a 15 bit

DOUBLE PRECISION

double

(13)

© 2015 – Jody Marca – Laboratorio numero 4

Esempio

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”);

}

(14)

© 2015 – Jody Marca – Laboratorio numero 4

Metadati

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(), …………

(15)

© 2015 – Jody Marca – Laboratorio numero 4

Chiusura delle risorse

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

(16)

© 2015 – Jody Marca – Laboratorio numero 4

Esempio

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();

(17)

© 2015 – Jody Marca – Laboratorio numero 4

PreparedStatement

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)

(18)

© 2015 – Jody Marca – Laboratorio numero 4

PreparedStatement / 2

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 …….

(19)

© 2015 – Jody Marca – Laboratorio numero 4

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/

Riferimenti

Documenti correlati

Numerose sono le innovazioni che Amazon ha sviluppato e implementato nel corso della sua storia, come ad esempio l’introduzione delle recensioni dei clienti, della Wish list, del

La CSR in questo caso viene utilizzata come un modo per controllare il mercato e per poter tenere sotto controllo le varie istituzione che altrimenti andrebbero ad essere molto dure

l’idea che l’essenza della mass customization sia riuscire a combinare il punto di forza della produzione di massa, ovvero la possibilità di raggiungere in breve tempo una

La particolarità di questi file è quella di essere tipizzati da un suffisso che rappresenta il Locale (lingua + paese) del contenuto del file. Il software leggerà il ResourceBundle

public static void main(String[] args) throws Exception { //Inizializzazione del Udp Socket – lato server. DatagramSocket serverSocket =

public class ClientImpl extends UnicastRemoteObject implements Client { public void callBack() throws RemoteException{. System.out.println(&#34;Ricevuta callback dal server&#34;);

Non deve contenere alcuna funzione di logica applicativa tranne quella di generazione degli output..

Il sistema operativo considerato in questa guida è Windows, tuttavia i passi da seguire sotto Linux sono esattamente gli stessi (il corretto funzionamento degli strumenti è