import java.awt.*; // Le classi per il disegno
import java.applet.Applet; // La superclasse
import java.sql.*;
public class jdbc extends Applet {
Button bottone; // Fa partire il test
TextArea textArea; // Display dei risultati
// Stringhe di configurazione, lette dalla pagina HTML
String server; // URL del server
String database; // nome del database
String user; // utrnte con cui connettersi
String password; // password dell'utente (se presente)
String table; // tabella da creare
String driver; // driver da caricare
// Mi creo una classe derivata da 'Exception' per poter
// inviare delle eccezioni mie e semplificare il test
class ExampleException extends Exception {
}
public void init () { // Metodo chiamato all'avvio dell'applet
// Legge i paramentri dal tag <Applet> (per rendere flessibile l'applet)
server = getParameter("server");
database = getParameter("database");
user = getParameter("user");
password = getParameter("password");
table = getParameter("table");
driver = getParameter("driver");
// Gestisce il default dei parametri
if (server == null) {
server="localhst";
}
if (database == null) {
database="test";
}
if (user == null) {
user="www-data";
}
if (password == null) {
password="";
}
if (table == null) {
table="numeri";
}
if (driver == null) {
driver="org.postgresql.Driver";
}
setBackground (Color.white); // Sfondo applet
setLayout (new BorderLayout ()); // Layout con le cinque posizioni
textArea = new TextArea(11, 80); // Display (11 righe di 80 caratteri)
textArea.setEditable(false); // Il display non deve essere modificabile
add ("North",textArea); // Aggiungo il display a nord dell'applet
Panel sp = new Panel (); // Un pannello per centrare il bottone
sp.setLayout (new FlowLayout ()); // Che mette i compoinenti uno in fianco all'altro
bottone = new Button ("Esegui");
sp.add (bottone); // Aggiungo il bottone al pannello - avra' la sua dimensione naturale
add ("South",sp); // Metto il pannello con il bottone a sud dell'applet
}
// Piccolo metodo di utilita' per gestire gli errori:
// - stampa il messaggio m
// - stampa il codice di errore dell'Exception
// - ritorna un'eccezione ExampleException per interrompere l'esecuzione
// del chiamante
void printException (String m, Exception e) throws ExampleException {
textArea.appendText (m + "\n");
textArea.appendText (e.toString ());
textArea.appendText ("\n");
throw (new ExampleException ());
}
// Carica la driver da utilizzare (parametro 'driver') ed
// apre una connesione al database 'db', con l'utente 'user'
// e la password 'pwd'
// Ritorna la connessione creata
Connection Conn (String db, String user, String pwd, String driver) throws ExampleException {
Connection c = null;
String dbUrl;
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
printException ("Non trovo la driver del database", e);
}
dbUrl = "jdbc:postgresql:" + db;
try {
c = DriverManager.getConnection(dbUrl, user, pwd);
} catch (SQLException e) {
printException ("Non riesco a connettermi con il database " + db,e);
}
textArea.appendText ("Connesso con il database " + db + "\n");
return c;
}
// Crea la tabella 'table' nel database, tramite la connessione 'conn'
void createTable (Connection conn, String table) throws ExampleException {
try {
Statement dbst = conn.createStatement(); // Crea uno 'statement' sulla connessione
// Usa 'executeUpdate' perche' la query non ritorna dati
dbst.executeUpdate("create table " + table + " (num integer, txt text);");
dbst.close (); // Occorre sempre chiudere quando abbiamo finito
} catch (SQLException e) {
printException ("Non riesco a creare la tabella " + table,e);
}
textArea.appendText ("Creata la tabella " + table + "\n");
}
// Popola la tabella creata ('table') con dei valori.
// Utilizza 'PreparedStatement' per riutilizzare piu' volte
// la stessa query, con valori diversi.
void fillTable (Connection conn, String table) throws ExampleException {
try {
// Crea la 'prepareStatement' con la query per l'inserimento
PreparedStatement ps = conn.prepareStatement("insert into " + table + " values (?,?)");
for(int i=1;i<=10;i++) {
// Associa i valori ai '?' della query generica
ps.setInt(1,i); // colonna "num" = i
ps.setString(2,"Numero " + String.valueOf (i)); // colonna "txt" = "Numero i"
ps.executeUpdate(); // executeUpdate perche' insert non ritorna dati
}
ps.close(); // Occorre sempre chiudere quando abbiamo finito
} catch (SQLException e) {
printException ("Non riesco a riempire la tabella " + table,e);
}
textArea.appendText ("Riempita la tabella " + table + " con 10 record\n");
}
// Esegue una query che ritorna tutta la tabella (banale)
// Estrae le righe (tuple) dal risultato ed i valori dalle tuple
void queryTable (Connection conn, String table) throws ExampleException {
try {
Statement dbst = conn.createStatement();
// Questa volta esegue una 'executeQuery' che ritorna i valori
// nel 'ResultSet'.
ResultSet rs = dbst.executeQuery("select * from " + table + ";");
if(rs!=null) {
// Adesso traversiamo l'insieme dei risultati, stampandoli.
// Dobbiamo chiamare .next() per caricare ogni riga
while(rs.next()) {
int a = rs.getInt("num"); // Recupera la colonna per nome
String b = rs.getString(2); // Recupera la colonna per indice
textArea.appendText (" num=" + a + " txt=" + b + "\n");
}
rs.close(); // Occorre sempre chiudere quando abbiamo finito
} else { // La query non ha ritornato risultati
textArea.appendText ("Nessun record nella tabella " + table + "\n");
}
dbst.close (); // Occorre sempre chiudere quando abbiamo finito
} catch (SQLException e) {
printException ("Non riesco a riempire la tabella " + table,e);
}
textArea.appendText ("Interrogata la tabella " + table + "\n");
}
// Alla fine del lavoro, elimina la tabella (era solo un esempio)
void dropTable (Connection conn, String table) throws ExampleException {
try {
Statement dbst = conn.createStatement();
dbst.executeUpdate("drop table " + table + ";");
dbst.close (); // Occorre sempre chiudere quando abbiamo finito
} catch (SQLException e) {
printException ("Non riesco ad eliminare la tabella " + table,e);
}
textArea.appendText ("Eliminata la tabella " + table + "\n");
}
// Esegue un ciclo completo di test
void dbtest () {
Connection conn;
try {
// Crea la connessione al nostro database
conn = Conn ("//" + server + "/" + database, user, password, driver);
createTable (conn, table); // crea la tabella
fillTable (conn, table); // la popola
queryTable (conn, table); // la rilegge
dropTable (conn, table); // la elimina
conn.close (); // chiude la connessione
} catch (Exception e) {
textArea.appendText ("Esempio non andato a buon fine\n");
}
}
// Gestione del bottone
public boolean action(Event event, Object arg) {
if (event.target == bottone) {
textArea.setText (""); // Il bottone cancella il testo nell'area
dbtest (); // ed esegue il test del database
}
return true;
}
}