Marco Ronchetti ronchetaltavista it Java OO 1 Sql

  • Slides: 24
Download presentation
Marco Ronchetti - ronchet@altavista. it Java OO. 1 Sql package

Marco Ronchetti - ronchet@altavista. it Java OO. 1 Sql package

Marco Ronchetti - ronchet@altavista. it JDBC OO. 2 Un’applicazione per la quale sia fondamentale

Marco Ronchetti - ronchet@altavista. it JDBC OO. 2 Un’applicazione per la quale sia fondamentale l’indipendenza dal Database puo’ 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.

Marco Ronchetti - ronchet@altavista. it Strati SW per l’accesso a un DB OO. 3

Marco Ronchetti - ronchet@altavista. it Strati SW per l’accesso a un DB OO. 3

Marco Ronchetti - ronchet@altavista. it The JDBC Interfaces OO. 4 JDBC 1. 1 definisce

Marco Ronchetti - ronchet@altavista. it The JDBC Interfaces OO. 4 JDBC 1. 1 definisce otto interfacce che un driver deve implementare Per poter essere JDBC-compliant: java. sql. Driver java. sql. Connection java. sql. Statement java. sql. Prepared. Statement java. sql. Callable. Statement java. sql. Result. Set. Meta. Data java. sql. Database. Meta. Data

OO. 5 Marco Ronchetti - ronchet@altavista. it

OO. 5 Marco Ronchetti - ronchet@altavista. it

Marco Ronchetti - ronchet@altavista. it The JDBC object model: the Manager. L’oggetto centrale: java.

Marco Ronchetti - ronchet@altavista. it The JDBC object model: the Manager. L’oggetto centrale: java. sql. Driver. Manager. 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 Driver. Manager sarebbe responsabile di tenere traccia di queste implementazioni. Quando una applicazione vuole connettersi ad un database, chiede al Driver. Manager di darle una database connection, usando una database URL attraverso il metodo Driver. Manager. get. Connection(). Basandosi su questa URL, il Driver. Manager cerca una implementazione di Driver che accetti la URL. Ottiene quindi una implementazione di Connection da quel Driver e la restituisce all’applicazione. OO. 6

Marco Ronchetti - ronchet@altavista. it The JDBC object model: the URL. OO. 7 Per

Marco Ronchetti - ronchet@altavista. it The JDBC object model: the URL. OO. 7 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, syb 10 indica Sybase System 10. L’elemento subname e’ qualunque informazione specifica del DBMS che specifica dove deve connettersi. Per m. SQL, 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.

Marco Ronchetti - ronchet@altavista. it The JDBC object model: the Driver. OO. 8 Il

Marco Ronchetti - ronchet@altavista. it The JDBC object model: the Driver. OO. 8 Il Driver. Manager 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 Driver. Manager 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 Driver. Manager. Poiche’ un applicazione referenzia solo indirettamente un Driver attraverso il Driver. Manager, le applicazioni in genere non si preoccupano di questa interfaccia.

The JDBC Object Model: Statement. Marco Ronchetti - ronchet@altavista. it The java. sql. Statement

The JDBC Object Model: Statement. Marco Ronchetti - ronchet@altavista. it 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. Prepared. Statement e’ sottoclasse di Statement. E’ una chiamata precompilata al DB che richiede di legare alcuni parametri. Un esempio di Prepared. Statement e’ una stored procedure call che non ha parametri di OUT o INOUT. Per stored procedures con parametri OUT or INOUT parameters, una applicazione deve usare la Callable. Statement sottoclasse di Prepared. Statement. OO. 9

The JDBCom: Connection & Result. Set. Marco Ronchetti - ronchet@altavista. it The java. sql.

