49
- JDBC - 1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

Embed Size (px)

Citation preview

Page 1: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 1

JDBCJava Database Connection

(dal corso dei Servizi Web)

Page 2: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 2

Java Database Connection (JDBC) - I

• API sviluppati per offrire interfaccia standardizzata tra applicazioni Java ed i database relazionali (RDBMS)

• package java.sql

• Requisiti:– consistente con metodologie java (basato su modello

client server)

– basato su classi, interfacce, oggetti e package

– facilmente implementabile su database esistenti e su diversi middleware per sistemi distribuiti

Page 3: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 3

Java Database Connection (JDBC) - II

• Funzionalità: – offre connessione a dati relazionali da codice Java

– supporta l’esecuzione di query SQL (Structured Query Language) e l’analisi dei risultati delle query

– offre metodi per accedere a RDBMS SQL-compliant, astraendo da

• dettagli implementativi del database (MS Access? Oracle? …?) e dei suoi API specifici

• dettagli di comunicazione con i database specifici

– permette ad applicazione di connettersi a più database diversi (anche eterogenei) attraverso database drivers differenziati

Page 4: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 4

JDBC e ODBC

• JDBC basato su – linguaggio di interrogazione SQL

– interfaccia di comunicazione X/Open CLI

• ODBC (Open Database Connectivity)– creato inizialmente per offrire API standard per accesso

SQL a piattaforme Microsoft Windows

– poi esteso ad altre piattaforme

– definisce funzioni per accesso diretto ai dati (quindi non poi così standard)

Page 5: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 5

CLI: X/Open Call Level Interface

• API standard per accesso a database relazionali• interfaccia di comunicazione con database definita

originariamente per ODBC• indipendente da piattaforma e da database• basata su idea di

– includere statement SQL in applicazione programmata con linguaggio ad alto livello

– pre-processare gli statement per generare chiamate di funzioni native del database

• implementata in C (e Cobol)

Page 6: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 6

Java, SQL e CLI

JDBC sviluppato partendo da specifiche di driver ODBC esistenti e di CLI, per identificare caratteristiche comuni e offrire interfaccia di comunicazione – compatibile con tutti i driver

– facilmente implementabile in Java

Risultato: interfacce per accesso a database che possono essere– implementate su driver ODBC esistenti (prime

versioni)

– direttamente integrate nel database, senza passare attraverso ODBC (oggi molto diffuso)

Page 7: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 7

Architettura di JDBC - I

Application

Driver Manager

Database Specific Driver

Connection

Statement

ResultSet

1) Applicazioneistalla DriverMgr e istanzia 1 o più

JDBC drivers(specifici per DB)

2) Applicazionechiede Connectionobject a DriverMgr

e lo usa per comunicare con DB(via Statement SQL)

3) Tabelle risultato contenutein oggetti ResultSet interrogabili

Database Specific Driver

Connection

Statement

ResultSet

Page 8: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 8

Architettura di JDBC - II

DriverManager: classe che permette di istallare i driver per l’accesso ai database

Driver: interfaccia – I venditori di DBMS implementano interfaccia (metodi

di accesso al loro database)

– Driver JDBC traduce le chiamate JDBC negli API specifici del database

NB: DriverManager e applicazione usano le interfacce, non le implementazioni

Software delle applicazioni indipendente dal particolare database

Page 9: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 9

Tipi di connessioni tra database drivers edatabase servers

• JDBC-ODBC Bridge• Part Java, part native driver• Intermediate Database Access Server• Pure Java Drivers

Page 10: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 10

JDBC-ODBC Bridge

Java Application

DataSourceJDBC

API

JDBC-ODBCBridge

ODBCAPI

ODBCLayer

JDBC driver : •traduce le chiamate JDBC in chiamate ODBC•invia chiamate ODBC al database usando librerie ODBC•delega il database all’esecuzione delle chiamate

poco efficiente per livelli multipli e traduzioni intermedie client che gestisce applicazione deve istallare JDBC-ODBC Bridge API e ODBC driver

Processo 1

Processo 2

Page 11: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 11

Part Java, part native driver

Java Application

DataSource

JDBCAPI

JDBC Driver

Vendorspecific

