Esempio di applicazione

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;
  }
	
}