The JDBCom: Connection & Result. Set. Marco Ronchetti - ronchet@altavista. it The java. sql. Connection Interface OO. 10 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, Prepared. Statement, o Callable. Statement per fare chiamate durante la sessione. The java. sql. Result. Set Interface Una applicazione ottiene I dati restituiti da una query SELECT attraverso l’implementazione dell’interfaccia java. sql. Result. Set interface. Specificatamente, l’oggetto Result. Set permette all’applicazione di ottenere sequenze di righe di dati restituite dalla precedente SELECT. Il Result. Set 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 get. String() e usarla come una String.

The JDBC object model: the Meta. Data. Marco Ronchetti - ronchet@altavista. it The Meta-Data

The JDBC object model: the Meta. Data. Marco Ronchetti - ronchet@altavista. it The Meta-Data Interfaces OO. 11 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. Result. Set. Meta. Data e java. sql. Database. Meta. Data. La Result. Set. Meta. Data interface da’ modo di ottenere informazioni su un particolare Result. Set. Per esempio, tra altre cose, Result. Set. Meta. Data da informazioni sul numero di colonne nel result set, il nome di una colonna, e il suo tipo. La Database. Meta. Data 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 Database. Meta. Data e’ usata raramente perche’ la maggior parte delle informazioni sono utili primariamente a strumenti di sviluppo JBuilder.

Marco Ronchetti - ronchet@altavista. it Relazioni tra le classi di java. sql OO. 12

Marco Ronchetti - ronchet@altavista. it Relazioni tra le classi di java. sql OO. 12

Marco Ronchetti - ronchet@altavista. it Simple Database Access Using the JDBC Interfaces OO. 13

Marco Ronchetti - ronchet@altavista. it Simple Database Access Using the JDBC Interfaces OO. 13 Scrivere una applicazione di Database usando solo chiamate JDBC comporta i seguenti passi: 1. Chiedi al Driver. Manager 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.

Marco Ronchetti - ronchet@altavista. it Setting del Control Panel ODBC OO. 14

Marco Ronchetti - ronchet@altavista. it Setting del Control Panel ODBC OO. 14

Primo esempio Marco Ronchetti - ronchet@altavista. it package first; import java. lang. *; import