API

•JDBC driver traduce chiamate JDBC in chiamate specifiche per DB•DB processa richieste e invia risultati attraverso API specifica•API invia risultati a JDBC driver•JDBC driver traduce risultati in JDBC standard e invia ad applicazione + efficiente (- livelli di traduzione, uso completo di API specifiche) MA: client deve istallare driver e API nativi del DB

Page 12: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 12

Intermediate database access serverJava Application

DataSource

JDBCAPI

JDBC Driver

Driver Server intermedio connette più client Java a più DB server•JDBC Driver Server accessibile via listener, fa da gateway verso i server dei DB•applicazione invia richiesta JDBC via JDBC Driver a Driver Server•Driver Server completa la richiesta attraverso native driver JDBC Driver Server nasconde dettagli di connessioni ai database servers protocollo di comunicazione con Driver Server è specifico, ma Driver Server può usare protocolli per comunicare con DB

JDBCDriverServer Native Driver

Page 13: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 13

Pure Java Drivers

Java ApplicationData

SourceJDBCAPI JDBC Driver

•JDBC driver converte chiamate JDBC in chiamate in rete dirette utilizzando protocolli di rete specifici del database (socket) + efficiente dei primi due tipi di driver semplice da utilizzare perchè non richiede di avere librerie o software speciali

I principali produttori di database offrono JDBC driver puri per accedere ai propri DB. Una lista di JDBC driver: http://industry.java.sun.com/products/jdbc/drivers/

Page 14: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 14

JDBC - classi e interfacce

• java.sql.DriverManager: classe. Offre funzionalità di gestione dei database driver

• java.sql.Driver: interfaccia. Astrae i dettagli del protocollo di connessione al database. I produttori di database implementano l’interfaccia

• java.sql.Connection: interfaccia. Astrae i dettagli dell’interazione con il database. Permette di inviare statement SQL e di leggere i risultati dell’esecuzione degli statement. I produttori di database implementano l’interfaccia

Page 15: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 15

InstantDB

Useremo InstantDB come JDBC driver (Java puro)• connessione a database esistente e interrogazione• creazione di database• queste operazioni possono essere eseguite

scrivendo un codice indipendente dalle caratteristiche di InstantDB (o quasi …)

• tuttavia, per utilizzare il Driver di instantDB, è necessario che il proprio CLASSPATH includa le classi (file jar) del pacchetto (vd. dopo)

Page 16: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 16

Connessione a database via JDBC driver - I

import java.sql.*;

