Utilizando conexao criada (Connection conn)

Olá,

Eu tenho a minha classe principal que eh chamada quando o programa eh criado…
Ela cria a classe Conexao().

Pois bem, nessa classe principal, a MiniAgenda() tem a variavel Connection conn, e eu crio a classe conexao assim

Conexao conexao = new Conexao(conn);

dentro da classe conexao:

public class Conexao { public Conexao(Connection conn) { //...codigo } }
Nao tenho certeza se eh assim que eu aproveito a Connection criada… caso eu esteja errado, me corrijam por favor.

Minha duvida nao estah nessa parte, mas sim, como eu faço para reaproveitar a conexao com o banco de dados jah q eu criei ela na classe principal e o objeto conexao() jah estah instanciado.
Por exemplo, eu tenho a classe FormAgenda que eh outra classe… dentro da classe, como eu vou aproveitar o objeto criado na classe principal MiniAgenda, pois jah foi instanciado o objeto…
Eu tenho que criar de novo o objeto conexao dentro da classe FormAgenda?
Resumindo, como eu compartilho essa conexao com outras classes? No momento que as crios? Como usarei essa conexao dentro da classe?

eu costumo criar apenas uma classe de conexão e importa-lá onde eu vou precisar dela…

:wink:

oq tu precisa é de um pool de conexão… ou, se preferir, pode ter um singleton q contenha a tua connection statica…

eu estou fazendo uma agenda virtual usando o padrão MVC
a parte de acesso ao banco de dados esta pronta:

package controller;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

import model.Contato;

public class ConexaoDAO {
	
	private Connection conn;
	private Statement stm;
	private ResultSet rs;
	private static final String url = "jdbc:hsqldb:file:./AgendaDB";
	private static final String driverName = "org.hsqldb.jdbcDriver";
	private static ConexaoDAO instancia = null;
	
	
	public static ConexaoDAO createConexaoDAO() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
		if (instancia == null)
			instancia = new ConexaoDAO();
		return instancia;
	}

	private ConexaoDAO() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException
	{
		Class.forName(driverName).newInstance();
		conn = DriverManager.getConnection(url, "sa", "");
		stm = conn.createStatement();
	}
	
	public Vector<Contato> listaContatos() throws SQLException
	{	rs = stm.executeQuery("select * from contatos order by nome");
		Vector<Contato> v = new Vector<Contato>();
		while(rs.next())
		{	
			Contato c = new Contato();
			c.setNome(rs.getString("nome"));
			c.setTelefone(rs.getString("telefone"));
			c.setAnotacoes(rs.getString("anotacoes"));
			c.setEmail(rs.getString("email"));
			c.setEndereco(rs.getString("endereco"));
			
			v.add(c);
			
		
		}
		return v;
			}
	
	public void insereContato(Contato c) throws SQLException
	{
	 	String sql = "insert into contatos (nome, telefone, endereco, email, anotacoes) values \n"+
	 	"'"+c.getNome()+"', '"+c.getTelefone()+"', '"+c.getEndereco()
	 	+"', '"+c.getEmail()+"', "+c.getAnotacoes()+"'";
	 	
	 	stm.executeUpdate(sql);
	}
	
	public int apagaContato(Contato c) throws SQLException
	{
		String sql = "delete from contatos where nome = '"+c.getNome()+"'";
		
		return stm.executeUpdate(sql);
	}
	
	public int alteraContato(Contato c, String nome) throws SQLException{
		
		String sql = "update contatos set \n"+
		"nome = '"+c.getNome()+"', \n"+
		"telefone = '"+c.getTelefone()+"', \n"+
		"email = '"+c.getEmail()+"', \n"+
		"endereco = '"+c.getEndereco()+"', \n"+
		"anotacoes = '"+c.getAnotacoes()+"', \n"+
		"where nome = '"+nome+"'";
	
		return stm.executeUpdate(sql);
	}
	
	public void finalize() throws SQLException 
	{	stm.executeUpdate("SHUTDOWN");
		conn.commit();
		if (rs != null){
		rs.close();
	    rs = null;}
	    stm.close();
	    stm = null;
		conn.close();
	    conn = null;
		
	}

}

sacou o esquema que eu estou usando? :wink:

Microófilo,

uma coisa, separe a Conexao das Regras de Negocio… faça um DAO para isso… =)

fica mais simples fácil, e reaproveitável!
=)

Sparch: tu saiu do messenger ontem a noite home =\ a reuniao terminou as 22:20 e tu num tava mais… amanha a noite to no msn, tenho umas dicas para seu problema… olhei ele meio por cima agora, pq tenho que ir pra casa ainda…

Abraços!

pois é, eu ia comentar… hehehe, a tua classe não implementa o padrão DAO… e outra, sendo ela uma classe de acesso ao banco, oq ela esta fazendo no pacote controller? :roll: … de uma lida aqui, ótimo conteúdo:

http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

Fala Sparch,

bom, eu não entendi muito bem o que vc falou… mas vamos direto a definição do qeu deve ser feito, com o seu caso.

Primeiro voce cria uma Classe chamada Conexao. Nessa classe voce tem a implementação ddo seu jdbc (no construtor), e faz um método que retorne uma Connection, por exemplo essa classe pode ser uma SingleTon (Design Pattern), mas em todo caso, faça uma classe qeu faça uma conexão e retorne um objeto Connection, ou Statement e sempre que você precisar vc cria um objeto dessa classe. digamos:

vc está dentro da classe CriarAlgumCoisa,
dai vc faz assim:
Conexao con = new Conexao(); //agora a sua connection foi criada
Connection conn = con.getConnection();

entendeu mais ou menos a idéia?!

Bom, qqr coisa posta ai, ou msn!

abraços!

fala galera, blz?
jujo tem como explica o q eu coloco nessa classe conexao
fiquei meio confuso
sou iniciante, bem iniciante
valeu

Preciso de Ajuda !

Como implemento o método que retorne uma Connection ?!

=(

Obrigada …

[quote=“Stefanin”]Preciso de Ajuda !

Como implemento o método que retorne uma Connection ?!

=(

Obrigada …[/quote]

é uma aplicação web? é uma aplicação onde se tem mais de um usuário? faça isso com um datasource caso esteja usando um servidor de aplicação (tanto web quanto j2ee)

Duplicou o post… a resposta está ali embaixo…

:oops: :oops:

Olá, resolvi meu problema dessa forma: (a autoridade em java Jujo disse que é uma boa implementação… entao tá ae… ele me ajudou também)

Classe Conexao:

[code]/*

  • Conexao.java
  • Onde tiver blue é o host, macog é o banco de dados (soh para info)
  • Created on 15 de Janeiro de 2005, 01:36
    */

import java.sql.*;
import javax.swing.JOptionPane;

/**
*

  • @author macog
    */
    public class Conexao {

    private Connection conn;

    /** Creates a new instance of Conexao */
    public Conexao() {

     try { //inicio bloco seguro
         Class.forName("com.mysql.jdbc.Driver").newInstance();
         //Class.forName("org.gjt.mm.mysql.Driver").newInstance();
     }
     catch (Exception e) {
         JOptionPane.showMessageDialog(null, "Não foi possivel encontrar classe para conexão.\n\nMensagem de erro: "+ e.getMessage(), "Erro", 0 );            
     } //final bloco seguro
    

    }

    /**

    • Método sobrecarredao usado para conexão com o banco de dados, é o método que irá
    • conectar-se com o banco de dados
      */
      public void setConn() {
      try {
      Usuario usuario = new Usuario();
      conn = DriverManager.getConnection("jdbc:mysql://blue/macog?user="+ usuario.getUsuario() +"&password="+ usuario.getSenha());
      //JOptionPane.showMessageDialog(null, "Conexão estabelecida.", "Conexão", 1);
      }
      catch (SQLException e) {
      JOptionPane.showMessageDialog(null, "Não foi possível conectar-se ao banco de dados.\n\nMensagem: "+ e.getMessage(), "Erro", 0);
      conn = null;
      }
      } //final método setConn();

    /**

    • Método sobrecarredao usado para conexão com o banco de dados, é o método que irá
    • conectar-se com o banco de dados
      */
      public void setConn(String usuario, String senha) {
      try {
      conn = DriverManager.getConnection("jdbc:mysql://blue/macog?user="+ usuario +"&password="+ senha);
      //JOptionPane.showMessageDialog(null, "Conexão estabelecida.", "Conexão", 1);
      }
      catch (SQLException e) {
      JOptionPane.showMessageDialog(null, "Não foi possível conectar-se ao banco de dados.\n\nMensagem: "+ e.getMessage(), "Erro", 0);
      conn = null;
      }
      } //final método setConn(usuario, senha);

    /**

    • Método sobrecarredao usado para conexão com o banco de dados, é o método que irá
    • conectar-se com o banco de dados
      */
      public void setConn(String host, String usuario, String senha) {
      try {
      conn = DriverManager.getConnection("jdbc:mysql://"+ host +"/macog?user="+ usuario +"&password="+ senha);
      //JOptionPane.showMessageDialog(null, "Conexão estabelecida.", "Conexão", 1);
      }
      catch (SQLException e) {
      JOptionPane.showMessageDialog(null, "Não foi possível conectar-se ao banco de dados.\n\nMensagem: "+ e.getMessage(), "Erro", 0);
      conn = null;
      }
      } //final método setConn(host, usuario, senha);

    /**

    • Método sobrecarredao usado para conexão com o banco de dados, é o método que irá
    • conectar-se com o banco de dados
      */
      public void setConn(String host, String db, String usuario, String senha) {
      try {
      conn = DriverManager.getConnection("jdbc:mysql://"+ host +"/"+ db +"?user="+ usuario +"&password="+ senha);
      //JOptionPane.showMessageDialog(null, "Conexão estabelecida.", "Conexão", 1);
      }
      catch (SQLException e) {
      JOptionPane.showMessageDialog(null, "Não foi possível conectar-se ao banco de dados.\n\nMensagem: "+ e.getMessage(), "Erro", 0);
      conn = null;
      }
      } //final método setConn(host, db, usuario, senha);

    /**

    • Método responsável por desconectar-se da conexão criada.
      */
      public void Desconectar() {
      try {
      conn.close();
      }
      catch (Exception e) {
      JOptionPane.showMessageDialog(null, "Ocorreram erro ao fechar conexão.\n\nMensagem: "+ e.getMessage(), "Erro", 0);
      conn = null;
      }
      }

    /**

    • Médoto GET para retornar a conexão criada
      */
      public Connection getConn() {
      return conn;
      }
      }
      [/code]

Classe Usuario:

[code]/*

  • Usuario.java
  • Created on 15 de Janeiro de 2005, 23:28
    */

import javax.swing.JOptionPane;

/**
*

  • @author macog
    */
    public class Usuario {

    private static String Usuario;
    private static String Senha;

    /** Creates a new instance of Usuario */
    public Usuario() {
    }

    /**

    • Início metodos SETs que definirão usuário e senha
      */

    public static void setUsuario(String usuario) {
    if (usuario.length() > 0) {
    Usuario = usuario;
    }
    else {
    JOptionPane.showMessageDialog(null, "Usuário não pode ser nulo.", "Erro", 0);
    Usuario = null;
    }
    } //final método setUsuario();

    public static void setSenha(String senha) {
    if (senha.length() > 0) {
    Senha = senha;
    }
    else {
    JOptionPane.showMessageDialog(null, "Senha não pode ser nula", "Erro", 0);
    Senha = null;
    }
    } //final método setSenha();

    /**

    • Métodos GETs utilizados para recuperar as variáveis estáticas,
    • no caso Usuario e Senha para conexão com banco de dados;
      */

    public static String getUsuario() {
    return Usuario;
    } //final método getUsuario();

    public static String getSenha() {
    return Senha;
    } //final método getSenha();
    }
    [/code]

Para utilizar a classe conexao fazer assim:
Primeiro voce precisa definir um local onde será informado o login e a senha, eu fiz assim; criei uma classe que contem 2 campos para colocar login e senha respectivamente, e o action do botão login é esse:

[code] private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
/**
* Instanciar classe Usuario e definir usuario e senha…
*/
Usuario usuario = new Usuario();
usuario.setUsuario(editUsuario.getText());
usuario.setSenha(editSenha.getText());

    //conectar com banco de dados utilizando as informações
    //contidas na classe Usuario
    Connection con;
    Conexao conexao = new Conexao();
    conexao.setConn("blue", "macog", usuario.getUsuario(), usuario.getSenha());
    con = conexao.getConn();
    
    //se a conexão for estabelecida com sucesso, fechar a janela de conexão
    try {
        if (!con.isClosed()) {
            this.setVisible(false);
        }
    }
    catch (Exception e ) {
        //erro, ignorar porque a janela continurá aberta...
    }
}

[/code]

E para reutilizar os dados informados nessa tela de login, é soh fazer assim, por exemplo:

[code] public class FormAgenda extends javax.swing.JInternalFrame {

private Connection con; //variavel con para manipulação da conexão
Conexao conexao = new Conexao();
private Statement stm;[/code]

Para reutilizar a conexão, ao utilizar o método que instancia a classe que utilizara a conexão voce faz assim:

[code] public FormAgenda() {

    conexao.setConn();
    con = conexao.getConn();[/code]

Ae fica fácil utilizar a conexão, por exemplo, esse codigo aqui é chamado para salvar os dados alterados para o banco, é acionado ao apertar o botão Salvar:

private void btnSalvarActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: String Query = new String(); Query = "INSERT INTO miniagenda VALUES (NULL, "+ "'"+ editNome.getText() +"', '"+ editTelefone.getText() +"')"; try { //reutilizando a con (Connection) criada acima com a conexão //definida pela classe Conexao e recuperada pelo metodo getConn() stm = con.createStatement(); stm.executeUpdate(Query); //con.commit(); -> auto-commit = true JOptionPane.showMessageDialog(null, "O registro foi incluido com êxito.", "Informação", 1); editNome.setText(""); editTelefone.setText(""); } catch (SQLException e) { JOptionPane.showMessageDialog(null, "Ocorreram erros.\n\nMensagem: "+ e.getMessage(), "Erro", 0); } }

É isso, espero ter ajudado… qualquer duvida eu ajudo sem problemas, é soh postar abaixo.