Primo esempio Marco Ronchetti - ronchet@altavista. it package first; import java. lang. *; import java. util. *; import java. sql. *; import sun. jdbc. odbc. *; import java. io. *; public class first { public static void main(String arg[]) { int id; float amount; java. sql. Date dt; String company. Name; String result; String item_desc; try { //connect to ODBC database Class. for. Name( sun. jdbc. odbc. Jdbc. Odbc. Driver"); String url = "jdbc: odbc: cityzoo"; // connect Properties p = new Properties(); p. put("user", ""); p. put("password", ""); Connection con = OO Driver. Manager. get. Connection(url, p); . 15 // create Statement object Statement stmt = con. create. Statement(); String sqlselect = "Select item_nbr, wholesale_cost, " + " item_desc, company_name” +” from retail_item, company" + " where wholesale_cost<9 and” + " company_id=retail_item. company_id" + " order by wholesale_cost"; // run query Result. Set rs = stmt. execute. Query(sqlselect); // process results while(rs. next()) { result = ""; id = rs. get. Int(1); amount = rs. get. Float(2); //dt = rs. get. Date(2); item_desc = rs. get. String(3); company. Name = rs. get. String(4); result = "#"+result. value. Of(id) + " $"; result+= result. value. Of(amount) + " <"; result+= item_desc+"> <"+company. Name+">"; System. out. println("Values are: " + result); } //close connection con. close(); } catch(Exception e) { System. out. println(e. get. Message()); } try { Thread. sleep(20*1000); } catch (Exception e) {} } }

import import public Applet per effettuare interrogazioni-1 java. applet. *; java. awt. event. *;

import import public Applet per effettuare interrogazioni-1 java. applet. *; java. awt. event. *; java. sql. *; sun. jdbc. odbc. *; class Applet. Query extends Applet implements Action. Listener Marco Ronchetti - ronchet@altavista. it { Choice color. Choice; Choice size. Choice; Button search. Button; Text. Area results. Text. Area ; Result. Set rs; Statement stmt; Connection con; public void init() { Panel layout_area; Panel search_area; Panel result_area; String string. Select; // set background to white set. Background(new Color(255, 255)); OO. 16 // add layout_area to top of background panel add("North", layout_area); // add top label to layout set. Font(new Font("Helvetica", Font. BOLD, 12)); layout_area. add("North", new Label ("Enter value(s) to search on: ")); set. Font(new Font("Helvetica", Font. PLAIN, 12)); // create gridlayout search panel // add to background layout { search_area = new Panel(); search_area. set. Layout(new Flow. Layout(1, 5, 5)); layout_area. add("Center", search_area); // create color Choice object // add to layout with label // create Choice object color. Choice // add colors to Choice object color. Choice = new Choice(); search_area. add(color. Choice); search_area. add(new Label("Color: ")); // create border layout as default set. Layout(new Border. Layout()); layout_area = new Panel(); layout_area. set. Layout(new Border. Layout());

// create size Choice object // add to layout with Label // create Choice

// create size Choice object // add to layout with Label // create Choice object size. Choice // add sizes to Choice object size. Choice = new Choice(); search_area. add(size. Choice); string. Select = "Select Distinct retail_item. color" + " from retail_item "; color. Choice. add. Item(""); rs = process. Request(string. Select); try { while (rs. next()) { String color=rs. get. String(1); System. out. println(color); color. Choice. add. Item(color); } } catch (Exception e) {} Marco Ronchetti - ronchet@altavista. it Applet per effettuare interrogazioni -2 OO. 17 } size. Choice. add. Item(""); string. Select = "Select Distinct size" + " from retail_item "; rs = process. Request(string. Select); try { while (rs. next()) { String size=rs. get. String(1); System. out. println(size); size. Choice. add. Item(size); } } catch (Exception e) {} search_area. add(new Label("Size: ")); search_area. add(new Label(" ")); search. Button = new Button(" Search "); search. Button. add. Action. Listener(this); search_area. add(search. Button);

Marco Ronchetti - ronchet@altavista. it Applet per effettuare interrogazioni -3 // create another panel

Marco Ronchetti - ronchet@altavista. it Applet per effettuare interrogazioni -3 // create another panel for the result set // make the type of layout Grid. Bag. Layout { result_area = new Panel(); // add results label set. Font(new Font("Helvetica", Font. BOLD, 12)); add("Center", new Label("Results: ")); set. Font(new Font("Courier", Font. PLAIN, 12)); add("South", result_area); Grid. Bag. Layout gridbag = new Grid. Bag. Layout(); result_area. set. Layout(gridbag); Grid. Bag. Constraints = new Grid. Bag. Constraints(); Constraints. weightx=1. 0; Constraints. weighty=1. 0; Constraints. anchor= Grid. Bag. Constraints. CENTER; Constraints. fill = Grid. Bag. Constraints. BOTH; Constraints. gridwidth = Grid. Bag. Constraints. REMAINDER; // create results text area results. Text. Area = new Text. Area(15, 60); // add with constraints to layout gridbag. set. Constraints(results. Text. Area, Constraints); result_area. add(results. Text. Area); results. Text. Area. set. Editable(false); OO. 18 } }

Marco Ronchetti - ronchet@altavista. it Applet per effettuare interrogazioni-4 // check to see if

Marco Ronchetti - ronchet@altavista. it 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 action. Performed(Action. Event event) { if (event. get. Source() == search. Button) { String where. String = build. Where(); // execute statement String string. Select = "Select retail_item_ nbr, " + "retail_item_ desc, retail_item. qty_per_pkg, " + "retail_item. color, " + "retail_item. size, retail_item. retail_cost " + "from retail_item" + where. String; results. Text. Area. set. Text("working. . . "); show. Results(process. Request(string. Select)); } } OO. 19

Marco Ronchetti - ronchet@altavista. it Applet per effettuare interrogazioni-5 // process_request // // connect

Marco Ronchetti - ronchet@altavista. it Applet per effettuare interrogazioni-5 // process_request // // connect to database // build where clause // retrieve data // output results public Result. Set process. Request (String string. Select) { try { //connect to database Class. for. Name("sun. jdbc. odbc. Jdbc. Odbc. Driver"); String url = "jdbc: odbc: cityzoo"; // connect con = Driver. Manager. get. Connection(url, ""); // create Statement stmt = con. create. Statement(); rs = stmt. execute. Query(string. Select); } catch (Exception e) { // results. Text. Area. set. Text(e. get. Message()); } OO. 20 return rs; }

Marco Ronchetti - ronchet@altavista. it Applet per effettuare interrogazioni-6 public void show. Results(Result. Set

Marco Ronchetti - ronchet@altavista. it Applet per effettuare interrogazioni-6 public void show. Results(Result. Set rs) { String temp. String = ""; String string. Result = ""; results. Text. Area. set. Text("Processing Results. . . "); try { while (rs. next()) { temp. String = rs. get. String(1) + "t"; // get item number string. Result+=temp. String; temp. String=rs. get. String(2) + "t"; // get description string. Result+=temp. String; temp. String = rs. get. String(3) + "t"; // get qty string. Result+=temp. String; temp. String = rs. get. String(4) + "t"; // get color if (rs. was. Null()) { temp. String = "tt"; } string. Result+=temp. String; temp. String= rs. get. String(5) + "t"; // get size if (rs. was. Null()) { if (string. Result == "") { temp. String = "tt"; string. Result = "No Data Found n"; } } string. Result+=temp. String; results. Text. Area. set. Text(string. Result); // get retail cost stmt. close(); temp. String="$" + rs. get. String(6) + "n"; rs. close(); string. Result+=temp. String; } } catch (Exception e) { results. Text. Area. set. Text(e. get. Message()); OO. 21 } }

Marco Ronchetti - ronchet@altavista. it Applet per effettuare interrogazioni-7 // build. Where // //

Marco Ronchetti - ronchet@altavista. it Applet per effettuare interrogazioni-7 // build. Where // // 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 build. Where() { String color. String = null; String size. String = null; String where. String = null; int color. Int = color. Choice. get. Selected. Index(); if (color. Int > 0) { color. String = color. Choice. get. Selected. Item(); } "; int size. Int = size. Choice. get. Selected. Index(); if (size. Int > 0) { size. String = size. Choice. get. Selected. Item(); } if (color. String != null) { where. String = " Where "; where. String = where. String + " retail_item. color = '" + color. String + "'"; } if (size. String != null) { if (where. String == null) { where. String = " Where "; } else { where. String = where. String + " and } where. String = where. String + " retail_item. size = '" + size. String + "'"; } if (where. String == null) { where. String = ""; } return where. String; } OO. 22 }

Marco Ronchetti - ronchet@altavista. it Esercizio - 1 OO. 23 a) Costruire un DB

Marco Ronchetti - ronchet@altavista. it Esercizio - 1 OO. 23 a) Costruire un DB con i campi: ID(int) Tipo (int) Descrizione(String) Prezzo(int) b) Costruire un programma java che, dato in input il tipo, generi a partire dal DB una pagina HTML contenente una tabella con tutti I campi corrispondenti al tipo. c) Trasformare in Servlet il programma (l’input avverra’ da un file sceglitipo. html contenente una form HTML che chiede di specificare il tipo)

Esercizio - 2 Marco Ronchetti - ronchet@altavista. it Creare nel DB una tabella contenente

Esercizio - 2 Marco Ronchetti - ronchet@altavista. it Creare nel DB una tabella contenente i campi: ID nome cognome OO. 24 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.