PkLab.netMeccatronica |
Italy - Basilicata - Matera | ||||||
|
Home e contatti | ||||||
Esercitazioni di laboratorio del corso di Ingegneria del Software per gli
studenti del 3^ anno del Diploma di Laurea in Ingegneria Informatica ed Automatica
docente titolare del corso prof.C.Ghezzi - Politecnico di Milano
|
|
|
ESEMPIO: stampa degli elementi di un array
String[] firstNames = { "Dennis", "Grace", "Bjarne", "James" };
..
|
|
I MODIFICATORI SONO SPECIALI PAROLE CHIAVE CHE MODIFICANO LA DEFINIZIONE (E IL COMPORTAMENTO) DI UNA CLASSE, UN METOTO O UN ATTRIBUTO.
per utilizzare un modificatore basta inserirlo prima delle definizioni
public class MioApplet extends java.applet.Applet {...}
private boolean statoMotore;
static final double pi = 3.14152965;
protected static final int MAXELEMENTI = 128
public static void main(String arg[]){...}
e’ possibile utilizzare piu’ di un modificatore contemporaneamente
public, protected e private sono tra loro esclusivi l’ordine non e’ importante
tutti i modificatori sono opzionali, tuttavia e’ bene esplicitare l’utilizzo e le restrizioni sugli elementi dichiarati, utilizzando i modificatori.
una classe e’ dotata di attributi e metodi necessaria al suo funzionamento. Ogni classe dipone di interfacce verso l’esterno per interagire con altri oggetti
l’accesso diretto agli atributi di una classe puo’ provocare inconsistenze nei dati della classe e sicuramente impedisce la modularita’ della classe stessa
OGNI PROGETTISTA DI UNA CLASSE O DI UNA GERARCHIA DEVE DEFINIRE LE INTERFACCE DELLA CLASSE SPECIFICANDO QUALI PARTI SONO ACCESSIBILI DA ALTRE CLASSI E QUALI DI USO INTERNO ALLA CLASSE
INCAPSULAMENTO: proceso con cui si nascondono le parti interne di una classe consentendo l’accesso alla classe solo attraverso interfacce predefinite
METODI DI ACCESSO:
SONO METODI PUBLIC DI UNA CLASSE CHE DANNO L’ACCESSO IN LETTURA SCRITTURA AD ATTRIBUTI PRIVATI DELLA CLASSE
ESEMPIO: la classe cerchio
class Cerchio
{
public static float PI=3.14159265F;
private int x,y;
private double raggio,area;
Cerchio() // costruttore 1
{ x=y=0;
setRaggio(0);
}
Cerchio(int xc,int yc, double r) // costruttore 2
{ x=xc;y=yc;
setRaggio(r);
}
public double getRaggio() {return raggio;}
public double setRaggio(double r)
{
raggio =r;
area = r * r * PI;
return raggio;
} //fine di setRaggio
public void printData()
{
System.out.println("-------------");
System.out.println("Coordinate del centro(x,y): " + x + "," + y);
System.out.println("Raggio: " + raggio);
System.out.println("Area: " + area);
System.out.println("-------------");
} //fine di printData
public static void main(String args[])
{
Cerchio c1 = new Cerchio(100,50,0);
c1.printData();
c1.setRaggio(10);
System.out.println("ora il cerchio ha raggio " + c1.getRaggio());
c1.printData();
} //fine di main
} //fine di Cerchio
UN PACKAGE E’ UNO STRUMENTO PER RAGGRUPPARE LE CLASSI TRA LORO CORRELATE (per ereditarieta’ o per scopo)
Per accedere ad una classe contenuta in un package e’ necessario chiamarla con il suo nome e il percorso di package che la contiene
ESEMPIO: creo un oggetto f di tipo Font che e’ una classe del sottopackage awt del package java
java.awt.Font f = new java.awt.Font()
Per classi utilizzate di frequente e’ possibile importare la classe o l’intero package all’interno della propria classe
ESEMPIO: importo la classe Vector che e’ una classe del sottopackage util del package java
import java.util.Vector
ESEMPIO: importo l’intero sottopackage (solo classi public) awt del package
java
import java.awt.*
Un package se ben progettato e’ una estensione del linguaggio (o meglio della sua libreria)
Ogni package deve essere contenuto in una directory con lo stesso nome del package. Questa directory conterra’ tante sottodirectory quanti sono i sottopackage del package principale.
La radice della directory principale di un package deve essere una delle directory impostate con la variabile d’ambiente CLASSPATH
Per aggiungere una classe ad un package e’ necessario inserire all’inizio del file sorgente per la classe, il comando package nomepackage
UN PACKAGE PROGETTATO PER FACILITARE LA GESTIONE DI INTERFACCE UTENTE PER APPLET ED APPLICAZIONI JAVA.
AWT SI COMPONE DI
OGNI PROGRAMMA GRAFICO E’ UNA COLLEZIONE DI COMPONENTI ORGANIZZATI IN MODO GERARCHICO A COMINCIARE DALLA FINESTRA PIU’ ESTERNA PER ARRIVARE ALLA PIU’ PICCOLA COMPONENTE DELL’APPLICAZIONE
OGNI ELEMENTO DELLA GERARCHIA PUO’ ESSERE UN ELEMENTO VISIBILE O UN CONTENITORE
LA GERARCHIA DEI COMPONENTI DETERMINA LA POSIZIONE SULLO SCHERMO E L’ORDINE CON CUI VENGONO DISEGNATE

