Accesso a Database Relazionali
• Produttori di RDBMS offrono API per accedere ai dati
gestiti dal DBMS
• Accesso a DB basato su modello client-server  client
accede a DB mediante le API definite dai produttori
• RDBMS diversi hanno API diverse  serve strumento
per generalizzare accesso, in modo da separare
applicazione (business logic) da livello dei dati (può
cambiare il DB)
• Introduciamo il Database Driver come strumento che
implementa interfaccia a DB e permette di comunicare
con DB mediante codice Java
Laboratorio di Servizi Web - JDBC Ardissono
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
Laboratorio di Servizi Web - JDBC Ardissono
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
Laboratorio di Servizi Web - JDBC Ardissono
3
JDBC e ODBC
• JDBC basato su
– linguaggio di interrogazione SQL (sottoinsieme, SQL-92)
– 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)
Laboratorio di Servizi Web - JDBC Ardissono
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)
Laboratorio di Servizi Web - JDBC Ardissono
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)
Laboratorio di Servizi Web - JDBC Ardissono
6
Tipi di connessioni tra database drivers e
database servers
•
•
•
•
JDBC-ODBC Bridge
Part Java, part native driver
Intermediate Database Access Server
Pure Java Drivers
Laboratorio di Servizi Web - JDBC Ardissono
7
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 a database usando librerie ODBC
•delega il database esecuzione di chiamate
 poco efficiente per livelli multipli e traduzioni intermedie
 client che gestisce applicazione deve installare
JDBC-ODBC Bridge API e ODBC driver
Laboratorio di Servizi Web - JDBC Ardissono
8
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 installare driver e API nativi del DB
Laboratorio di Servizi Web - JDBC Ardissono
9
Intermediate database access server
(net-protocol all-Java driver)
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 
Laboratorio di Servizi Web - JDBC Ardissono
10
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 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/
Laboratorio di Servizi Web - JDBC Ardissono
11
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
installa 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
Laboratorio di Servizi Web - JDBC Ardissono
12
Architettura di JDBC - II
DriverManager: classe che permette di installare i
driver per accesso ai database
Driver: interfaccia
– Venditori di DBMS implementano interfaccia (metodi
di accesso al loro database)
– Driver JDBC traduce chiamate JDBC in invocazioni
basate su API specifici del database
NB: DriverManager e applicazione usano le
interfacce, non le implementazioni
 Software delle applicazioni indipendente dal