public class QueryDB {

static Connection con ;

public static void main (String args[]) {

try {

Class.forName("org.enhydra.instantdb.jdbc.idbDriver");

// LOCATION OF YOUR properties FILE:

String url = "jdbc:idb:movies.prp";

con = DriverManager.getConnection(url);

queryDB(); metodo che esegue gli statement SQL con.close();

} catch (SQLException e) {System.err.println(e);}

}

Page 17: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 17

Connessione a database via JDBC driver - II

public static void main (String args[]) {

try {

Class.forName("org.enhydra.instantdb.jdbc.idbDriver");

...

String url = "jdbc:idb:movies.prp";

con = DriverManager.getConnection(url);

con.close();

} catch (SQLException e) {System.err.println(e);}

}

Carico driver specificodi DB in DriverManager

URL di database:path relativo

Chiedo a DriverManagerconnessione a database

Chiudo connessione

Page 18: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 18

java.sql.DriverManager - I

Classe java.sql.DriverManager

• fornisce livello intermedio per accedere a database driver da applicazione

• permette ad una stessa applicazione di utilizzare + driver ( + database diversi) in contemporanea

• offre metodi statici per stabilire connessione con DB

• offre anche metodi per vedere quali driver sono in uso dall’applicazione etc., ma trascuriamo questo argomento

Page 19: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 19

java.sql.DriverManager - II

Classe java.sql.DriverManager• richiede che i driver necessari all’applicazione siano registrati

prima di essere usati– Class.forName("org.enhydra.instantdb.jdbc.idbDriver")

: registrazione di driver

– a run time, ClassLoader carica la classe (org. enhydra...) usando CLASSPATH, crea istanza della classe ed esegue codice di inizializzazione della classe

– nel codice di inizializzazione c’è la registrazione (automatica) di un’istanza del driver presso il DriverManager

– fatta la registrazione, applicazione può richiedere a DriverManager una connessione al database Driver

Page 20: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 20

JDBC URL di un Database DriverSimile a URL (Uniform Resource Locator) internet• serve per identificare un driver

• rappresenta il driver e informazioni specifiche per localizzare il database e per connettervisi

– jdbc:<subprotocol>:<subname>

– jdbc indica il protocollo (unico)

– subprotocol: identifica un database driver, un meccanismo di connessione al database

– subname: sintassi specifica per driver• Esempio: jdbc:idb:movies.prp• /usr/home/studenti/labgroup/labsweb/sweb40/movies.prp

– movies.prp: file di properties del database, usato da instantDB (specifica uso di cache, transazioni, ...)

Path assoluto: non dipendeda directory in cui viene

eseguito Java

Page 21: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 21

Connessione a Database - Ijava.sql.DriverManager: metodi per ottenere connessione

a database

– public static Connection getConnection(String url) throws SQLException

– public static Connection getConnection(String url, java.util.Properties info) throws SQLException

– public static Connection getConnection(String url, String user, String password) throws SQLException

Applicazione chiede connessione a DriverManager: Connection con = DriverManager.getConnection(url);

Applicazione riceve oggetto di tipo java.sql.Connection

Page 22: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 22

Connessione a Database - II

• Metodi getConnection() invocano metodo connect() di Driver per stabilire connessione con database server astrazione da specifiche di driver e database server

• I metodi sono synchronized oggetto java.sql.Connection non può essere preso da più di 1 thread dell’applicazione

• Si può specificare timeout di attesa per collegamento a database (setLoginTimeout)

• Le properties specificate per la connessione (o nell’URL, come per instantDB) dipendono dal driver

Page 23: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 23

java.sql.Connection - I• Connection con =

DriverManager.getConnection(url);

• Oggetto java.sql.Connection astrae da particolarità di connessione– A seconda del tipo di driver e database server, connessione può

richiedere collegamento in rete a database server o altro

– DB embedded non richiedono connessione fisica

• Connection object passato ad applicazione permette di creae statement SQL ed eseguirli per interrogare DB in modo indipendente dal tipo di collegamento

Page 24: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 24

java.sql.Connection - II

Metodi per creazione di statement SQL

• Statement createStatement() throws SQLException– creazione statement SQL senza parametri

• PreparedStatement prepareStatement(String sql) throws SQLException– creazione statement SQL con parametri

• CallableStatement prepareCall(String sql) throws SQLException– invocazione di procedure

Page 25: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 25

java.sql.Connection - III

• A termine operazioni, chiudere connessione (DB accettano # max di connessioni prefissato)– con.close();

• Chiusura di connessione può essere inserita in blocco finally per liberare risorse indipendentemente da successo di interrogazione

try {

con = DriverManager.getConnection("jdbc:idb:movies.prp");

… // query the DB

} catch (SQLException e) {System.err.println(e);}

finally {

try {con.close();}

} catch (SQLException e) {System.err.println(e);}

Page 26: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 26

Interfaccia java.sql.Statement• Interfaccia per esecuzione di query SQL

completamente specificate• offre metodi indipendenti da DB per fare query SQL

– ResultSet executeQuery(String sql) throws SQLException

• interrogazione SQL con risultato

– int executeUpdate(String sql) throws SQLException

• esecuzione di statements SQL senza risultato (creazione tabelle, aggiornamento tabelle, ...)

• restituisce numero di tuple coinvolte nell’operazione

– boolean execute(String sql) throws SQLException

• invocazione procedure che restituiscono risultati multipli, o stringhe SQL sconosciute

Page 27: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 27

Interfaccia java.sql.ResultSet• Interfaccia per ispezione dei risultati di query SQL

– offre metodi di ispezione dei metadati del risultato

• String getCatalogName()

• String getTableName()

• int getColumnCount()

• String getColumnName()

• int getColumnType(), …………

– risultato (tabella) rappresentato come enumerazione di tuple con cursore di scorrimento delle tuple

• interfaccia implementata da produttori di DB

Page 28: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 28

JDBC Types - IJDBC offre insieme di tipi di dati mappabili su tipi di

dati SQL e Java. Vd. Java.sql.Types class. Tra questi:JDBC Type Purpose SQL Type Java Type

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 pernumeri, false per boolean

JAVA_OBJECT Memorizzare oggetti Java --- Object

DOUBLE floating-point, doppiaprecisione con mantissa a 15 bit

DOUBLEPRECISION

double

Page 29: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 29

JDBC Types - II• 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)

– ……

NB: le colonne sono numerate a partire da 1

Page 30: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 30

Esempio di database

Database CATALOG:

TITLE LEAD_ACTOR LEAD_ACTRESS TYPE RELEASE_DATE

AustinPowers

Mike Myers Liz Hurley Comedy 1999-04-01

Rain Man Tom Cruise Valeria Golino Essay 1995-02-01

Top Gun Tom Cruise Kelly Mc Gills Action 1990-02-01

Page 31: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 31

Interrogazione e analisi Metadati - I

public static void queryDB() throws SQLException {

Statement statement = con.createStatement();

String sql = "SELECT * FROM CATALOG";

ResultSet rs = statement.executeQuery(sql);

ResultSetMetaData metaData = rs.getMetaData();

int num = metaData.getColumnCount();

System.out.println("Numero di colonne: " + num);

for (int i=1; i<=num; i++) {

System.out.println(metaData.getColumnName(i) +

" " + metaData.getColumnType(i));

}

}

Page 32: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 32

Interrogazione e analisi Metadati - II

public static void queryDB() throws SQLException {

Statement statement = con.createStatement();

String sql = "SELECT * FROM CATALOG";

ResultSet rs = statement.executeQuery(sql);

...

}}

