Consulta com parametros em JAVA

4 respostas
portugassis

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)
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);
		}
	}
		
}
Classe Inserir padrão da apostila (com os dados digitados direto no metodo e sem a data de nascimento certa)
public class TestaInsere {
	
	public static void main(String[] args) {
		
		//pronto para gravar
		Contato contato = new Contato();
		contato.setNome("joão");
		contato.setEmail("[email removido]");
		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!");
		
	}

}
Classe Inserir que eu criei, para digitar os dados manualmente quando o programa executar:
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.");
		}
	}
}

4 Respostas

A

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?

portugassis

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.

Ace

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

portugassis

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

Criado 17 de fevereiro de 2011
Ultima resposta 2 de mar. de 2011
Respostas 4
Participantes 3