Acessso ao Banco de Dados

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:

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.

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

Umas idéias simples, que vc pode aperfeiçoar:

  • Faça uma classe que seja Singleton.
  • um método que retorne a conexão.

[code]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
}[/code]

me explique o método getInstance().

Grato.

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.

Exemplificando o uso:

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

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

Valeu pela ajuda !!!

:smiley:

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

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.