Creo statement SQL

Eseguo statement

Catturo risultato: il risultato della query è la sequenzadi tutte le tuple della tabella CATALOG (la clausola

“where” è vuota…)

Definisco statement SQL

Page 33: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 33

Interrogazione e analisi Metadati - IIIpublic static void queryDB() throws SQLException {

Statement statement = con.createStatement();

String sql = "SELECT * FROM CATALOG";

ResultSet rs = statement.executeQuery(sql);

ResultSetMetaData metaData = rs.getMetaData();

int num = metaData.getColumnCount();

System.out.println("Numero di colonne: " + num);

for (int i=1; i<=num; i++) {

System.out.println(metaData.getColumnName(i) +

" " + metaData.getColumnType(i));

}}

Estraggo metadati di risultato

Interrogo oggetto metadati

Interrogo oggetto metadati

Colonne numerate apartire da 1

Page 34: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 34

Interrogazione e analisi risultato - I

public static void queryDB() throws SQLException {

Statement statement = con.createStatement();

ResultSet rs =

statement.executeQuery(“SELECT * FROM CATALOG”);

while (rs.next()) {

System.out.println(rs.getString("TITLE") + ", "+

rs.getDate("RELEASE_DATE"));

}

}

Scorro le tuple del risultato con il cursore

Prelevo valore colonne da tupla corrente

NB: potrei anche scorrere lecolonne della tupla per numero, da 1

a metadata.getColumnCount()...

Page 35: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 35

Query SQL

Rispettano la sintassi di SQL (base). Alcuni esempi:

• Data una tabella T con campi C1, … Cn• SELECT C1, C3, C4 FROM T• SELECT T.C1 FROM T WHERE T.C2 = pippo• SELECT * FROM T WHERE T.C2 = pippo

• Data una tabella T con campi C1, … Cn ed una tabella R con campi R1, …, Rm

• SELECT C1 FROM T AS TAB1 JOIN R AS TAB2 ON TAB1.C1 =

TAB2.R1 WHERE TAB1.C2 = pippo • SELECT * FROM T AS TAB1 JOIN R AS TAB2 ON TAB1.C1 =

TAB2.R1

Page 36: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 36

Interfaccia java.sql.PreparedStatement - I

Simile a java.sql.Statement, ma serve per preparare query non completamente specificate:

– gli statement possono contenere variabili, indicate con “?”

