Consulta com parametros em JAVA

Galera, sou iniciante em java, fiz um curso na Caelum e agora que terminei estou praticando os exercícios e fazendo os desafios, também estou alterando o funcionamento de um monte de coisa que tem nos exercícios para treinar e aprender mais coisas.

O problema é o seguinte, tenho uma classe ContatoDAO que possui um metodo para cadastro e para consulta, ambos funcionam perfeitamente, porem os metodos e exemplos que estão nas apostila (pelo menos nessa primeira só no IDE) não são interativos, ou seja, o cadastro é feito digitando os dados diretamente na classe e a consulta da mesma forma, posso até fazer um where, mas dentro do metodo.

O que eu queria fazer era um cadastro personalizado onde fosse digitando os dados manualmente até não querer cadastrar mais, depois de algumas pesquisas aqui no GUJ e também em outros sites consegui fazer, não sei se foi a melhor solução, mas está funcionando perfeitamente. (vou colocar o código abaixo).

Agora estou tentando fazer a consulta, usando parametros, tipo, quando eu rodar o programa ele deve pedir para o usuário digitar o ID ou Nome, ou algum outro dado do contato, e ao digitar essa informação buscar no banco de dados, os dados do contato correspondente, já procurei bastante mas ainda não consegui achar uma forma de fazer isso.

Ficarei muito agradecido se alguem puder me ensinar, ou me indicar um tutorial que ensine, estou muito interessado em aprender Java, e também vou começar a estudar Hibernate (já que muita gente usa e fala muito bem dele) mas por enquanto queria apenas conseguir uma solução para esse problema.

Desde já obrigado.

Abaixo os códigos que já fiz.

ContatoDAO (funcionando perfeitamente, igual ao da apostila com algumas modificações)

