JDBC
Java Database Connection
(dal corso dei Servizi Web)
- JDBC -
1
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
- JDBC -
2
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
- JDBC -
3
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)
- JDBC -
4
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)
- JDBC -
5
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)
- JDBC -
6
Architettura di JDBC - I
2) Applicazione
chiede Connection
object a DriverMgr
e lo usa per
comunicare con DB
(via Statement SQL)
Application
Driver Manager
1) Applicazione
istalla DriverMgr
e istanzia 1 o più
JDBC drivers
(specifici per DB)
Database Specific Driver
Database Specific Driver
Connection
Connection
Statement
Statement
ResultSet
ResultSet
3) Tabelle risultato contenute
in oggetti ResultSet interrogabili
- JDBC -
7
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
- JDBC -
8
Tipi di connessioni tra database drivers e
database servers
•
•
•
•
JDBC-ODBC Bridge
Part Java, part native driver
Intermediate Database Access Server
Pure Java Drivers
- JDBC -
9
JDBC-ODBC Bridge
Java Application
JDBC
API
JDBC-ODBC
Bridge
Processo 1
Processo 2
ODBC
API
Data
Source
ODBC
Layer
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
- JDBC -
10
Part Java, part native driver
Java Application
JDBC
API
JDBC Driver
Vendor
specific
API
Data
Source
•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
- JDBC -
11
Intermediate database access server
Java Application
JDBC
API
JDBC Driver
Data
Source
JDBC
Driver
Server
Native 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 
- JDBC -
12
Pure Java Drivers
Java Application
JDBC
API
Data
Source
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/
- JDBC -
13
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
- JDBC -
14
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)
- JDBC -
15
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);}
}
- JDBC -
16
Connessione a database via JDBC driver - II
…
Carico driver specifico
args[])
di DB in
{ DriverManager
public static void main (String
try {
Class.forName("org.enhydra.instantdb.jdbc.idbDriver");
...
URL di database:
String url = "jdbc:idb:movies.prp";
path relativo
con = DriverManager.getConnection(url);
…
Chiedo a DriverManager
connessione a database
con.close();
} catch (SQLException e) {System.err.println(e);}
}
Chiudo connessione
- JDBC -
17
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
- JDBC -
18
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
- JDBC -
19
JDBC URL di un Database Driver
Simile 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
assoluto: non dipende
– subname: sintassi specifica per driver Path
da directory in cui viene
• Esempio: jdbc:idb:movies.prp
eseguito Java
• /usr/home/studenti/labgroup/labsweb/sweb40/movies.prp
– movies.prp: file di properties del database, usato da
instantDB (specifica uso di cache, transazioni, ...)
- JDBC -
20
Connessione a Database - I
java.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
- JDBC -
21
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
- JDBC -
22
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
- JDBC -
23
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
- JDBC -
24
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);}
- JDBC -
25
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
- JDBC -
26
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
- JDBC -
27
JDBC Types - I
JDBC 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
DATE
java.sql.Date
VARCHAR
Data strutturata come giorno,
mese ed anno
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
---
Object
JAVA_OBJECT Memorizzare oggetti Java
DOUBLE
floating-point, doppia
DOUBLE
precisione con mantissa a 15 bit PRECISION
- JDBC -
double
28
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
- JDBC -
29
Esempio di database
Database CATALOG:
TITLE
LEAD_ACTOR LEAD_ACTRESS TYPE
RELEASE_DATE
Austin
Powers
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
- JDBC -
30
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));
}
}
- JDBC -
31
Interrogazione e analisi Metadati - II
public static void queryDB() throws SQLException {
Creo statement SQL
Statement statement = con.createStatement();
Definisco statement SQL
String sql = "SELECT * FROM CATALOG";
Eseguo statement
ResultSet rs = statement.executeQuery(sql);
Catturo risultato: il risultato della query è la sequenza
di tutte le tuple della tabella CATALOG (la clausola
“where” è vuota…)
...
}}
- JDBC -
32
Interrogazione e analisi Metadati - III
public static void queryDB() throws SQLException {
Statement statement = con.createStatement();
String sql = "SELECT * FROM CATALOG";
ResultSet rs = statement.executeQuery(sql);
Estraggo metadati di risultato
ResultSetMetaData metaData = rs.getMetaData();
Interrogo oggetto metadati
int num = metaData.getColumnCount();
System.out.println("Numero di colonne: " + num);
Interrogo oggetto metadati
for (int i=1; i<=num; i++) {
System.out.println(metaData.getColumnName(i) +
" " + metaData.getColumnType(i));
Colonne numerate a
partire da 1
}}
- JDBC -
33
Interrogazione e analisi risultato - I
public static void queryDB() throws SQLException {
Statement statement = con.createStatement();
ResultSet rs =
statement.executeQuery(“SELECT * FROM CATALOG”);
Scorro le tuple del risultato con il cursore
while (rs.next()) {
System.out.println(rs.getString("TITLE") + ", "+
rs.getDate("RELEASE_DATE"));
}
Prelevo valore colonne
da tupla corrente
}
NB: potrei anche scorrere le
colonne della tupla per numero, da 1
a metadata.getColumnCount()...
- JDBC -
34
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
- JDBC -
35
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)
- JDBC -
36
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 …….
- JDBC -
37
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);
Assegno il valore di
actorName al primo
parametro della query
ResultSet rs = statement.executeQuery(sql);
……………..
}
- JDBC -
38
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,
statement.setString(2,
statement.setString(3,
statement.setString(4,
statement.setString(5,
title);
actorName);
actressName);
type);
rDate);
statement.executeUpdate();
…
}
- JDBC -
39
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
- JDBC -
40
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
- JDBC -
41
Creazione Tabelle - II
import 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;}
}
- JDBC -
42
Creazione Tabelle - III
public void createTables() throws SQLException {
statement = con.createStatement();
Specifico
statement.execute("DROP TABLE CATALOG");
di
InstantDB
Statement di creazione
tabella CATALOG
NB: executeUpdate!!
statement.executeUpdate("CREATE TABLE CATALOG" +
Definizione campi della tabella
"(TITLE VARCHAR(256) PRIMARY KEY NOT NULL, " +
"LEAD_ACTOR VARCHAR(256) NOT NULL," +
<...altri campi della tabella...>
NB: dopo creazione
"RELEASE_DATE DATE NOT NULL)");
tabella esistono i
suoi metadati
}
- JDBC -
43
Popolamento Tabelle
public void insertMovies() throws SQLException,IOException {
BufferedReader br=new BufferedReader(new FileReader("m.txt"));
String rDate = ""; <...altre dichiarazioni...>
Austin Powers
Mike Myers
Liz Hurley
Comedy
1999-04-01
Rain Man
Tom Cruise ...
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);}
Inserimento tuple
while (br.readLine() != null);
in tabella
statement.close();
} catch (IOException e) {e.printStackTrace();}
finally {br.close();}
Chiusura statement
}
- JDBC -
44
Il main ...
public static void main (String args[]) {
CreaTabelle movies = new CreaTabelle();
try {
Eventualmente in
movies.init();
clausola “finally”
movies.createTables();
movies.insertMovies();
Catturo eventuali
movies.close();
eccezioni multiple
} catch (SQLException sqlException) {
while (sqlException != null) {
sqlException.printStackTrace();
sqlException = sqlException.getNextException();
}
} catch (Exception e) {
e.printStackTrace();
}
}
- JDBC -
45
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
- JDBC -
46
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
- JDBC -
47
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
CATALOG
TITLE
LEAD_ACTOR
LEAD_ACTRESS
TOWN
RELEASE_DATE
Campi:
Titolo film (ID), attore protagonista,
attrice protagonista, tipo di film,
data di pubblicazione
ACTOR
NAME
TYPE
YEAR
Campi:
Nome e cognome (ID),
città di nascita, anno di nascita
- JDBC -
48
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, …
– ….
- JDBC -
49
Scarica

2-jdbc