“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Java
J0
1
Sql package
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
JDBC
J0
2
Un’applicazione per la quale sia fondamentale l’indipendenza
dal Database può essere scritta in Java usando le specifiche JDBC.
(Package java.sql)
Non devono essere usate chiamate specifiche del database:
Si deve usare SOLO la parte di SQL definita da ANSI SQL-2
standard.
Non si deve fare ALCUN riferimento alla parte specifica di JDBC.
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Strati SW per l’accesso a un DB
J0
3
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Type 1 – JDBC-ODBC Bridge
J0
4
Java
application
JDBC
API
Data
source
JDBC-ODBC
Bridge
ODBC
API
The standard JDK includes
sun.jdbc.odbc.JdbcOdbcDriver
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Type 2 – Part Java, Part Native
J0
5
Java
application
JDBC
API
Data
source
JDBC
Driver
Vendor
API
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Type 3 – Intermediate DB Access Server
Data
source
Java
application
JDBC
API
JDBC
Driver
JDBC
Driver
Server
Native
Driver
See http://industry.java.com/products/jdbc/drivers
J0
6
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Type 4 – Pure Java
J0
7
Java
application
JDBC
API
Data
source
JDBC
Driver
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
The JDBC object model: the Manager.
J0
8
L’oggetto centrale: java.sql.DriverManager.
Ha la responsabilita’ di tenere traccia delle varie
implementazioni JDBC che possono esistere per una applicazione.
Se, per esempio, un sistema possedesse una implementazione JDBC Sybase e una
Oracle, il DriverManager sarebbe responsabile di tenere traccia di queste
implementazioni.
Quando una applicazione vuole connettersi ad un database,
chiede al DriverManager di darle una database connection,
usando una database URL attraverso il metodo DriverManager.getConnection().
Basandosi su questa URL, il DriverManager cerca una implementazione di Driver
che accetti la URL. Ottiene quindi una implementazione di Connection
da quel Driver e la restituisce all’applicazione.
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
The JDBC object model: the URL.
J0
9
Per permettere ad un’applicazione di definire con quale DB vuole interagire, JDBC
usa il sistema standard Internet “Uniform Resource Locator”.
Una JDBC URL (Database URL) consiste delle seguenti parti:
jdbc:<subprotocol>:<subname>
Come per tutte le URL, il primo elemento e’ la specifica del protocollo – in questo
caso una sorgente di dati JDBC.
Il sottoprotocollo e’ specifico della implementazione JDBC. In molti casi, e’ il nome e
versione DBMS name; per esempio, syb10 indica Sybase System 10. L’elemento
subname e’ qualunque informazione specifica del DBMS che specifica
dove deve connettersi. Per mSQL, la JDBC URL e’ nella forma:
jdbc:msql://hostname:port/database
A JDBC non importa che aspetto ha la URL. La sola cosa importante e’ che la
implementazione desiderata di JDBC possa riconoscere la URL e avere le
informazioni di cui abbisogna per collegarsi al DB tramite la URL.
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
The JDBC object model: the Driver.
J0
10
Il DriverManager e’ la sola classe istanziata che JDBC 1.1 procura, a parte alcune
sottoclassi specializzate di java.util.Date e alcuni oggetti Exception.
Le altre chiamate fatte dall’applicazione sono scritte in ossequio alle JDBC interfaces
che sono implementate per gli specifici DBMSs.
The java.sql.Driver Interface
Un Driver e’ essenzialmente una Connection factory. Il DriverManager usa un Driver
per determinare se e’ in grado di trattare una data URL. Se uno dei Driver nella sua
lista puo’ gestire la URL, quel Driver deve creare un Connection object e restituirlo
al DriverManager. Poiche’ un applicazione referenzia solo indirettamente un Driver
attraverso il DriverManager, le applicazioni in genere non si preoccupano di questa
interfaccia.
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
The JDBC Object Model: Statement.
Marco Ronchetti - [email protected] 
The java.sql.Statement Interface
Uno Statement e’ una chiamata SQL non legata al database. It In generale e’ una
semplice UPDATE, DELETE, INSERT, or SELECT in cui le colonne non sono
legate a dei dati Java. Uno Statement fornisce metodi per fare le chiamate SQL e
restituisce all’applicazione il risultato di un SELECT statement il numero di righe
toccate da un UPDATE, DELETE, o INSERT statement.
PreparedStatement e’ sottoclasse di Statement. E’ una chiamata precompilata al DB
che richiede di legare alcuni parametri. Se la query deve essere ripetuta più volte, la
precompilazione migliora l’efficienza.
Per chiamare stored procedures, una applicazione deve usare la CallableStatement
sottoclasse di PreparedStatement.
ATTENZIONE: le stored procedures spostano la logica di business ENTRO il DB!
J0
11
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
The JDBCom: Connection & ResultSet.
Marco Ronchetti - [email protected] 
The java.sql.Connection Interface
J0
12
Una Connection e’ una semplice sessione di database. Come tale immagazzina
informazioni di stato concernenti la sessione di DB che gestisce e fornisce alla
applicazione oggetti di tipo Statement, PreparedStatement, o CallableStatement per
fare chiamate durante la sessione.
The java.sql.ResultSet Interface
Una applicazione ottiene I dati restituiti da una query SELECT attraverso
l’implementazione dell’interfaccia java.sql.ResultSet interface. Specificatamente,
l’oggetto ResultSet permette all’applicazione di ottenere sequenze di righe di dati
restituite dalla precedente SELECT. Il ResultSet fornisce una moltitudine di metodi
che permettono di ottenere una data riga in qualunque tipo di dati java abbia senso.
Per esempio, se nel DB c’e’ una data memorizzata come datetime, la si puo’ ottenere
tramite il metodo getString() e usarla come una String.
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
The JDBC object model: the MetaData.
Marco Ronchetti - [email protected] 
The Meta-Data Interfaces
Meta data sono dati che riguardano i dati. In particolare, sono I dati che danno
informazioni concernenti il DB e i dati ottenibili dal DB. Java fornisce due meta-data
interfaces: java.sql.ResultSetMetaData e java.sql.DatabaseMetaData.
La ResultSetMetaData interface da’ modo di ottenere informazioni su un particolare
ResultSet. Per esempio, tra altre cose, ResultSetMetaData dà informazioni sul
numero di colonne nel result set, il nome di una colonna, e il suo tipo.
La DatabaseMetaData interface, d’altra parte, fornisce all’applicazione informazioni
sul database in generale, come quale livello di supporto ha, il suo nome, versione ecc.
La classe DatabaseMetaData e’ usata ad esempio da strumenti di sviluppo come
JBuilder.
J0
13
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Relazioni tra le classi di java.sql
J0
14
loads
Driver
Manager
Driver
creates
creates getConnection()
Applicazione
createStatement()
executeQuery()
getString()
Connection
creates
DB MetaData
Statement
creates
Result Set
Result Set
Metadata
Prepared
Statement
Callable
Statement
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Simple Database Access Using the JDBC Interfaces
J0
15
Scrivere una applicazione di Database usando solo chiamate JDBC comporta i
seguenti
passi:
1.Chiedi al DriverManager una implementazione di Connection.
2.Chiedi alla Connection uno Statement o una sottoclasse Statement per
eseguire il tuo SQL.
3.Per le sottoclassi di Statement, lega i parametri da passare alla prepared
statement.
4.Esegui lo statement.
5.Per le queries, processa il result set ritornato dalla query. Ripetilo per tutti i
result set finche’ ce ne sono.
6.Per gli altri other statements, leggi il numero di righe toccate.
7.Chiudi lo statement.
8.Processa cosi’ tutti gli statement che servono e poi chiudi la connessione.
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Setting del Control Panel ODBC
J0
16
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
// create Statement object
Statement stmt = con.createStatement();
String sqlselect =
"Select item_nbr, wholesale_cost, "
+ " item_desc, company_name”
package first;
+” from retail_item,company"
import java.lang.*;
+ " where wholesale_cost<9 and”
import java.util.*;
+ " company.company_id=retail_item.company_id"
import java.sql.*;
+ " order by wholesale_cost";
import sun.jdbc.odbc.*;
// run query
import java.io.*;
ResultSet rs = stmt.executeQuery(sqlselect);
// process results
public class first
while(rs.next()) {
{
result = "";
id
= rs.getInt(1);
public static void main(String arg[]) {
amount = rs.getFloat(2);
int id;
//dt
= rs.getDate(2);
float amount;
item_desc
= rs.getString(3);
java.sql.Date dt;
companyName
= rs.getString(4);
String companyName;
result = "#"+result.valueOf(id) + " $";
String result;
result+= result.valueOf(amount) + " <";
String item_desc;
result+= item_desc+"> <"+companyName+">";
System.out.println("Values are: " + result);
try {
}
//connect to ODBC database
//close connection
Class.forName(
con.close();
sun.jdbc.odbc.JdbcOdbcDriver");
}
String url = "jdbc:odbc:cityzoo";
catch(Exception e) {
// connect
System.out.println(e.getMessage());
Properties p = new Properties();
}
p.put("user", "");
try {
p.put("password","");
Thread.sleep(20*1000);
Connection
con
=
}
catch (Exception e) {}
J0
DriverManager.getConnection(url,p);
}
17
}
Marco Ronchetti - [email protected] 
Primo esempio
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
import
import
import
import
import
public
Applet per effettuare interrogazioni-1
java.applet.*;
java.awt.*;
java.awt.event.*;
java.sql.*;
sun.jdbc.odbc.*;
class AppletQuery extends Applet
implements ActionListener
{
J0
18
Choice
colorChoice;
Choice
sizeChoice;
Button
searchButton;
TextArea
resultsTextArea;
ResultSet rs;
Statement stmt;
Connection con;
public void init()
{
Panel
layout_area;
Panel
search_area;
Panel
result_area;
String
stringSelect;
// set background to white
setBackground(new
Color(255,255,255));
// add layout_area to top of background panel
add("North",layout_area);
// add top label to layout
setFont(new Font("Helvetica",Font.BOLD,12));
layout_area.add("North",new Label
("Enter value(s) to search on:"));
setFont(new Font("Helvetica",Font.PLAIN,12));
// create gridlayout search panel
// add to background layout
{
search_area = new Panel();
search_area.setLayout(new FlowLayout(1,5,5));
layout_area.add("Center",search_area);
// create color Choice object
// add to layout with label
// create Choice object colorChoice
// add colors to Choice object
colorChoice = new Choice();
search_area.add(colorChoice);
search_area.add(new Label("Color:"));
// create border layout as default
setLayout(new BorderLayout());
layout_area = new Panel();
layout_area.setLayout(new BorderLayout());
“Basi di
Dati Web
e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
// create size
Choice
object
// add to layout with Label
// create Choice object sizeChoice
// add sizes to Choice object
sizeChoice = new Choice();
search_area.add(sizeChoice);
stringSelect = "Select Distinct retail_item.color" +
" from retail_item ";
colorChoice.addItem("");
rs = processRequest(stringSelect);
try {
while (rs.next()) {
String color=rs.getString(1);
System.out.println(color);
colorChoice.addItem(color);
}
} catch (Exception e) {}
Marco Ronchetti - [email protected] 
Applet per effettuare interrogazioni -2
J0
19
sizeChoice.addItem("");
stringSelect = "Select Distinct size" +
" from retail_item ";
rs = processRequest(stringSelect);
try {
while (rs.next()) {
String size=rs.getString(1);
System.out.println(size);
sizeChoice.addItem(size);
}
} catch (Exception e) {}
search_area.add(new Label("Size:"));
search_area.add(new Label("
"));
searchButton = new Button(" Search ");
searchButton.addActionListener(this);
search_area.add(searchButton);
}
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Applet per effettuare interrogazioni -3
// create another panel for the result set
// make the type of layout GridBagLayout
{
result_area = new Panel();
// add results label
setFont(new Font("Helvetica",Font.BOLD,12));
add("Center", new Label("Results:"));
setFont(new Font("Courier",Font.PLAIN,12));
add("South",result_area);
GridBagLayout gridbag = new GridBagLayout();
result_area.setLayout(gridbag);
GridBagConstraints Constraints = new GridBagConstraints();
Constraints.weightx=1.0;
Constraints.weighty=1.0;
Constraints.anchor=GridBagConstraints.CENTER;
Constraints.fill = GridBagConstraints.BOTH;
Constraints.gridwidth = GridBagConstraints.REMAINDER;
// create results text area
resultsTextArea = new TextArea(15,60);
// add with constraints to layout
gridbag.setConstraints(resultsTextArea,Constraints);
result_area.add(resultsTextArea);
resultsTextArea.setEditable(false);
J0
20
}
}
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Applet per effettuare interrogazioni-4
// check to see if event was search button being pressed;
// if so
//
connect to database
//
create query
//
send statement
//
process results
// else
//
disregard
//
public void actionPerformed(ActionEvent event) {
if (event.getSource() == searchButton) {
String whereString = buildWhere();
// execute statement
String stringSelect = "Select retail_item.item_nbr," +
"retail_item.item_desc,retail_item.qty_per_pkg," +
"retail_item.color," +
"retail_item.size,retail_item.retail_cost " +
"from retail_item" + whereString;
resultsTextArea.setText("working...");
showResults(processRequest(stringSelect));
}
}
J0
21
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Applet per effettuare interrogazioni-5
J0
22
// process_request
//
// connect to database
// build where clause
// retrieve data
// output results
public ResultSet processRequest(String stringSelect)
{
try {
//connect to database
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:cityzoo";
// connect
con = DriverManager.getConnection(url, "", "");
// create Statement
stmt = con.createStatement();
rs = stmt.executeQuery(stringSelect);
} catch (Exception e) {
// resultsTextArea.setText(e.getMessage());
}
return rs;
}
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Applet per effettuare interrogazioni-6
public void showResults(ResultSet rs) {
String tempString = "";
String stringResult = "";
resultsTextArea.setText("Processing Results...");
try {
while (rs.next()) {
tempString = rs.getString(1) + "\t";// get item number
stringResult+=tempString;
tempString=rs.getString(2) + "\t";// get description
stringResult+=tempString;
tempString = rs.getString(3) + "\t";// get qty
stringResult+=tempString;
tempString = rs.getString(4) + "\t";// get color
if (rs.wasNull()) {
tempString = "\t\t";
}
stringResult+=tempString;
tempString= rs.getString(5) + "\t";// get size
if (rs.wasNull()) {
if (stringResult == "") {
tempString = "\t\t";
stringResult = "No Data Found \n";
}
}
stringResult+=tempString;
resultsTextArea.setText(stringResult);
// get retail cost
stmt.close();
tempString="$" + rs.getString(6) + "\n";
rs.close();
stringResult+=tempString;
}
}
catch (Exception e) {
resultsTextArea.setText(e.getMessage());
J0
23
}
}
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Applet per effettuare interrogazioni-7
// buildWhere
//
// check Choice components
// if an item is selected and is not
//the one at position 0, access the selected item
//
// if choice is category, access the category code
// return generated where clause
public String buildWhere()
{
String colorString = null;
String sizeString = null;
String whereString = null;
int colorInt = colorChoice.getSelectedIndex();
if (colorInt > 0) {
colorString = colorChoice.getSelectedItem();
}
";
int sizeInt = sizeChoice.getSelectedIndex();
if (sizeInt > 0) {
sizeString = sizeChoice.getSelectedItem();
}
if (colorString != null) {
whereString = " Where ";
whereString = whereString +
" retail_item.color = '" +
colorString + "'";
}
if (sizeString != null) {
if (whereString == null) {
whereString = " Where ";
}
else {
whereString = whereString + " and
}
whereString = whereString +
" retail_item.size = '" +
sizeString + "'";
}
if (whereString == null) {
whereString = "";
}
return whereString;
}
J0
24
}
“Basi di Dati Web e Distribuite” – Laurea Specialitica in Informatica – Università di Trento
Marco Ronchetti - [email protected] 
Esercizio
J0
25
Creare nel DB una tabella contenente i campi:
ID nome cognome
Costruire una pagina Welcome.html che dice
“Benvenuto, clicca qui per proseguire”.
Cliccando si invoca una servlet che verifica l’esistenza di un cookie con la
proprieta’ ID.
•
Se il cookie esiste, la servlet cerca nel DB nome e cognome e genera
una pagina che dice “Ciao nome cognome, sei un vecchio cliente”.
•
Se invece il cookie non esiste, la servlet restituisce una pagina HTML
contenente una Form che chiede Nome e cognome, in risposta alla quale
Si genera un ID, si registrano I dati nel DB e si risponde
“Ciao nome cognome, sei stato registrato come nuovo cliente”.
Per ragioni di debugging e’ anche utile scrivere una pagina che invoca una
Servlet che cancella il cookie e rimuove il record corrispondente del DB.