particolare database
Laboratorio di Servizi Web - JDBC Ardissono
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 interfaccia
• java.sql.Connection: interfaccia. Astrae dettagli
di 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
Laboratorio di Servizi Web - JDBC Ardissono
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. catEnv.sh)
Laboratorio di Servizi Web - JDBC Ardissono
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);}
}
Laboratorio di Servizi Web - JDBC Ardissono
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
Laboratorio di Servizi Web - JDBC Ardissono
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
Laboratorio di Servizi Web - JDBC Ardissono
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
– in codice di inizializzazione c’è registrazione (automatica)
di un’istanza del driver presso il DriverManager
– fatta la registrazione, applicazione può richiedere a
DriverManager una connessione al database Driver
Laboratorio di Servizi Web - JDBC Ardissono
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, ...)
Laboratorio di Servizi Web - JDBC Ardissono
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
Laboratorio di Servizi Web - JDBC Ardissono
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
Laboratorio di Servizi Web - JDBC Ardissono
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
Laboratorio di Servizi Web - JDBC Ardissono
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
Laboratorio di Servizi Web - JDBC Ardissono
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);}
Laboratorio di Servizi Web - JDBC Ardissono
25
Transazioni - I
• Oggetti Connection sono synchronized  finchè thread
che detiene connection non la chiude, altri thread non
riescono ad aprire connessione
• In una Connection, per default, ogni Statement fa
autocommit  per definire transazioni formate da più
statement, l’applicazione deve
– Mettere il flag di autocommit a “false”
– Eseguire gli statement che fanno parte della transazione
– Eseguire il “commit” finale
Laboratorio di Servizi Web - JDBC Ardissono
26
Transazioni - II
Connection con = null;
// Get a connection
…
try {
// Begin a transaction
con.setAutocommit(false);
Statement st = con.createStatement();
st.executeUpdate(“…”);
st.executeUpdate(“…”);
if (…) {
// business logic succeeded
statement.execute(“…”);
con.commit(); }
else con.rollback();
} catch (SQLException e) {System.err.println(e);}
Finally {st.close(); con.close();}
}
Laboratorio di Servizi Web - JDBC Ardissono
27
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
Laboratorio di Servizi Web - JDBC Ardissono
28
Interfaccia java.sql.ResultSet
• Interfaccia per ispezionare 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
Laboratorio di Servizi Web - JDBC Ardissono
29
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
Laboratorio di Servizi Web - JDBC Ardissono
double
30
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
Laboratorio di Servizi Web - JDBC Ardissono
31
Esempio di database
Database CATALOGO:
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
Laboratorio di Servizi Web - JDBC Ardissono
32
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
Laboratorio di Servizi Web - JDBC Ardissono
33
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
Laboratorio di Servizi Web - JDBC Ardissono
34
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;}
}
Laboratorio di Servizi Web - JDBC Ardissono
35
Creazione Tabelle - III
public void createTables() throws SQLException {
statement = con.createStatement();
Specifico
di
InstantDB
statement.execute("DROP TABLE CATALOGO");
NB: executeUpdate!!
Statement di creazione
tabella CATALOG
statement.executeUpdate("CREATE TABLE CATALOGO" +
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
}
Laboratorio di Servizi Web - JDBC Ardissono
36
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 CATALOGO (TITLE, " +
"LEAD_ACTOR, LEAD_ACTRESS, TYPE, RELEASE_DATE) "+
"VALUES('"+title+"','"+leadAct+<...>"','"+rDate+
"')";
Inserimento tuple
statement.executeUpdate(sql);}
in tabella
while (br.readLine() != null);
statement.close();
} catch (IOException e) {e.printStackTrace();}
Chiusura statement
finally {br.close();}
}
Laboratorio di Servizi Web - JDBC Ardissono
37
Interrogazione Database e analisi Metadati - I
public static void queryDB() throws SQLException {
Statement statement = con.createStatement();
String sql = "SELECT * FROM CATALOGO";
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));
}
}
Laboratorio di Servizi Web - JDBC Ardissono
38
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 CATALOGO";
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…)
...
}}
Laboratorio di Servizi Web - JDBC Ardissono
39
Interrogazione e analisi Metadati - III
public static void queryDB() throws SQLException {
Statement statement = con.createStatement();
String sql = "SELECT * FROM CATALOGO";
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);
for (int i=1; i<=num; i++) { Interrogo oggetto metadati
System.out.println(metaData.getColumnName(i) +
" " + metaData.getColumnType(i));
Colonne numerate a
}} da 1
partire
Laboratorio di Servizi Web - JDBC Ardissono
40
Interrogazione e analisi risultato - I
public static void queryDB() throws SQLException {
Statement statement = con.createStatement();
ResultSet rs =
statement.executeQuery(“SELECT * FROM CATALOGO”);
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()...
Laboratorio di Servizi Web - JDBC Ardissono
41
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
Laboratorio di Servizi Web - JDBC Ardissono
42
Interfaccia java.sql.PreparedStatement - I
Simile a java.sql.Statement, ma serve per preparare
query non completamente specificate (statement
parametrizzati)
– gli statement possono contenere variabili, indicate con “?”
– SELECT TITLE FROM CATALOG WHERE TYPE = ?
– le variabili permettono di passare parametri
dinamicamente agli statement
– Es: clausola WHERE di una query SQL
– Es: valori di una query SQL di tipo INSERT (vd dopo)
Laboratorio di Servizi Web - JDBC Ardissono
43
Interfaccia java.sql.PreparedStatement - II
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
Valore di chiave di ricerca
statement)
Impostato a run time
– Es: SELECT <select_fields> FROM
<table_name> WHERE USER_ID = ?
Laboratorio di Servizi Web - JDBC Ardissono
44
Interfaccia java.sql.PreparedStatement - III
• 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 …….
Laboratorio di Servizi Web - JDBC Ardissono
45
Esempio di uso di PreparedStatement - I
public static void queryDB(String actorName) throws
SQLException {
String sql = "SELECT * FROM CATALOGO “+
“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);
……………..
}
Laboratorio di Servizi Web - JDBC Ardissono
46
Esempio di uso di PreparedStatement - II
String sql = “INSERT INTO CATALOGO(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();
…
}
Laboratorio di Servizi Web - JDBC Ardissono
47
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();
}
}
Laboratorio di Servizi Web - JDBC Ardissono
48
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 (vedere
path specificati nel file di ambiente catEnv.sh)
Laboratorio di Servizi Web - JDBC Ardissono
49
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 CATALOGO e la popola
• NB: creazione e popolamento possono essere fatti in tempi
diversi se si scrive codice in classi separate. Basta collegarsi
ogni volta al database
• Per rigenerare database: cancellare tables, indexes,
system e tmp e rieseguire CreaTabelle.class
Laboratorio di Servizi Web - JDBC Ardissono
50
Esercizio di laboratorio - I
• 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: CATALOGO, ACTOR
CATALOGO
TITLE
LEAD_ACTOR
LEAD_ACTRESS
ACTOR
NAME
TOWN
YEAR
TYPE
RELEASE_DATE
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
Laboratorio di Servizi Web - JDBC Ardissono
51
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 CATALOGO e ACTOR per scoprire
quante colonne hanno e che nome e tipo ha ciascuna colonna
– imposta una query sulla tabella CATALOGO 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 CATALOGO e ACTOR
– … query con AND nella clausola WHERE, …
– ….
Laboratorio di Servizi Web - JDBC Ardissono
52
Scarica

JDBC