Conexão com Banco de Dados

14 respostas
T

Quero criar uma classe cuja função seja conectar com um Banco de Dados(independente que qual seja). Vinha dúvida é a seguinte: quando instancio um objeto do tipo Connection, esse objeto estabelece uma conexão com o banco de dados, mas como saber se a conexão deu tudo certo.
Essa é a primeira dúvida. Estou iniciando em Java, e estou arriscando a conexão com o banco de dados, importei umas API’s para a conexão, mas naum sei o que cada um faz…se puderem me explicar tb…agradeço…srsrs

vlw…

abaixo segue o como está ficando meu código…só quero lembrar que o método ‘fazerConexao’ ainda naum está pronto, pois preciso justamente do esclarecimento da dúvida sobre o objeto Connection para termina-lo. A idéia é que esse método retorne um valor booleano para saber se houve ou não conexão.

Mais uma vez…vlw

//Programa que realiza a conexão do Aplicativo com o Banco de Dados especificado

/*
 +-----------------------------------------------------------------+
 |API's necessárias para a conexão com o Banco de Dados|
 +-----------------------------------------------------------------+
*/

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConectarComOBanco 
{
	private String drive;
	private String url;
	
	/*
	 +------------------------------------------------------------+
	 |Métodos que inserem valores nos atributos do objeto|
	 +------------------------------------------------------------+
	*/
    
    public void setDrive(String drive)
    {
    	this.drive = drive;    	
    }//Fim do método setDrive
    
    public void setUrl(String url)
    {
    	this.url = url;
    }//Fim do método setUrl
    
    /*
	 +-------------------------------------------------+
	 |Métodos que retornam os valores do objeto|
	 +-------------------------------------------------+
	*/
    
    public String getDrive()
    {
    	return this.drive;
    }//Fim do método getDrive
    
    public String getUrl()
    {
    	return this.url;
    }//Fim do método getDrive
    
    /*
	 +--------------------------------------------------------------------------------+
	 |Método que realiza a conexão com o Bancos de Dados especificado pelo drive e url|
	 +--------------------------------------------------------------------------------+    
    */
    
    public boolean fazerConexao(String usuario, String senha)
    {
    	//Gerencia a conexão
    	Connection connection = null;  
    	
    	//Conecta-se no banco de dados
		try
		{
			//Carrega a classe de driver do banco de dados
			Class.forName(this.drive);

			//Estabelece conexão com o banco de dados
			connection = DriverManager.getConnection(this.url,usuario,senha);
			
		}//Fim do try

		catch(SQLException sqlException)
		{
			sqlException.printStackTrace();
			System.exit(1);
		}//Fim do catch
		
		catch(ClassNotFoundException classNotFound)
		{
			classNotFound.printStackTrace();
			System.exit(1);
		}//Fim do catch
		
		finally
		{
			//Assegura que a instrução e conexão são fechadas adequadamente
			try
			{
				connection.close();
			}//Fim do try
			
   			catch(Exception exception)
   			{
				exception.printStackTrace();
				System.exit(1);
			}//Fim do catch
			
		}//Fim do Finally
			
    }//Fim do método fazer Conexao
    
}//Fim da classe ConectarComOBanco

Obrigado

14 Respostas

_Renatu

Olá

Aparentemente os códigos estão corretos sim…

Se a conexão com o banco de dados não for bem sucedida, uma SQLException será lançada, e o código do catch referente ao tratamento desta exception será executado, e depois o finally.

Portanto, se o seu método fazerConexao() nao lançar nenhuma exception, a conexão foi bem sucedida.

T

entaum naum a necessidade de esse método retorna nada naum eh?

soh para esclarecer melhor…srsrs

erickcellani

esse método deveria retornar uma conexão neh ???

se a intenção era usar a conexão em outro lugar, vc naum poderia fazer um finally fechando a conexão!.!.!

public static Connection connect() throws SQLException, IOException {

	Connection con = null;

	try {
		Class.forName(Constantes.DB_NAME);
		con	= DriverManager.getConnection(Constantes.DB_URL, Constantes.DB_LOGIN, Constantes.DB_PASS);
	} catch (ClassNotFoundException e) {
		System.out.print("\nNão foi possível estabelecer conexão.");
		e.printStackTrace();
	}
	return con;
}

assim... eu posso chamar o metodo... e terei a minha conexão...
depois que vc usar a sua conexão vc fecha!.. mas isso deve ser feito no lugar que vc usou a conexão

se preferir.. vc pode criar um metodo que fecha a conexão!

public static void closeAllConnection(Connection con) throws SQLException {
	if (con != null)
		con.close();
}

:)

leandros

Então thiago,
para melhor robustez no seu código, você pode usar o Design Pattern Factory para manipular a conexão com o banco de dados.
Procure a apostila da Caelum, fj-21, ela lhe mostrará como fazer isso de uma maneira muito produtiva, essa apostila é livre para download no site da Caelum http://www.caelum.com.br/caelum/cursos.jsp.

T

vlw leandros pela dica da apostila…
mas se liga erickcellani, pode me esclarecer uma coisa…pq vc está usando o método como ‘static’?
pode me explicar…por favor?
só para conhecimento…

