Pesquisa com PreparedStatement

8 respostas
F

é o seguinte, eu fiz uma aplicaçao de locadora com entuido de estudar
ai eu fiz as conexoes com o banco mysql com statement mesmo ai eu estou tentando tunar e fazer uns detales mais “interessantes”

meu grande problema eh é fazer a pesquisa com o PreparedStatement, deleçao, inserçao e alteraçao ja foram, mas… a pesquisa me qbro
pq com o statement eu simplesmente testava o clienteVO que vem no meu action, oq tivesse nulo eu ignorava e oq tivesse preenchido concatenava
vou por um exemplo aqui

public List<ClienteVO> buscaCliente(ClienteVO cliente) {
		Integer codigo = cliente.getCodCiente();
		String nome = cliente.getNome();
		String cpf = cliente.getCpf();
		String endereco = cliente.getEndereco();
		String numero = cliente.getNumero();
		String dtNascimento = cliente.getDtNascimento();
		String logradouro = cliente.getLogradouro();
		
		String auxiliar = "";
		
		if ((codigo != null) && (codigo > 0)) {
			auxiliar += " AND ClienteID = "+ codigo.intValue();
		}
		if ((nome != null) && (nome != "")) {
			auxiliar += " AND nome like '%"+nome+"%'";
		}
		if ((cpf != null) && (cpf != "")) {
			auxiliar += " AND cpf = '"+cpf+"'";
		}
		if ((endereco != null) && (endereco != "")) {
			auxiliar += " AND endereco like '%"+endereco+"%'";
		}
		if ((numero != null) && (numero != "")) {
			auxiliar += " AND numero = "+numero;
		}
		if ((dtNascimento != null) && (dtNascimento != "")) {
			auxiliar += " AND dtNascimento = '"+dtNascimento+"'";
		}
		if ((logradouro != null) && (logradouro != "")) {
			auxiliar += " AND logradouroID = "+logradouro;
		}
		
		StringBuffer query = new StringBuffer();
		query.append("SELECT * FROM cliente WHERE 1 = 1");
		if(auxiliar != "")
		{
			query.append(auxiliar);
		
		}

ai tranquilo funciona perfeitamente(o codigo nao ta completo soh copiei a parte da concatenaçao que é a minha duvida)

mais com o PreparedStatement isso nao funciona assim… eu tenhu que fazer os set nos “?”
alguem tem alguma dica? sendo que o usuario pode pesquisar por qualquer campo , e por 1 ou mais, e caso nao preencha nem um buscar todos inseridos :confused:

obs
aqui o insert com PreparedStatement , e arquivo de propert

public void cadastraCliente(ClienteVo cliente) {
		StringBuffer query = new StringBuffer();
		query.append(properties.getProperty("cliente.insert"));
		PreparedStatement pstmt  = null;
		try {
//			NOME, CPF, ENDERECO, NUMERO, COMPLEMENTO, DATA_NASCIMENTO, CEP_ID, EMAIL, SENHA
			conn =  Conexao.getInstance().getConnection();
			pstmt = conn.prepareStatement(query.toString());
			pstmt.setString(1, cliente.getNome());
			pstmt.setString(2, cliente.getEndereco());
			pstmt.setInt(3, cliente.getNumero().intValue());
			pstmt.setString(4, cliente.getComplemento());
			pstmt.setDate(5, Uteis.dateToDateSql(cliente.getDtNascimento()));
			pstmt.setInt(6, cliente.getIdCep().intValue());
			pstmt.setString(7, cliente.getEmail());
			pstmt.setString(8, cliente.getSenha());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

se alguem tiver alguma dica todas são bem vindas

criticas e sugestoes ao codigo tb sao aceitas e bem vindas XD

(só desconsidero dica de portugues =x)

8 Respostas

A

Para comparar String você tem que usar o método equals, tem que mudar em todos as comparações

if ((nome != null) && (!"".equals(nome))) {  
         auxiliar += " AND nome like '%"+nome+"%'";  
}  

if(!"".equals(auxiliar))  
{  
         query.append(auxiliar);  
       
}
nandolup

Fala ae queridao outra coisa tbm… além dessa observacao que nosso amigo Alberes colocou,
na sua tabela existe uma coluna "1" pois seu SQL esta assim

SELECT * FROM cliente WHERE 1 = 1 // <<-- Esse 1 que estou falando, existe na sua tabela essa coluna?

abraços
Espero ter ajudado

T

nandolup:
Fala ae queridao outra coisa tbm… além dessa observacao que nosso amigo Alberes colocou,
na sua tabela existe uma coluna "1" pois seu SQL esta assim

SELECT * FROM cliente WHERE 1 = 1 // <<-- Esse 1 que estou falando, existe na sua tabela essa coluna?

abraços
Espero ter ajudado

Aham - esse “select * from cliente where 1 = 1” é a mesma coisa que “select * from cliente”, pois 1 é sempre igual a 1.
Não é possível existir uma coluna chamada “1”.

A

Isso é uma forma de montar a cláusula WHERE.

É mais fácil ter no início WHERE 1 = 1 e concatenar o resto se não fizer isso vai ter que testar a string se já tem a palavra WHERE antes de concatenar e isso daria um trabalhão já que são vários campos.

Abraços

ignacio83

A idéia do 1=1 não é tão ruim assim… evita alguns ifs no código.

se alguem tiver alguma dica todas são bem vindas

criticas e sugestoes ao codigo tb sao aceitas e bem vindas XD

(só desconsidero dica de portugues =x)

Pois é num tem jeito vc vai ter q ir concatenando a query com ? e setando os valores via set. Não tem muito o que inventar, a única dica que eu posso te dar é use uma variável de controle onde vai incrimentando para setar os valores…

Você pode também criar algum método utilitário que facilite sua vida…
Ex:

public void find(String inicioQuery, List<String> conditions, List<Object> parameters, PrepareStatement ps)
{
    StringBuilder query = new StringBuilder();  //StringBuffer não é recomendado
    query.append(inicioQuery);  
    for(String condition : conditions)
    {
        query.append("and");
        query.append(condition);
    }
    int i=0;
    for(Object param : parameters)
    {
        ps.setParameter(++i,param);
    }
}

Fiz esse código agora, nem sei se compila, mais é algo parecido com isso.

Já que vc está estudando pq não começa a dar uma olhada em JPA? Dependendo da implementação que vc utilizar dá pra fazer isso de forma mais simples.

F
ignacio83:
SELECT * FROM cliente WHERE 1 = 1 // <<-- Esse 1 que estou falando, existe na sua tabela essa coluna?

A idéia do 1=1 não é tão ruim assim... evita alguns ifs no código.

se alguem tiver alguma dica todas são bem vindas

criticas e sugestoes ao codigo tb sao aceitas e bem vindas XD

(só desconsidero dica de portugues =x)

Pois é num tem jeito vc vai ter q ir concatenando a query com ? e setando os valores via set. Não tem muito o que inventar, a única dica que eu posso te dar é use uma variável de controle onde vai incrimentando para setar os valores...

Você pode também criar algum método utilitário que facilite sua vida... Ex:
public void find(String inicioQuery, List<String> conditions, List<Object> parameters, PrepareStatement ps)
{
    StringBuilder query = new StringBuilder();  //StringBuffer não é recomendado
    query.append(inicioQuery);  
    for(String condition : conditions)
    {
        query.append("and");
        query.append(condition);
    }
    int i=0;
    for(Object param : parameters)
    {
        ps.setParameter(++i,param);
    }
}

Fiz esse código agora, nem sei se compila, mais é algo parecido com isso.

Já que vc está estudando pq não começa a dar uma olhada em JPA? Dependendo da implementação que vc utilizar dá pra fazer isso de forma mais simples.

StringBuilder query = new StringBuilder(); //StringBuffer não é recomendado
por que não é recomendado?? resolvi o problema assim
public List<ClienteVo> buscaCliente(ClienteVo cliente) {
			StringBuffer query = new StringBuffer();
			ResultSet result = null;
			PreparedStatement pstmt = null;
			
//		CLIENTE_ID,	NOME, CPF, ENDERECO, NUMERO, COMPLEMENTO, DATA_NASCIMENTO, CEP_ID, EMAIL, SENHA
			query.append("SELECT * FROM CLIENTE WHERE 1 = 1");
			if (Uteis.validaAtributo(cliente.getIdCliente()))
				query.append(" AND CLIENTE_ID = ?");
			
			if (Uteis.validaAtributo(cliente.getNome())) 
				query.append(" AND NOME LIKE ?");
//------------------------ coloquei soh 2 campos pra intende a ideia, depois do do PreparedStatement  feito eu seto o esquema com uma gambi basica

int add = 1;
			conn =  Conexao.getInstance().getConnection();
			try {
				pstmt = conn.prepareStatement(query.toString());
				
				if (Uteis.validaAtributo(cliente.getIdCliente()))
					pstmt.setInt(add++, cliente.getIdCliente());
				
				if (Uteis.validaAtributo(cliente.getNome())) 
					pstmt.setString(add++, "%" + cliente.getNome() + "%");

em tese é issae masi fico feio o código :/

Já que vc está estudando pq não começa a dar uma olhada em JPA? Dependendo da implementação que vc utilizar dá pra fazer isso de forma mais simples.

haehae blz!!!! só preciso descobri oq eh isso primeiro heahaehaehae

valeu galera!

A

JPA (Java Persistence API) é uma especificação para camada de persistência, a vantagem é a transparência com banco de dados. Você cria as classes de negócios com anotações(Annotation) ou o velho xml e o framework se encarrega do resto. Por traz da especificação está o Hibernate ou TopLink.

Dá uma olhada nos links abaixo:

http://www.temporeal.com.br/produtos.php?id=170695

http://www.temporeal.com.br/produtos.php?id=169088

http://www.temporeal.com.br/produtos.php?id=171670

abs

ignacio83

http://www.guj.com.br/posts/list/48531.java

Criado 3 de dezembro de 2008
Ultima resposta 3 de dez. de 2008
Respostas 8
Participantes 5