Utilizando conexao criada (Connection conn)

11 respostas
S

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?

11 Respostas

G

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

:wink:

M

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

R

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:

J

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!

M

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

J

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!

C

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

S

Preciso de Ajuda !

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

=(

Obrigada …

M

“Stefanin”:
Preciso de Ajuda !

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

=(

Obrigada …

é 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)

S

Duplicou o post… a resposta está ali embaixo…

:oops: :oops:

S

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:

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

Classe Usuario:

/*
 * 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();
}

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:

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

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

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;

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

public FormAgenda() {
        

        conexao.setConn();
        con = conexao.getConn();

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.

Criado 12 de janeiro de 2005
Ultima resposta 18 de jan. de 2005
Respostas 11
Participantes 7