– SELECT TITLE FROM CATALOG WHERE TYPE = ?

– le variabili permettono di passare parametri dinamicamente agli statement

– utili quando a tempo di compilazione non si hanno info necessarie per specificare completamente la query

– Es: clausola WHERE di una query SQL

– Es: valori di una query SQL di tipo INSERT (vd dopo)

Page 37: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 37

Interfaccia java.sql.PreparedStatement - II

• Interfaccia java.sql.Connection offre metodo– PreparedStatement prepareStatement(String sql) throws

SQLException

• PreparedStatement offre metodi – ResultSet executeQuery(String sql) throws SQLException

– int executeUpdate(String sql) throws SQLException

– boolean execute(String sql) throws SQLException

– 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 per ogni tipo di dato JDBC …….

Page 38: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 38

Esempio di uso di PreparedStatement - I

public static void queryDB(String actorName) throws SQLException {

String sql = "SELECT * FROM CATALOG “+

“WHERE CATALOG.LEAD_ACTOR = ?";

PreparedStatement statement = con.prepareStatement(sql);

statement.setString(1, actorName);

ResultSet rs = statement.executeQuery(sql);

……………..

}

Assegno il valore diactorName al primo

parametro della query

Page 39: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 39

Esempio di uso di PreparedStatement - II String sql = “INSERT INTO CATALOG(TITLE, LEAD_ACTOR, “+

“LEAD_ACTRESS, TYPE, RELEASE_DATE)” +

“VALUES(?, ?, ?, ?, ?)”);

PreparedStatement statement = con.prepareStatement(sql);

String title = “AI”;

statement.setString(1, title);

statement.setString(2, actorName);

statement.setString(3, actressName);

statement.setString(4, type);

statement.setString(5, rDate);

statement.executeUpdate();

}

Page 40: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 40

Creazione di database con JDBC

• Si distingue la creazione del database, privo di tabelle, dalla creazione delle tabelle stesse– un database instantDB può ospitare molte tabelle diverse

– questo approccio è tipico: anche Oracle è organizzato così (administrator crea il DB, altri utenti caricano tabelle in DB)

• Database instantDB hs 4 directory principali: (contengono dati relativi a tabelle e file di log di sistema)

• tables

• indexes

• tmp

• system

Page 41: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 41

Creazione Tabelle - I

• Dato un DB già creato, si utilizzano statement SQL per

– creare tabelle nel DB

– popolare tabelle

• La connessione al DB è del tutto analoga al caso di interrogazione di DB (via DriverManager e Connection)

• Tuttavia, i database server possono avere particolarità individuali. Es:– Cloudscape richiede che in fase di connessione si specifichi la property

“create=true”: con = DriverManager.getConnection(url+”Movies;create=true”);

– InstantDB offre modalità di creazione e popolamento DB da file (non lo vediamo) e richiede esecuzione di statement “DROP TABLE”

verificare specificità del DB server da utilizzare

Page 42: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 42

Creazione Tabelle - IIimport java.sql.*;

import java.io.*;