[code]public class ContatoDAO {

//conexão com o banco de dados
private Connection connection;

public ContatoDAO() {
	this.connection = new ConnectionFactory().getConnection();
}

//Cadastro 
public void adiciona(Contato contato) {
	String sql = "insert into contatos (nome, email, endereco, dataNascimento) values (?,?,?,?)";
	
	try {
		//prepared statemente para inserção
		PreparedStatement stmt = connection.prepareStatement(sql);
		
		//seta os valores
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
		
		//executa
		stmt.execute();
		stmt.close();
		
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

//Consulta Simples
public List<Contato> getLista() {
	
	try {
		List<Contato> contatos = new ArrayList<Contato>();
		PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");
		ResultSet rs = stmt.executeQuery();
		
		while (rs.next()) {
			//Criando o objeto Contato
			Contato contato = new Contato();
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setEndereco(rs.getString("endereco"));
			
			//Montando a data através do Calendar
			Calendar data = Calendar.getInstance();
			data.setTime(rs.getDate("dataNascimento"));
			contato.setDataNascimento(data);
			
			//Adicionando o objeto a lista
			contatos.add(contato);
		}
		rs.close();
		stmt.close();
		return contatos;
	} catch (SQLException e) {
		throw new RuntimeException(e);
	}
}

}[/code]

Classe Inserir padrão da apostila (com os dados digitados direto no metodo e sem a data de nascimento certa)

[code]public class TestaInsere {

public static void main(String[] args) {
	
	//pronto para gravar
	Contato contato = new Contato();
	contato.setNome("joão");
	contato.setEmail("joao@gmail.com");
	contato.setEndereco("R. qualquer num 45");
	contato.setDataNascimento(Calendar.getInstance());
	
	//Gravar nossa conexao
	ContatoDAO dao = new ContatoDAO();
	
	//método elegante
	dao.adiciona(contato);
	
	System.out.println("Gravado!");
	
}

}[/code]

Classe Inserir que eu criei, para digitar os dados manualmente quando o programa executar:

[code]public class TesteInserirManualmente {

public static void main(String[] args) throws IOException, ParseException {
	
	BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
	
	Contato contato = new Contato();		
	String dataRecebida;
	Calendar dataNascimento = null;		
	//Controle do while
	String controle = "sim";
	
	while (!controle.equalsIgnoreCase("não")) {	
		
		System.out.print("Digite o Nome: ");
		contato.setNome(reader.readLine());
		System.out.print("Digite o Email: ");
		contato.setEmail(reader.readLine());
		System.out.print("Digite o Endereço: ");
		contato.setEndereco(reader.readLine());	
		
		//Lendo a data em texto
		System.out.print("Digite a Data: ");
		dataRecebida = reader.readLine();		
		//Convertendo para Date
		Date date = new SimpleDateFormat("dd/MM/yyyy").parse(dataRecebida);		
		//Recebendo a data do tipo Date no Calendar
		dataNascimento = Calendar.getInstance();
		dataNascimento.setTime(date);		
		contato.setDataNascimento(dataNascimento);
	    
	    System.out.println("Você digitou o nome: " + contato.getNome() + ", Email: " + contato.getEmail() + 
	    					", Endereço: " + contato.getEndereco() + ", Data: " + dataRecebida);
	    
		ContatoDAO dao = new ContatoDAO();
		dao.adiciona(contato);		
					
		System.out.println("Cadastro efetuado com sucesso!");
		System.out.print("Cadastrar mais um Contato? (Sim ou Não) - ");
		//leitura da resposta do usuario
		controle = reader.readLine();
		
		System.out.println("--------------------------------------------");
		System.out.println("Cadastros efetuados com sucesso, Obrigado.");
	}
}

}[/code]

Eai belê?

Cara, você está tentando ter tipo um “campo de pesquisa”? Digita o nome “André AS” daí filtra o nome banco e trazendo todos os dados do André AS, tais como id, endereço, certo?

Isso ai Andre, já consegui resolver isso e até aprimorei mais um pouco passando para uma jsp, já tinha até me esquecido desse tópido pq no dia que criei ninguem respondeu. mas de qualquer forma obrigado.
Basicamente o DAO ficou assim:

public class ContatoDAO {
	
	//conexão com o banco de dados
	private Connection connection;
	
	public ContatoDAO() {
		this.connection = new ConnectionFactory().getConnection();
	}
	
	//Cadastro 
	public void adiciona(Contato contato) {
		String sql = "insert into contatos (nome, email, endereco, dataNascimento) values (?,?,?,?)";
		
		try {
			//prepared statemente para inserção
			PreparedStatement stmt = connection.prepareStatement(sql);
			
			//seta os valores
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
			
			//executa
			stmt.execute();				
			stmt.close();
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	//Receber parametro para consulta
	public String nome;
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}

	public List<Contato> getLista() {
		
		try {
			List<Contato> contatos = new ArrayList<Contato>();
			
			PreparedStatement stmt = this.connection.prepareStatement("select * from contatos WHERE nome like '%"+ getNome() +"%' order by id");
						
			ResultSet rs = stmt.executeQuery();
			
			while (rs.next()) {
				//Criando o objeto Contato
				Contato contato = new Contato();
				contato.setNome(rs.getString("nome"));
				contato.setEmail(rs.getString("email"));
				contato.setEndereco(rs.getString("endereco"));
				
				//Montando a data através do Calendar
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("dataNascimento"));
				contato.setDataNascimento(data);
				
				//Adicionando o objeto a lista
				contatos.add(contato);
			}
			rs.close();
			stmt.close();
			return contatos;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

E a tela de Consulta usando JSP Assim:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Lista de Contatos</title>
</head>
<body>

	<% ContatoDAO dao = new ContatoDAO(); %>

	<form>
		Digite o nome para pesquisa: <input type="text" name="nome" /><br />		
		<input type="submit" value="Pesquisar" />
	</form>	
	
	<% String nome = request.getParameter("nome"); %>	
			
	<% 
	if (nome == null){	
		
	}else {
		dao.setNome(nome);
	}
	%>
		
	<% List<Contato> contatos = dao.getLista(); %>
	
	<table border=1 cellpadding=3 cellspacing=0>
		<tr>
			<th>Nome</th>
			<th>Email</th>
			<th>Endereço</th>
			<th>Data de Nascimento</th>
		</tr>
		<% for (Contato contato : contatos) { %>
		<tr>
			<td width=200px><%= contato.getNome() %></td>
			<td width=200px><%= contato.getEmail() %></td>
			<td width=200px><%= contato.getEndereco() %></td>
			<% String date = new SimpleDateFormat("dd/MM/yyyy").format(contato.getDataNascimento().getTime()); %>
			<td width=200px><%= date %></td>		
		</tr>
		<% } %>
	</table>	
</body>
</html>

Não sei se é a melhor solução, mas está funcionando perfeitamente aqui.

Na forma em que vc fez, funciona corretamente tbm.
Mas vc jah pensou em usar o Hibernate?

Sim, estou começando a estudar Hibernate agora e pretendo trabalhar com ele no futuro.