GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Classe para consulta em Banco de Dados


#1

Oi Pessoal,
Tenho uma dúvida simples, porém pesquisei bastante aqui no fórum e não encontrei a solução.....

Criei uma classe (abaixo) para fazer a conexão e pesquisa no banco de dados MySQL. Minha dúvida é como faze-la funcionar de outra classe.
Por exemplo, tenho uma classe de cadastro de usuários, e nela eu quero chamar esta classe de consulta, porém, deixar os dados consultados disponíveis para trabalhar na minha classe de cadastro de usuários.

Alguém por favor pode me ajudar?


ARQUIVO COM A CLASSE DE DB


import com.mysql.jdbc.Connection;
import java.sql.*;
import javax.swing.JOptionPane;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MOD00000 {

public Connection conectar(){
// base de dados é "test"
String url = "jdbc:mysql://127.0.0.1/cont";
String usuario = "root";
String senha = "";

try{
  Class.forName("com.mysql.jdbc.Driver").newInstance();
  Connection conn = (Connection) DriverManager.getConnection(url, usuario, senha);
  return conn;
}
catch(SQLException ex){
  System.out.println("SQLException: " + ex.getMessage());
  System.out.println("SQLState: " + ex.getSQLState());
  System.out.println("VendorError: " + ex.getErrorCode());
  return null;
}
catch(Exception e){
  System.out.println("Problemas ao tentar conectar com o banco de dados: " + e);
  return null;
}

}

public boolean Executa_Query(String msql) throws SQLException {
    try {
        Connection conn = new MOD00000().conectar();
        PreparedStatement pst = conn.prepareStatement(msql);
        pst.executeQuery();
        return true;
    }
    catch (SQLException s) {
        if (s.getErrorCode() == 2627) {
            JOptionPane.showMessageDialog(null, "Chave primária duplicada!", "ERRO", 0);
            return false;
        }
        else {
            JOptionPane.showMessageDialog(null, "Erro inexperado.\n Entre em contato com o desenvolvedor e informe este número: " + s.getMessage(), "ERRO", 0);
            return false;
        }
    }
    catch(Exception e) {
        e.printStackTrace();
        return false;
    }
}

public static void main(String args[]) throws SQLException{
new MOD00000().Executa_Query("SELECT * FROM TESTE");
}

}

FIM DO ARQUIVO


#2

Você já deu uma olhada no material disponibilizado pela caelum do FJ-21?
[]s


#3

vc tem que instanciar a classe conexão, assim.