public class CreaTabelle {

Connection con = null;

Statement statement = null;

public void init() throws SQLException,ClassNotFoundException {

Class.forName("org.enhydra.instantdb.jdbc.idbDriver");

con = DriverManager.getConnection("jdbc:idb:movies.prp");

}

public void close() throws SQLException {

try {con.close();}

catch (SQLException e) { throw e;}

}

Page 43: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 43

Creazione Tabelle - IIIpublic void createTables() throws SQLException {

statement = con.createStatement();

statement.execute("DROP TABLE CATALOG");

statement.executeUpdate("CREATE TABLE CATALOG" +

"(TITLE VARCHAR(256) PRIMARY KEY NOT NULL, " +

"LEAD_ACTOR VARCHAR(256) NOT NULL," +

<...altri campi della tabella...>

"RELEASE_DATE DATE NOT NULL)");

}

Specifico diInstantDB

Statement di creazionetabella CATALOGNB: executeUpdate!!

Definizione campi della tabella

NB: dopo creazionetabella esistono i

suoi metadati

Page 44: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 44

Popolamento Tabellepublic void insertMovies() throws SQLException,IOException {

BufferedReader br=new BufferedReader(new FileReader("m.txt"));

String rDate = ""; <...altre dichiarazioni...>

try {

do {title = br.readLine(); <...>

rDate = br.readLine();

String sql = "INSERT INTO CATALOG (TITLE, " +

"LEAD_ACTOR, LEAD_ACTRESS, TYPE, RELEASE_DATE) "+

"VALUES('"+title+"','"+leadAct+<...>"','"+rDate+ "')";

statement.executeUpdate(sql);}

while (br.readLine() != null);

statement.close();

} catch (IOException e) {e.printStackTrace();}

finally {br.close();}

}

Inserimento tuplein tabella

Austin PowersMike MyersLiz HurleyComedy

1999-04-01Rain Man

Tom Cruise ...

Chiusura statement

Page 45: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 45

Il main ... public static void main (String args[]) {

CreaTabelle movies = new CreaTabelle();

try {

movies.init();

movies.createTables();

movies.insertMovies();

movies.close();

} catch (SQLException sqlException) {

while (sqlException != null) {

sqlException.printStackTrace();

sqlException = sqlException.getNextException();

}

} catch (Exception e) {

e.printStackTrace();

}

}

Catturo eventualieccezioni multiple

Eventualmente inclausola “finally”

Page 46: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 46

Istruzioni per uso di instantDB - I• Per utilizzare instantDB bisogna avere nel proprio

CLASSPATH il path dei 3 file jar che costituiscono il pacchetto (idb.jar, jta-spec_1.0.1.jar, idbexmpl.jar)

• I 3 file sono salvati nella home docenti/liliana• salvare file di ambiente DBEnv.sh nella directory

dell’esercizio (o sotto etc, se si preferisce…)• eseguire “source DBEnv.sh” per aggiornare il proprio

CLASSPATH• a questo punto si possono compilare ed eseguire le classi

java che usano instantDB• NB: l’aggiornamento dell’ambiente va fatta ad ogni

sessione di lavoro in cui si vuole usare un DB creato con instantDB

Page 47: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 47

Istruzioni per uso di instantDB - II• Creazione nuovo database instantDB

– avviene in automatico alla prima esecuzione della classe di creazione delle tabelle (CreaTabelle.class)

• Creazione tabelle– java [packageName.]CreaTabelle

• esegue classe: crea tabella CATALOG e la popola

• NB: creazione e popolamento possono essere fatti in tempi diversi se si scrive il codice in classi separate. Basta collegarsi ogni volta al database

• Per rigenerare database: cancellare tables, indexes, system e tmp e rieseguire CreaTabelle.class

Page 48: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 48

Esercizio di laboratorio - I

• (Caricare il file di ambiente DBEnv.sh)

• Creare nella propria area di gruppo (direttamente sotto swebi) una directory movieDB

• Salvare in movieDB il file movies.prp di property del DB

• Definire la classe CreaTabelle.java che crea (il DB) le tabelle dei film e degli attori: CATALOG, ACTOR

TITLE LEAD_ACTOR LEAD_ACTRESS TYPE RELEASE_DATECATALOG

NAME TOWN YEAR

ACTOR

Campi: Titolo film (ID), attore protagonista,

attrice protagonista, tipo di film,data di pubblicazione

Campi: Nome e cognome (ID),

città di nascita, anno di nascita

Page 49: - JDBC -1 JDBC Java Database Connection (dal corso dei Servizi Web)

- JDBC - 49

Esercizio di laboratorio - II• Definire i file movie.txt e actor.txt che specificano le tuple delle due

tabelle• Aggiungere alla classe CreaTabelle i metodi per popolare le due tabelle (ed

il main)– (NB: la classe deve avere package movieDB)

• Definire la classe QueryDB.java che– interroga i metadati delle tabelle CATALOG e ACTOR per scoprire

quante colonne hanno e che nome e tipo ha ciascuna colonna– imposta una query sulla tabella CATALOG per scoprire

• la descrizione completa di tutti i film inclusi nella tabella• il titolo ed il tipo dei film con attore principale Tom Cruise• …

– imposta una query con JOIN sulle due tabelle CATALOG e ACTOR– … query con AND nella clausola WHERE, …– ….