Método DAO de Busca

Podem me ajudar???

Tenho uma classe DAO, para adicionar, remover, alterar e mostrar os Clientes,

Para exibir todos os clientes eu tenho o seguinte código na classe DAO

public ArrayList getList() throws SQLException
{
PreparedStatement stmt = (PreparedStatement) this.connection.prepareStatement(“select * from contatos”);
ResultSet rs = (ResultSet) stmt.executeQuery();

//retorna Array list do tipo Contato
ArrayList contatosArray = new ArrayList();

while (rs.next())
{
/Obtenho os dados do banco através do rs.getString, e atraves do objeto contato do Tipo Contato eu seto os seus parametros/

Contato contato = new Contato();
contato.setNome(rs.getString(“nome”));
contato.setEmail(rs.getString(“email”));
contato.setEndereco(rs.getString(“endereco”));
contato.setTel(rs.getString(“tel”));
contato.setBairro(rs.getString(“bairro”));
contato.setCidade(rs.getString(“cidade”));
contatosArray.add(contato);
}
rs.close();
stmt.close();
return contatosArray;

Isso é, retorna todos Contatos, a Pergunta é como eu faço para fazer uma consulta de um Contato só, por id ou por nome do cliente

Estou tentando fazer assim:

public Contato getContato(Contato consultacontato) throws SQLException
{
java.sql.PreparedStatement stmt = this.connection.prepareStatement("select id from teste1 where id like ? ");
ResultSet rs = (ResultSet) stmt.executeQuery();

Contato c = new Contato();

while (rs.next())
{
c.setNome(rs.getString(consultacontato.getNome()));
//c.setNome(stmt.setString(1, “%”+ nomeContato +"%"));
//c.setNome(rs.getString(“Danilo”));
}

return c;
}

Mas não esta dando certo!!!,

Vários problemas:

1) Por favor, formate seu código para facilitar a leitura (use o botão CODE) :smiley:

2) O parâmetro do método não precisa ser um objeto Contato, pode ser somente um int que representará o id do Contato, ficando assim:

public Contato getContato(int idContato) [...]

3) É bem possível que o seu id no banco seja numérico, então na sua query ao invés de usar LIKE você deve usar =, veja:

[...]prepareStatement("select id from teste1 where id = ?");

4) Você não setou o id na query:

stmt.setInt(1, idContato);

5) Como você quer setar o nome no objeto se na sua query você só está pegando o id? Neste caso faça “select *” ao invés de “select id”, lembrando que o * não deve ser usado, o melhor é você colocar o nome dos campos que quer obter.

Faltou o 6) A forma de se obter os valores para o objeto é:

c.setNome(rs.getString("NOME_DO_CAMPO_NA_TABELA"));

Guilherme, se voce puder me explicar algumas coisas mais, agradeço;

No entendi quando voce disse que eu não setei o id da query


public Contato getContato(int contatoid) throws SQLException
	{
		
		PreparedStatement stmt = (PreparedStatement) this.connection.prepareStatement("select id from contatos where id=?");
		ResultSet rs = (ResultSet) stmt.executeQuery();
		
		Contato c = new Contato();
		while (rs.next())
		{
			
			//stmt.setInt(1,contatoid);
			c.setId(rs.getString("id"));
		}
		
		rs.close();
		stmt.close();	
		return c;
	}

ainda não entendi essa parte,, o erro que esta apresentando é o seguinte

Exception in thread “main” java.sql.SQLException: Statement parameter 1 not set.
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1032)
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:677)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1222)
at dao.ContatoDAO.getContato(ContatoDAO.java:95)
at con_bd.Teste.main(Teste.java:91)

estou chamando o metodo da seguinte maneira

[code]

ContatoDAO dao = new ContatoDAO();
Contato contato = new Contato();
System.out.println("Entre com o id do cliente a ser procurado ");

		//ler o id do cliente a ser localizado
		int id =teclado.nextInt();
		contato = dao.getContato(id);

tuxx , basicamente o que vc teria que fazer seria apenas mudar o seu SELECT

select * from contatos where id = ?;

e usar o método stmt.setInt(1, numero_id)

sendo q esse número_id, você irá obter do usuário em determinado momento.

é coisa simples, vc só precisa alterar poucas linhas e entender o funcionamento do código…

[/]'s

è o que o Giulliano falou mesmo. Repare que a sua query está com um ? no lugar do id. Para selecionar o registro correto no banco de dados, é necessário que você “substitua” na query esta interrogação pelo valor que você quer para o id na query.

Foi isso que eu quis dizer com setar o id na query. Seu código ficaria assim:

public Contato getContato(int contatoid) throws SQLException {
    PreparedStatement stmt = (PreparedStatement) this.connection.prepareStatement("select id from contatos where id=?");
    stmt.setInt(1, contatoId)
    ResultSet rs = (ResultSet) stmt.executeQuery();

    Contato c = new Contato();
    while (rs.next()) {
        c.setId(rs.getInt("id"));
    }
    
    rs.close();
    stmt.close();	
    return c;
}

isso mesmo…

se vc esta se referindo sobre o exercício da apostila do caelum…o qual eu estava resolvendo tb…minhas classes ficaram assim…

public class TestaListaDAO {
    
    public static void main(String [] args) throws SQLException, IOException {
        ContatoDAO dao = new ContatoDAO();
        
        //Passando o ID a ser consultado, eu ainda não consegui pegar pelo console..vem um némero nada a ver
        long id = 2;
        
        List<Contato> contatos = dao.getLista(id);
        for(Contato contato:contatos){
            System.out.println("Nome : "+ contato.getNome());
            System.out.println("email : "+ contato.getEmail());
            System.out.println("endereco : "+ contato.getEndereco());
        }
        
    }
    
    
}

e o método da classe ContatoDAO é o seguinte…

 //Metodo de Pesquisa getLista recebendo parametro ID
    public List<Contato> getLista(long id) throws SQLException{
        System.out.println(id);
        PreparedStatement stmt = this.con.prepareStatement("SELECT * FROM CONTATOS WHERE ID = ?");
        stmt.setLong(1, id);
        ResultSet rs = stmt.executeQuery();
        
        List<Contato> contatos = new ArrayList<Contato>();
        while(rs.next()){
            //Criando um objeto tipo Contato
            Contato contato = new Contato();
            contato.setNome(rs.getString("NOME"));
            contato.setEmail(rs.getString("EMAIL"));
            contato.setEndereco(rs.getString("ENDERECO"));
        
            //Adicionando Valores a lista
            contatos.add(contato);
        }
        rs.close();
        stmt.close();
        return contatos;
    }

identico ao anterior mas mudando a identidade, ou seja, adicionando um parâmetro a mais…

[/]'s…

Muito Obrigado a Voces!!!

Agora eu comecei a entender como funciona o PreparedStatement

Valeu Kras

Agora você me deve um chopp (e pro Giulliano tb) :smiley: :smiley: :smiley: :smiley: :smiley:

hehehe