vlw

erickcellani

rsrs.... só para poder chamar ele assim:

/*
	 * (non-Javadoc)
	 * @see br.com.faculdade.DAO.interfaces.ArquivosDAO#insertArquivo(java.lang.String, java.lang.String, java.lang.String, java.lang.String)
	 */
	public void insertArquivo(String userName, String arquivo, String tamanho, String endereco) throws IOException, SQLException {
		
		try {
			//Faz a conexão.
			con	= DBConnection.connect();//**************\
			//Chama a Stored Procedure.
			stmt = con.prepareCall(Constantes.PRC_ARQUIVOS_INSERT);
			stmt.setString(1, userName);
			stmt.setString(2, arquivo);
			stmt.setString(3, tamanho);
			stmt.setString(4, endereco);
			//Faz o insert.
			stmt.execute();
		} catch (SQLException e) {
			System.out.println("Erro ao inserir o arquivo: ");
			e.printStackTrace();
		} finally {
			//Fecha as conexões.
			DBConnection.closeStatement(con, stmt);
		}
	}

rsrs... sem mtos segredos!

naum preciso instanciar ele!

T

a idéia de retornar uma conexão…foi massa…naum havia pensado nisso, valew mesmo…
o único problemas que encontrei foi quando declarei o método como ‘static’, o compilador acusou o erro:

non-static variable this cannot be referenced from a static context

entaum tirei o ‘static’, e tudo deu certo…
alguém pode me explicar pq isso aconteceu…

Obs.: desculpe ser chato perguntando o pq disso ou pq daquilo, mas eh que acho importante ter o contexto das coisas na cabeça…saca?

erickcellani

mostra como ficou a sua classe…

T

assim:

//Programa que realiza a conexão do Aplicativo com o Banco de Dados especificado

/*
 +-----------------------------------------------------+
 |API's necessárias para a conexão com o Banco de Dados|
 +-----------------------------------------------------+
*/

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.io.IOException;

public class ConectarComOBanco 
{
	private String drive;
	private String url;
	
	/*
	 +---------------------------------------------------+
	 |Métodos que inserem valores nos atributos do objeto|
	 +---------------------------------------------------+
	*/
    
    public void setDrive(String drive)
    {
    	this.drive = drive;    	
    }//Fim do método setDrive
    
    public void setUrl(String url)
    {
    	this.url = url;
    }//Fim do método setUrl
    
    /*
	 +-----------------------------------------+
	 |Métodos que retornam os valores do objeto|
	 +-----------------------------------------+
	*/
    
    public String getDrive()
    {
    	return this.drive;
    }//Fim do método getDrive
    
    public String getUrl()
    {
    	return this.url;
    }//Fim do método getDrive
    
    /*
	 +--------------------------------------------------------------------------------+
	 |Método que realiza a conexão com o Bancos de Dados especificado pelo drive e url|
	 +--------------------------------------------------------------------------------+    
    */
    
    public Connection fazerConexao(String usuario, String senha) throws SQLException, IOException
    {
    	//Gerencia a conexão
    	Connection conexao = null;  
    	
    	//Conecta-se no banco de dados
		try
		{
			//Carrega a classe de driver do banco de dados
			Class.forName(this.drive);

			//Estabelece conexão com o banco de dados
			conexao = DriverManager.getConnection(this.url,usuario,senha);
			
		}//Fim do try
		
		catch(ClassNotFoundException e)
		{
			System.out.println("Não foi possível estabelecer conexão.");
 			e.printStackTrace();
		}//Fim do catch
		
		return conexao;
			
    }//Fim do método fazer Conexao
    
}//Fim da classe ConectarComOBanco
von.juliano
O erro indica que as variáveis do seu método não são estáticas. Basicamente, eu crio a classe de conexão assim (MS SQL):
public class ConnectionFactory {

	private static final String url = "jdbc:jtds:sqlserver://localhost:1433/Base";
	private static final String driver = "net.sourceforge.jtds.jdbc.Driver";
	private static final String usuario = "user";
	private static final String senha = "password";
	
	public static Connection getConnection() throws SQLException {
		try {
			Class.forName(driver);
			return DriverManager.getConnection(url, usuario, senha);
		} catch (ClassNotFoundException e) {
			throw new SQLException(e.getMessage());
		}
	}
}
erickcellani

vc naum pode usar this em métodos estáticos!

T

entaum…
tinha pensado dessa maneira…
porém…assim…jah vou conectar com um banco jah estabelecido, no caso o MySql, não queria dessa maneira…
quero que meu código se conecte com qualquer banco…distinguindo os bancos pelos seus atributos, drive …sacou?

erickcellani

http://www.guj.com.br/java.tutorial.artigo.121.1.guj

von.juliano

O que eu te passei foi só um exemplo de como seria a classe de forma estática.
A melhor maneira de fazer da forma que vc quer, está aqui:
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

Blz! :thumbup:

Criado 24 de maio de 2007
Ultima resposta 24 de mai. de 2007
Respostas 14
Participantes 5