Acessso ao Banco de Dados

9 respostas
dgouvea

Pessoal aqui pelo GUJ passam várias pessoas com problemas de conexão com o banco de dados, métodos de criar e retornar conexão, enfim.
Para ajudar essas pessoas segue o código abaixo, uma classe de conexão, com ela simplificará a conexão com uma base de dados:

import java.sql.*;

public class Acesso {

	private Connection con;

	public Acesso()
	{
		try {
			Class.forName( "org.gjt.mm.mysql.Driver" );
			con = DriverManager.getConnection( "jdbc:mysql://localhost/bd", "user", "password" );
		} catch ( Exception e ) {
			e.printStackTrace();
		}
	}

	public int executar( String sql )
	{
		try {
			PreparedStatement ps = con.prepareStatement( sql );
			return ps.executeUpdate();
		} catch ( Exception e ) {
			e.printStackTrace();
			return 0;
		}
	}
	
	public int executar( String sql, String param[] )
	{
		try {
			PreparedStatement ps = con.prepareStatement( sql );
			for ( int i = 0; i < param.length; i++ ) {
				ps.setString( i + 1, param[i] );
			}
			return ps.executeUpdate();
		} catch ( Exception e ) {
			e.printStackTrace();
			return 0;
		}
	}
	
	public ResultSet retornaConsulta( String sql )
	{
		try {
			PreparedStatement ps = con.prepareStatement( sql );
			return ps.executeQuery();
		} catch ( Exception e ) {
			e.printStackTrace();
			return null;
		}
	}
	
	public ResultSet retornaConsulta( String sql, String param[] )
	{
		try {
		 	PreparedStatement ps = con.prepareStatement( sql );
			for ( int i = 0; i < param.length; i++ ) {
				ps.setString( i + 1, param[i] );
			}
			return ps.executeQuery();
		} catch ( Exception e ) {
			e.printStackTrace();
			return null;
		}
	}

}

Para acessar o banco de dados de outra classe:

// pesquisa
String sql = "select * from tabela where campo1 = ? and campo2 = ?";
String param[] = { "valor1", "valor2" };

Acesso acesso = new Acesso();
ResultSet rs = acesso.retornaConsulta( sql, param );

if ( rs.next() ) {
    ...
}

// execução
String sql = "insert into tabela values ( ?, ?, ? )"
String param[] = { "valor1", "valor2", "valor3" };

Acesso acesso = new Acesso();
acesso.executar( sql, param );

Acho que isso pode ajudar bastante o pessoal, também ajuda a não repetir código várias vezes.

Qualquer dúvida ou sugestão é só postar !!!
:slight_smile:

9 Respostas

danieldestro

Legal, mas…

:arrow: E se der problemas na hora de cria a conexão? Você está “engolindo” a exceção ao invés de tratá-la ou repassá-la.

:arrow: E os outros métodos, ao meu ver, são inúteis, já que a Connection do JDBC já te fornece métodos padrões para executar SQL e tudo mais.

dgouvea

:arrow: Como eu poderia tratar a exceção ???

:arrow: Com os métodos eu consigo economizar linhas com o array de parametros, além de não precisar incluir linhas para abrir a conexão para cada método no qual eu irei acessar o banco de dados.

danieldestro
"dgouvea":
:arrow: Como eu poderia tratar a exceção ???

Umas idéias simples, que vc pode aperfeiçoar:
- Faça uma classe que seja Singleton.
- um método que retorne a conexão.

import java.sql.*; 

public class Acesso { 

   private Connection con; 
   private Acesso instance;

   private Acesso() {}

   public synchronized Acesso getInstance() {
     if( instance == null ) intance = new Acesso();
     return instance;
   }

   public Connection getConnection() throws SQLException, ClassNotFoundException, Exception { 
         Class.forName( "org.gjt.mm.mysql.Driver" ); 
         Connection con = DriverManager.getConnection( "jdbc:mysql://localhost/bd", "user", "password" ); 
       return con;
    }

  /// ... resto da classe
}
dgouvea

me explique o método getInstance().

Grato.

danieldestro

Neste caso que eu alterei, a classe Acesso implementa o pattern Singleton, ou seja, só pode haver uma única instância daquela classe.

Declarando o construtor como private, você assegura que ninguém poderá instanciar a classe externamente a ela.

E com o método getInstance( ) você retorna uma nova instância da classe, caso não exista alguma, ou senão retorna a corrente instância, assugurando, assim, que exista APENAS uma única instância daquela classe.

o método getInstance( ) DEVE ser static. Esquecí de por isso no código.

danieldestro

Exemplificando o uso:

Acesso acesso = Acesso.getInstance( ); Connection conn = acesso.getConnection( );

dgouvea

Legal !!! Gostei da idéia !!!

Valeu pela ajuda !!!

:smiley:

dgouvea

Só mais uma observação, não só o método getInstance como também o getConnection deve ser static não é ??

danieldestro

Não, apenas o getInstance( ) deve ser static.
Repare que o método getConnection vc está usando da própria instância (a única) da classe Acesso.

Mas depende do desenho de sua applicação.

Mas nesse caso não convém usar método estático pra pegar conexão.

Criado 14 de novembro de 2003
Ultima resposta 14 de nov. de 2003
Respostas 9
Participantes 2