public class Cadastro {

private Connection connection;

public Cadastro() throws SQLException{

    this.connection=(Connection)Conexao.getConnection();

}

#4

Bem faça uma classe so para a conexao com uma função que retorne uma variavel do tipo Connection, ai faça uma classe ConsultaUsuários com uma função que receba uma conexao como parametro, nesse método execute a query q retorne um arraylist do tipo Usuario, ai na classe cadastro Usuário vc instancia esses objetos e ai vc pode chamar o metodo getUsuarios por exemplos que é o metodo que executa a query e retorna um arraylist e vc terá as informações que deseja para trabalar na classe.
É so usar o conceito de orientação a objeto.


#5

Oi Marcos,
Eu sou novo em Java e também em POO....
Como eu faço para retornar um arraylist através de uma instância de minha classe?

Acho que esta será a solução para o que eu preciso.....


#6

bem vamos a um exemplo entao do que te falei antes

primeiro a classe para abrir a conexao com o banco:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Conexao {
	public static String status = "";
    public Connection obterConexao() {
    Connection con = null;
    try {
       Class.forName("com.mysql.jdbc.Driver").newInstance();
       String url = "jdbc:mysql://127.0.0.1/sub_handebol?user=root&password=root";
       con = DriverManager.getConnection(url);
       status = "Conexão Aberta";
      }catch (SQLException e){
       status = e.getMessage();
      }catch (ClassNotFoundException e){
       status = e.getMessage();
      }catch (Exception e ){
       status = e.getMessage();
      }
      return con;
  }
}

depois uma classe com um metodo que executa uma query e retorna um arraylist:

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import br.com.teclogica.Servicos.Conexao;
import br.com.teclogica.model.Conta;
import br.com.teclogica.model.Item;
import br.com.teclogica.model.ItemPedido;
import br.com.teclogica.model.Pedido;
import br.com.teclogica.model.Produto;
import br.com.teclogica.model.Usuario;
public class ConsultaUsuario{
	public List<Usuario> getUsuarios() throws SQLException {
                                Conexao con = new Conexao();
		List<Usuario> listaUsuarios = new ArrayList<Usuario>();
		Usuario usuario;
		Statement st = con.obterConexao().createStatement();
		ResultSet rs = st.executeQuery("select * from usuario");
		while (rs.next()) {
			usuario = new Usuario();
			usuario.setLogin(rs.getString("login"));
			usuario.setSenha(rs.getString("senha"));
			listaUsuarios.add(usuario);
		}
		return listaUsuarios;
	}
}

ai na classe cadastroUsuario vc pode fazer o seguinte:

ConsultaUsuario usuarios = new ConsultaUsuario();
ArrayList<Usuario> listaUsuarios = usuarios.getUsuarios();

ai vc tem um arraylist com todos os usuarios ai claro vc tera um objeto Usuario com nome, idade, ... e metodos para acessar esses atributos (gets e sets).


#7

Oi Marcos e amigos do Fórum,
Peguei diversas informações pelo Fórum e criei uma classe para pesquisas genéricas do sistema (o que o amigo Marcos indicou, se entendi, teria que fazer novas classes para cada pesquisa....).
Porém, quando exibo os dados que gravei no ArrayList, aparece tudo em uma unica linha..... Coisa de principiante...
Algupem pode por favor me ajudar como faço para gravar corretamente os dados no Array para que depois eu possa trabalhar estes dados (como exemplo alimentar um JTable)....

import com.mysql.jdbc.Connection;
import java.sql.*;
import javax.swing.JOptionPane;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class MOD00000 {
    private static boolean result;
 /**
  * Função para conectar ao Banco de Dados
  */
  public Connection conectar(){
    // base de dados é "test"
    String url = "jdbc:mysql://127.0.0.1/cont";
    String usuario = "root";
    String senha = "";
    try{
      Class.forName("com.mysql.jdbc.Driver").newInstance();
      Connection conn = (Connection) DriverManager.getConnection(url, usuario, senha);
      return conn;
    }
    catch(SQLException ex){
      System.out.println("SQLException: " + ex.getMessage());
      System.out.println("SQLState: " + ex.getSQLState());
      System.out.println("VendorError: " + ex.getErrorCode());
      return null;
    }
    catch(Exception e){
      System.out.println("Problemas ao tentar conectar com o banco de dados: " + e);
      return null;
    }
  }
    public ArrayList Executa_Query(String msql) throws SQLException {
        ArrayList query = new ArrayList();
        try {
            Connection conn = new MOD00000().conectar();
            PreparedStatement pst = conn.prepareStatement(msql);
            ResultSet rs = pst.executeQuery();
            while (rs.next()) {
                String txt_nome = rs.getString("NOME");
                String txt_apelido = rs.getString("APELIDO");
                query.add(txt_nome);
                query.add(txt_apelido);
                System.out.println(txt_nome + " - " + txt_apelido);
            }
            pst.close();            
            return query;
        }
        catch (SQLException s) {
            if (s.getErrorCode() == 2627) {
                JOptionPane.showMessageDialog(null, "Chave primária duplicada!", "ERRO", 0);
                return query;
            }
            else {
                JOptionPane.showMessageDialog(null, "Erro inexperado.\n Entre em contato com o desenvolvedor e informe este número: " + s.getMessage(), "ERRO", 0);
                return query;
            }
        }
        catch(Exception e) {
            e.printStackTrace();
            return query;
        }
    }
  // FEITO SOMENTE PARA TESTAR A CLASSE
  public static void main(String args[]) throws SQLException{
    ArrayList resultado = new MOD00000().Executa_Query("SELECT * FROM funcionarios");
    JOptionPane.showMessageDialog(this, resultado);
  }
}

#8

Up!


#9

o certo seria vc gravar um objeto no arraylist, tipo digamos um objeto do tipo usuário, vc retorna do banco as informações, nome, telefone, endereço... sei la os campos que vc tem e entao vc popula um objeto do tipo Usuario ai entao vc adiciona esse objeto no arraylist e retorna esse arraylist, no codigo que tinha te passado eu fazia isso:

while (rs.next()) {   
            usuario = new Usuario();   
            usuario.setLogin(rs.getString("login"));   
            usuario.setSenha(rs.getString("senha"));   
            listaUsuarios.add(usuario);   
        }

ali primeiro instancio um objeto do tipo Usuario ai populo ele com os campoos vindo do banco e então adiciono ele no arraylist, ai qdo vc percorrer o array depois vc vai retorna um objeto de usuario e ai vc pode acessar seus métodos e etc.


#10