estratto della gerarchia della classe java.awt
Stringa di testo utilizzabile per etichettare altre componenti. Non puo’ essere modificata dall’utente
COSTRUTTORI:
La classe label dispone di Label.RIGHT Label.CENTER e Label.LEFT che sono nomi mnemonici per i valori degli allineamenti
Il font dell’etichetta e’ controllabile con il metodo setFont() richiamato sulla etichetta o sul componente che la contiene (in questo caso cambiano i font di tutti gli elementi che contiene il componente)
Esempio:
LabelTest.javail metodo setFont imposta il font per tutto l’applet
il metodo add aggiunge l’oggetto all’applet
SEMPLICI COMPONENTI CHE AVVIANO UNA AZIONE QUANDO VENGONO PREMUTI
COSTRUTTORI:
la classe fornisce anche i metodi
ESEMPIO:
ButtonTest.htmlCOMPONENTI DI INTERFACCIA A VALORE BOOLEANO. SERVONO AD INDICARE DELLE SCELTE TRA UN GRUPPO PREIMPOSTATO DI POSSIBILI OPZIONI.
Se solo una delle opzioni puo’ essere selezionata allora le checkbox sono ESCLUSIVE
COSTRUTTORI:
per ottenere delle checkbox esclusive e’ necessario creare un gruppo di checkbox e far appartenere le singole checkbox allo stesso gruppo. In tal caso bisogna utilizzare il costruttore:
Checkbox(String,boolean,CheckboxGroup):
crea una checkbox esclusiva sul gruppo indicato, con etichetta, disattivata o disativata in funzione del parametro boolensiccome all’interno di uno stesso gruppo solo un checkbox puo’ essere attivo, l’ultimo pulsante con true aggiunto al gruppo e’ quello attivo per default
Altri metodi per la classe:
ESEMPIO: CheckboxGroupTest.html
COMPONENTI PER REALIZZARE ELENCHI A COMPARSA SU CUI EFFETTUARE UNA SCELTA
per creare un menu di scelta e’ necessario istanziare un oggetto della classe choice e successivamente aggiungere gli elementi
METODI DISPONIBILI
ESEMPIO:
ChoiceTest.htmlCASELLE CHE CONSENTONO ALL’UTENTE L’INSERIMENTO DI TESTO
In sono costituite da una singola riga e non hanno barre di scorrimento. Per testi di maggiori dimensioni utlizzare TextArea
COSTRUTTORI:
ALTRI METODI DELLA CLASSE:
ESEMPIO:
TextFieldTest.htmlUN PANNELLO PUO’ CONTENERE UNA INTERFACCIA UTENTE O ALTRI PANNELLI
LA DISPOSIZIONE DEI COMPONENTI DELL’INTERFACCIA UTENTE DEFINISCE L’ASPETTO DELL’INTERFACCIA UTENTE STESSA
POICHE’ L’APPLICAZIONE JAVA PUO’ ESSERE VISUALIZZATA SU DIVERSE PIATTAFORME E’ NECESSARIO DISPORRE DI UN METODO FLESSIBILE CHE RENDI L’ASPETTO DELL’INTERFACCIA, FUNZIONALE SULLE DIVERSE PIATTAFORME.
JAVA DISPONE DI GESTORI DI LAYOUT CHE CONSENTYO DI CREARE LA FINESTRA IN MODO DINAMICO
L’ASPETTO DELL’INTERFACCIA DIPENDONO DA
IL GESTORE DI LAYOUT DETERMINA IL MODO CON CUI LE COMPONENTI AWT VENGONO DISPOSTE DINAMICAMENTE SULLO SCHERMO
Ogni pannello puo’ contenere altri pannelli e ogni pannello puo’ disporre di un proprio gestore di layout.
AWT dispone 5 diversi gestori di layout: FLOW, GRID, GRIDBAG,BORDER E CARD
LE COMPONENTI VENGONO AGGIUNTE UNA ALLA VOLTA PER RIGA
Se una componente non ci sta in una riga viene portata alla riga successiva
Per default le righe sono allineate al centro del pannello
ESEMPIO: imposto un FlowLayout con allineamento a sinistra spaziatura di 30 pixel tra gli elementi e 10 pixel tra le righe
setLayout(new FlowLayout(FlowLayout.LEFT,30,10);
CON IL LAYOUT A GRIGLIA IL PANNELLO E’ SUDDIVISO IN RIGHE E COLONNE ED OGNI COMPONENTE VIENE AGGIUNTO IN UNA CELLA DELLA GRIGLIA.
Il primo elemento aggiunto al pannello viene posizionato nella cella in alto a sinistra
Gli elementi successivi vengono posizionati da sinistra verso destra e dall’alto in basso
PER CREARE UN LAYOUT A GRIGLIA E’ NECESSARIO DEFINIRE IL NUMERO DI RIGHE E DI COLONNE.
ESEMPIO:layout a griglia con tre righe e due colonne con una spaziatura tra le colonne di 30 pixel e 10 pixel di spaziatura tra le righe
setLayout(new GridLayout(3,2,30,10);
CON IL LAYOUT A BORDI IL PANNELLO VIENE SUDDIVISO IN 5 ZONE: North, South, West, East, Center
con questo gestore e’ necessario indicare al metodo add in quale zona posizionare il componente
Le componenti ai bordi vengono greati con la dimensione necessaria mentre il componente al centro se esiste occupa tutto lo spazio rimanente
public class BorderLayoutTest extends java.applet.Applet {
public void init() {
setLayout(new BorderLayout());
add("North", new Button("One"));
add("East", new Button("Two"));
add("South", new Button("Three"));
add("West", new Button("Four"));
add("Center", new Button("Five"));
}
}
GridBagLayout gestisce il pannello con una griglia. Permette inoltre di specificare delle proprieta’ per le singole celle quali:
IL GESTORE SI COMPONE DI DUE CLASSI:
SINTETICAMENTE LA CREAZIONE DI UN GridBagLayout RICHIEDE I SEGUENTI PASSI
ESEMPIO:
GridBagTestFinal.htmlLA CLASSE Applet E’ UNA SOTTOCLASSE DI Panel
Per annidare altri pannelli all’interno di un applet e’ sufficiente creare un nuovo pannello ed aggiungerlo all’applet
SetLayout(new GridLayout(1,2,10,10)
Panel pane1A = new Panel();
Panel pane1B = new Panel();
add(panelA);
add(panelB);
Ogni Panel puo’ avere un gestore di layout e componenti indipendenti
PanelA.setLayout(new FlowLayout());
panelA.add(new Button("UP");
panelA.add(new Button("DOWN");
I COMPONENTI DELL’INTERFACCIA UTENTE SONO COMPONENTI "STATICI" PERCHE’ DA SOLI NON GENERANO ALCUNA AZIONE VERSO L’APPLICAZIONE
OGNI COMPONENTE GENERA UN EVENTO NEL MOMENTO IN CUI L’UTENTE COMPIE UNA AZIONE SUL COMPONENTE STESSO
L’APPLICAZIONE DEVE GESTIRE GLI EVENTI GENERATI DALLE COMPONENTI IMPLEMENTANDO UNA "AZIONE CONCRETA" IN RISPOSTA AL’INPUT DELL’UTENTE
Tranne le componenti Label, tutti i componenti AWT generano eventi
Per la gestione degli eventi di azione esiste il metodo specifico action
Public boolean action(Event evt, Object arg)
IL SISTEMA DI GESTIONE DELGLI EVENTI DI JAVA CHIAMA AUTOMATICAMENTE IL METODO ACTION QUANDO SI VERIFICA UN EVENTO DI AZIONE
IL METODO ACTION VA RISCRITTO NELLA CLASSE UTENTE IN MODO DA COMPIERE L’AZIONE DESIDERATA IN RISPOSTA AL COMPONENTE DELL’INTERFACCIA CHE HA GENERATO L’EVENTO
Il parametro arg e’ un parametro il cui tipo dipende dal componente AWT che ha generato l’evento, per un pulsante ad esempio e’ l’etichetta del pulsante
Il primo parametro di action e’ l’oggetto event che e’ stato generato.
Tale oggetto porta con se delle informazioni tra cui l’oggetto che ha ricevuto l’evento. Questa informazione e’ utilizzata per scrivere l’implementazione dell’azione associata all’oggetto
ESEMPIO:
Public boolean action(Event evt, Object arg)
{
if(evt.target istanceof TexField) return GestisciTesto(evt.Target);
else if(evt.target istanceof Choice) return GestisciScelta(evt.Target);
else if(evt.target istanceof Button) return GestisciPulsante(arg);
else if ...
return false;
}
Public boolean GestisciPulsante(String label)
{
if(label.equals("OK") return GestisciOK();
else if ...
}
public boolean gotFocus(Event evt, Object arg);
public boolean lostFocus(Event evt, Object arg);
Questi metodi vengono chiamati dal gestore del layout ogni volta che si preme il tasto Tab o viene clickato uno dei componenti del’interfaccia
handleEvent
public boolean handleEvent(Event evt)
{
if(evt.id == Event.LIST_SELECT) GestisciSelezione(Event);
else if(evt.id == Event.LIST_DESELECT) GestisciDeselezione(Event);
else return super.handleEvent(evt) //passa al gestore standard
}
tutti i gestori devono ritornare
true o false
in funzione se l’evento e’ stato "consumato" o meno
ESEMPIO: ButtonActionsTest.html
JDBC API non permettono la gestione diretta di un database, ma solo l'invio di istruzioni in un linguaggio standard (SQL), e la manipolazione degli eventuali risultati.
Molto sinteticamente i passi necessari da compiere sono i seguenti:
Connection
Statement
PreparedStatement e CallableStatement.
DRIVER LAYER: livello orientato al database. Interagisce col database attraverso chiamate a basso livello verso le tabelle dello stesso
APPLICATION LAYER: livello orientato all’applicazione
Il colloquio fra i due livelli è reso possibile rispettando le specifiche delle API ed utilizzando in pratica la classe Driver.
Principalmente questa parte di codice è cositituita da quattro interfaccie che ogni driver deve implementare per mantenere la compatibilità con le direttive JDBC, più la classe Driver; le 4 interfaccie sono Driver, Connection, Statement, e ResultSet.
Questa parte delle API si suddivide in due interfaccie (classi):
Questa classe permette la connessione ad una base di dati a partire da una stringa di connessione La stringa di connessione ha una sintassi molto simile a quella utilizzata per gli URL usati dal sistema World wide Web:
jdbc:<subprotocol:<subname
dove <subprotocol definisce il tipo del driver, mentre <subname definisce il nome del db codificato secondo le specifiche del sistema.
ESEMPIO:
jdbc:odbc:biblio
definisce un driver per odbc e un db denominato biblio.
La parte dedicata al subaname può inglobare informazioni più specifiche relativamente al dabase, come il path assoluto, la porta di accesso al server, l'account e la password, in maniera del tutto analoga a come avviene ad esempio nella definizione di un URL di una pagina WEB. Ad esempio possiamo quindi avere
jdbc:msq1://mokabyte.programmers.net.+puliti+.+password+:1112/mokadb
dove si é specificato il server sul quale risiede il db, la UID e password, la porta ed infine il path del db relativamente alla macchina specificata.
La classe Driver e’ di fornisce i suoi servizi alla classe DriverManager che e’ di fatto la classe con la quale si andra’ ad interagire
Questa classe fornisce i metodi fondamentali per:
Tutti i metodi della classe sono statici per cui possono essere invocati anche
senza instanziare la classe di riferimento che comunque è la java.sql.DriverManager
public static synchronized Connection getConnection(String url, Properties prop) throws SQLException
Questo metodo, tenta una connessione restituendo un oggetto Connection.
Durante la fase di apertura della connessione viene scorsa una lista di driver
ed il primo che permette la connessione viene scelto. La lista dei driver viene
conservata in un oggetto di tipo Vector.
Per caricare un driver al DriverManager si puo’ eseguire una chiamata metodo Class.forName, il quale esplicitamente carica la classe driver in questione e la aggiunge alla lista
ESEMPIO: supponendo di voler caricare un driver denominato MBPkgs.drivers.MBdriver1,
allora possiamo scrivere
Class.forName("MBPkgs.drivers.MBdriver1");
Anche a questo livello ci sono tre interfaccie: Connection, Statement ,ResultSet
Per default, al momento della creazione, una Connection JDBC si trova impostata in autocommit mode, per cui le modifiche vengono eseguite automaticamente dopo ogni transazione.
E' possibile modificare tale proprietà passando come parametro false al metodo setAutoCommit(boolean b).
Nel caso in cui sia disabilitata la modalità di autocommit, ha senso utilizzare i metodi Connection.commit() e Connection.rollback(), per controllare meglio il flusso dei dati.
Alcuni dei metodi più importanti della interfaccia Connection
public abstract Statement createStatement() throws SQLException
public abstract PreparedStatement prepareStatement(String sql) throws SQLException
public abstract CallableStatement prepareCall(String sql) throws SQLException
Questi tre metodi permettono di creare statements, cioé istruzioni da inviare al dbms, sia per eseguire operazioni sui dati, sia più semplicemente per estrarre informazioni.
Vi sono poi i metodi per la gestione del flusso di informazioni
public abstract void commit() throws SQLException
public abstract void rollback() throws SQLException
La classe Statements permette la manipolazione di un database attraverso istruzioni in linguaggio SQL inviate al DBMS che penserà a processare tali comandi ed a restituire i risultati.
public abstract ResultSet executeQuery(String sql) throws SQLException
Esegue una semplice istruzione SQL passata in input e resituisce il recordset dei risultati sotto forma di un oggetto della classe ResultSet.
public abstract int executeUpdate(String sql) throws SQLException
Esegue un update secondo quanto scritto nella stringa SQL passata; non restuisce nessun set di risultati, ma solo il numero di righe (record) affetti da cambiamento.
public abstract ResultSet getResultSet() throws SQLException
Dopo aver eseguito una operazione sul db è possibile leggere il buffer contenente i risultati.
public abstract int getUpdateCount() throws SQLException
Restituisce lo stato di una operazione di aggiornamento update,insert, delete. Il valore resitituito è il mumero di righe che hanno subito il cambiamento, o -1 se non è disponibile nessun update count o se è stata eseguita precedentemente una operazione di update che non restituisce un update count ma un recordset.
L'interfaccia PreparedStatement deriva da Statement e offre una serie di meccanismi preparati nel caso in cui si debbano eseguire una serie di operazioni ripetitive.
La differenza fra uno statement ed uno prepared, è che
quest'ultimo utilizza istruzioni SQL precompilate in cui si ha la possibilità
di lasciare alcuni parametri generici e di settarli al momento della chiamata
attraverso i metodi setType()
definisce i metodi per accedere ai dati ottenuti come risultato dall'esecuzione di uno statement. I valori relativi ai vari campi possono essere ricavati sia facendo riferimento al nome del campo sia al suo indice (la numerazione parte da 1).
Metodi principali:
next():per passare al risultato successivo getMetaData():restituisce un oggetto di tipo
ResultSetMetaData(), col quale possiamo ricavare una serie di informazioni basilari sulla struttura
del recordset ottenuto, come ad esempio il numero di colonne, il tipo di ogni
colonna e altro ancora. La classe DriverManager che si occupa di tale operazione andando a scorrere la lista jdbc.drivers ed utilizzando il primo driver che risponde ai requisiti necessari.
E' possibile consultare tale lista per mezzo del metodo getDrivers().
La classe DriverManager non è l'unica che permette la connessione con un DB, ma è possibile utilizzare anche l'interfaccia Driver che permette di accedere a tutte le informazioni che riguardano il db, come ad esempio se esso è JDBC-Compliant, la versione, o se accetta un determinato URL.
ESEMPIO-Collegamento ad un database biblio:
//caricamento del driver per dichiazione esplicita
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//controllo del caricamento
try
{
Connection connessione=DriverManager.getConnection("jdbc:odbc:biblio");
Enumeration enum = DriverManager.getDrivers();
System.out.println("Driver ="+enum.nextElement());
while (enum.hasMoreElements())
System.out.println("Driver"+enum.nextElement());
}
//sezione di gestione delle eccezioni
catch(SQLException sqle)
{
System.out.println("ERRORE SQL "+sqle.toString());
SQLException s=sqle.getNextException();
while (s!=null)
{
System.out.println(s.toString());
s=sqle.getNextException();
}
}
Per poter eseguire istruzioni SQL le JDBC API mettono a disposizione tre metodi
boolean execute() ResultSet executeQuery() int executeUpdate(String sql)
Il metodo execute()è il
più generico: permette di eseguire una qualsiasi operazione SQL.
Resituisce valori di tipo booleano che indicano se la query ha prodotto oppure
no ResultSet, disponibili poi per mezzo della getResultSet().
Se non si sono prodotti recordset in uscita, (come nel caso di modifiche su
una tabella), col metodo GetUpdateCount() si
ottiene il numero di righe influenzate dalla modifica. Se il risultato di tale
metodo è -1 significa che l'operazione eseguita non ha modificato nessun
valore in tabella.
ESEMPIO: modifica ad alcuni record
// Esempio di execute() di una Statement senza ResultSet: SELECT SQL
try{
DriverManager.setLogStream(null);
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
connessione=DriverManager.getConnection("jdbc:odbc:biblio");
connessione.setAutoCommit(false);
Statement st= connessione.createStatement();
sql="SELECT name FROM Authors";
risult = st.execute(sql);
numris=st.getUpdateCount();
connessione.rollback();
// execute() di una Statement con ResultSet: UPDATE SQL
sql = "UPDATE Authors SET Name = \'Pippo\' WHERE Name=\'Topolino\'";
ResultSet rs = st.getResultSet()
risult = st.execute(sql);
numris = st.getUpdateCount();
}
//sezione di gestione delle eccezioni
ESEMPIO:creazione di una tabella inviando una stringa SQL con execute()
// utilizzo di execute di una Statement senza ResultSet: *
// Creazione di una tabella
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
connessione=DriverManager.getConnection("jdbc:odbc:biblio");
Statement st= connessione.createStatement();
sql="CREATE TABLE tabella ( nome CHAR(100), anni Integer )";
risult=st.execute(sql);
numris=st.getUpdateCount();
}
//sezione di gestione delle eccezioni
catch(SQLException sqle)
{
System.out.println("ERRORE SQL "+sqle.toString());
SQLException s=sqle.getNextException();
while (s!=null)
{
System.out.println(s.toString());
s=sqle.getNextException();
}
}
Il metodo executeQuery() permette semplicemente
l'esecuzione di una istruzione SQL rappresentata dal suo argomento di tipo stringa.
Restituisce un valore singolo di tipo ResultSet. L'uso di tale metodo e’
del tutto equivalente al metodo execute().
Il metodo executeUpdate() permette di innoltrare istruzioni SQL del tipo DELETE UPDATE o INSERT che effettuano operazioni sui dati in modo da modificarne i valori.
Il valore restituito è il numero di record modificati dalla istruzione
inviata: esso corrisponde al valore ottenibile per mezzo del getUpdateCount()
dopo l'esecuzione di execute(). Non permette
di eseguire istruzioni con risposte multiple.
Esempio di executeUpdate di una Statement.
try{
DriverManager.setLogStream(null);
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
connessione=DriverManager.getConnection("jdbc:odbc:biblio");
connessione.setAutoCommit(false);
Statement st= connessione.createStatement();
String sql="UPDATE Authors SET Name = \'Topolino\' WHERE age < 30";
numris = st.executeUpdate(sql);
numris2=st.getUpdateCount();
risult = st.getResultSet();
connessione.rollback();
}
//sezione di gestione delle eccezioni
catch(SQLException sqle)
{
System.out.println("ERRORE SQL "+sqle.toString());
SQLException s=sqle.getNextException();
while (s!=null){
System.out.println(s.toString());
s=sqle.getNextException();
}
ESEMPIO: mySimpleSelect.java