To summarize, in an applet, it is good programming practice to do some things you would not need to do in a standalone application:Put your JDBC code in a separate thread 
Display status messages on the screen during during any delays, such as when a database connection is taking a long time 
Display error messages on the screen instead of printing them to System.out or System.err . 
/**
 * This is a demonstration JDBC applet.
 * It displays some simple standard output from the Coffee database.
 */import java.applet.Applet;
import java.awt.Graphics;
import java.util.Vector;
import java.sql.*;public class OutputApplet extends Applet implements Runnable {
    private Thread worker;
    private Vector queryResults;
    private String message = "Initializing";    public synchronized void start() {
// Every time "start" is called we create a worker thread to
// re-evaluate the database query.
if (worker == null) {
    message = "Connecting to database";
            worker = new Thread(this);
    worker.start();
}
    }    /**
     * The "run" method is called from the worker thread.  Notice that
     * because this method is doing potentially slow databases accesses
     * we avoid making it a synchronized method.
     */    public void run() {
String url = "jdbc:mySubprotocol:myDataSource";
String query = "select COF_NAME, PRICE from COFFEES";

try {
    Class.forName("myDriver.ClassName");
} catch(Exception ex) {
    setError("Can't find Database driver class: " + ex);
    return;
} try {
    Vector results = new Vector();
    Connection con = DriverManager.getConnection(url,
"myLogin", "myPassword");
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery(query);
    while (rs.next()) {
String s = rs.getString("COF_NAME");
float f = rs.getFloat("PRICE");
String text = s + "     " + f;
results.addElement(text);
    }     stmt.close();
    con.close();     setResults(results); } catch(SQLException ex) {
    setError("SQLException: " + ex);
}
    }    /**
     * The "paint" method is called by AWT when it wants us to
     * display our current state on the screen.
     */    public synchronized void paint(Graphics g) {
// If there are no results available, display the current message.
if (queryResults == null) {
    g.drawString(message, 5, 50);
    return;
} // Display the results.
g.drawString("Prices of coffee per pound:  ", 5, 10);
int y = 30;
java.util.Enumeration enum = queryResults.elements();
while (enum.hasMoreElements()) {
    String text = (String)enum.nextElement();
    g.drawString(text, 5, y);
    y = y + 15;
}
    }    /**
     * This private method is used to record an error message for
     * later display.
     */    private synchronized void setError(String mess) {
queryResults = null;
message = mess;
worker = null;
// And ask AWT to repaint this applet.
repaint();
    }    /**
     * This private method is used to record the results of a query, for
     * later display.
     */    private synchronized void setResults(Vector results) {
queryResults = results;
worker = null;
// And ask AWT to repaint this applet.
repaint();
    }
}