Dunque, questa è la classe della connessione al db:
codice:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.Properties;
public class DBConnection {
private static Connection connection;
private static String driver;
private static String url;
private static String admin;
private static String adm_passwd;
public static void init(String fileName)
throws IOException, FileNotFoundException, ClassNotFoundException
{
Properties properties = new Properties();
FileInputStream fileInputStream = new FileInputStream(fileName);
properties.load(fileInputStream);
driver = properties.getProperty("driver");
url = properties.getProperty("url");
admin = properties.getProperty("admin");
adm_passwd = properties.getProperty("admin_passwd");
Class.forName(driver); // carica il driver
}
public static Connection getConnection() throws SQLException
{
return connection=DriverManager.getConnection(url, admin, adm_passwd);
}
public static void closeConnection() throws SQLException
{
connection.close();
}
}
E questa è la classe per testarla:
codice:
package tablemanager;
import java.sql.Connection;
import java.sql.SQLException;
import java.io.IOException;
public class DBConnectionTest
{
public static void main(String[] args)
{
String fileName = "properties.txt";
try
{
DBConnection.init(fileName);
}
catch(IOException ioEx)
{
System.err.println(">>> IO Exception! <<<\n");
System.err.println("Message: " + ioEx.getMessage());
System.err.println("Stack trace: " + ioEx.getStackTrace());
System.exit(1);
}
catch(ClassNotFoundException cnfEx)
{
System.err.println(">>> ClassNotFoundException! <<<\n");
System.err.println("Message: " + cnfEx.getMessage());
System.exit(1);
}
try
{
Connection connection = DBConnection.getConnection();
}
catch(SQLException sqlEx)
{
System.err.println(">>> SQLException! <<<\n");
System.err.println("SQLState: " + sqlEx.getSQLState());
System.err.println("Message: " + sqlEx.getMessage());
System.err.println("Error code: " + sqlEx.getErrorCode());
System.err.println("Stack trace: " + sqlEx.getStackTrace());
System.exit(1);
}
finally
{
try
{
DBConnection.closeConnection();
}
catch(SQLException sqlEx)
{
System.err.println(">>> SQLException! <<<\n");
System.err.println("SQLState: " + sqlEx.getSQLState());
System.err.println("Message: " + sqlEx.getMessage());
System.err.println("Error code: " + sqlEx.getErrorCode());
System.exit(1);
}
}
}
}
Se ho capito bene, questa classe di test non mi serve più ovviamente, quindi dovrei inserire questa parte:
Connection connection = DBConnection.getConnection();
Che di fatto crea la connessione direttamente nella classe DBConnection (più la chiamata al DbInit immagino)
Quindi, sempre se ho capito questo passaggio:
Dovrai dichiarare una variabile Connection come membro della classe, così che resti in vita per tutta la durata del programma. Ovviamente all'avvio verrà creato l'oggetto di Connection, poi non dovrai più creare altri oggetti (quindi potrebbe essere il costruttore della tua classe che stabilisce la connessione).
Quando dici "all'avvio verrà creato l'oggetto di Connection" intendi che nelle classi dove mi interessa interagire col database devo istanziare un oggetto di Connection e successivi passaggi oppure devo farlo solo nella classe che fa partire l'applicazione? Nel secondo caso, in effetti nella classe di 'partenza' per ora mi sono limitata a fare la creazione della maschera principale con i pulsanti per richiamare le altre maschere...ho sbagliato?
Sul secondo punto: per adesso io ho gestito tutto in finestre separate, credevo fosse più logico così.
Le mie finestre vengono create con queste istruzioni:
codice:
EventQueue.invokeLater(new Runnable() {
public void run() {
new StartPanel().setVisible(true);
}
});
Volevo gestire la cosa in modo che appena si va nelle finestre 'figlie' le finestre 'padri' diventino invisibili e poi ritornino visibili alla pressione di un apposito pulsante (per tornare indietro). Ecco, non sapevo come ri-renderle visibili, perché il metodo setVisible(true) si applica su oggetti, ma le finestre vengono istanziate come sopra, senza nessun 'reference'. Non so se mi sono spiegata 
Ma poi ho visto che per rendere invisibile quella corrente mi basta invocare setVisible(false).
Ho fatto così per il pulsante indietro di una finestra 'figlia', è corretto secondo te?
codice:
private void bBackActionPerformed(java.awt.event.ActionEvent evt) {
setVisible(false);
new StartPanel().setVisible(true);
}
Però mi sorge un dubbio...così facendo non sto occupando più memoria del necessario?
Cioè la finestra padre quando ho aperto la figlia è stata messa in invisibile; ma se poi dalla figlia voglio tornare al padre con la new di cui sopra non è come se stessi istanziando un nuovo oggetto? Oppure quando una finestra si mette in invisibile la memoria viene liberata?
Ma se non è così non so come fare :-/
Grazie di nuovo...gentilissimo davvero.