Parâmetros por referência: Connection

2 respostas
brunoneiva

Salve galera!

Tô com uma duvida intrigante aqui. Tenho uma classe que me conecto através dela ao banco de dados da minha aplicação (ACM_ConnectDB), esta classe contém um método estático que é onde eu faço a conexão (connection).

Pois bem, na classe da GUI a qual chamo a conexão com o banco - GUIRainfallGauges - tenho também um método chamado connection e é ai que chamo ACM_ConnectDB.

Segue o método da classe GUIRainfallGauges:

public class GUIRainfallGauges extends JFrame implements TreeSelectionListener, ActionListener{ 
	private boolean logged;
	private String[] userAndPass;
	private Connection con;
	private Statement stm;
        private BEER beer;

	private JMenuItem menuLogin;
	private JMenuItem menuLogout;


(...)


	private void connection() {
		if(this.logged==false){
			this.con = null;
			this.stm = null;
			
			GUI_LoginDataBase login = new GUI_LoginDataBase(this);
			this.userAndPass = login.login(); 
			
			ACM_ConnectDB.connection(this.con, this.stm, this.beer,this,this.userAndPass);

			this.logged = this.beer.getLogged();
			if(this.logged==true){
				this.menuLogin.setEnabled(false);
				this.menuLogout.setEnabled(true);
			}
		}
	}

Coloquei as variáveis que estão no parâmetro de connection como globais pelo motivo de que o usuário ficará logado no sistema até que queira deslogar. Portanto em um momento específico darei um close() em con e stm. A variável userAndPass é um array de String onde está armazenado o login e a senha do usuário.

Segue minha classe ACM_ConnectDB:
public class ACM_ConnectDB {

	public static void connection(Connection con, Statement stm, BEER beer, JFrame gui, String[] userAndPass){
		try{
			Class.forName("org.postgresql.Driver");
			con = (Connection) DriverManager.getConnection(
					"jdbc:postgresql://localhost:5432/beerdb", userAndPass[0], userAndPass[1]); //blz, Connection é uma interface e isso retorna pra esta variavel um objeto que implementa Connection
			stm = ((java.sql.Connection) con).createStatement();//idem pra Statement

			beer.setLogged(userAndPass);
		}catch(PSQLException e){
			beer.setLogged(false);
			String msg = "The system couldn't be connected with the data base. \n Contact data base administrator";
			JOptionPane.showMessageDialog(gui, msg, "Error", JOptionPane.ERROR_MESSAGE);
		}catch(ClassNotFoundException e){
			e.printStackTrace();
		}catch(SQLException e){
			e.printStackTrace();
		}
	}
	
	public static void close(Connection con, Statement stm){
		try {
			con.close();
			stm.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
}

Como percebe-se, passei os parâmetros con e stm pelo motivo de que quero utilizá-los posteriormente para que na mesma classe da GUI ou outra qualquer, eu possa chamar o método close de ACM_ConnectDB passando os mesmos (já que são globais), porém minha dificuldade se encontra no fato de essas variáveis não tem seus valores modificados como eu esperaria, estranhei pois eu achava que eles apontavam para a mesma referência, o que sei que é. Quando imprimo seus valores na classe ACM_ConnectDB percebo que não são null, mas quando retorna pra a GUI, retorna null. =/

Tem alguma forma de fazer o que eu quero sem ser essa?

Caso queiram mais detalhes posso fazê-lo. Espero ter sido claro!

Abraços

2 Respostas

brunoneiva

up =)

brunoneiva

Beleza, beleza. Um amigo meu tirou minha dúvida. Faltou a camada de negócio, para leigos como eu que tenham a mesma dúvida e queiram esclarecer, fale cmgo =D

[]'s

Criado 12 de outubro de 2007
Ultima resposta 15 de out. de 2007
Respostas 2
Participantes 1