Query de Busca

Boa tarde, estou com uma duvida cruel, tenho uma tabela no MySQL e quero fazer um busca atravez de um Jframe, minha tabela esta mais ou menos assim:

NOME | DATA | SEXO

JOAO | 16/04/2000 | M

MARIA | 22/07/2001 | F

JOSE | 10/01/2002 | M

JOAQUINA | 15/02/2003 | F

no meu form eu tenho os mesmos campos de nome, data e sexo. Eu quero que seja possivel por exemplo que se eu quiser fazer uma busca somente por sexo deixando os outros campos vazios, me apareça todos os homens ou todas as mulheres. Ate ai tudo bem, mas quando eu faço uma busca com os outros campos o resultado não é o que eu esperava. Por exemplo se eu buscar por Nome: JOAO e sexo: F, ele me retorna assim:

NOME | DATA | SEXO

JOAO | 16/04/2000 | M

MARIA | 22/07/2001 | F

JOAQUINA | 15/02/2003 | F

ou seja ele busca o nome joao e todas as mulheres.
Minha query esta assim:

Como eu posso fazer pra que se eu por exemplo buscar por JOSE e como sexo F ele não me retornar resultados? Não sei se consegui me expressar bem, mas é por ai!!! Desde ja agradeço.

Olá!

O prolema está no OR da sua query. O que ele faz é buscar por JOAO OU sexo = F.

Troque o OR por AND.

Ola Marck, obrigado pela força, mas o problema é que se eu mudar pra AND eu não vou poder buscar por exemplo so os homens ou so as mulheres, deixando o campo nome em branco, sendo obrigado a preencher tambem o campo nome (ou data se trocar la tambem por AND). É ai que esta o problema.

Ahh!! Entendi!

Então o que vc pode fazer é montar uma query para cada campo e passá-la como parametro.
Ou melhor, vc pode montar a query dinamicamente de acordo com os campos que estão preenchidos na tela.

Se precisar de uma força, dá um toque!

nos codigos de busca acho melhor fazer oque o marck fala,…

e outra dica quando for cadastrar no banco sepre coloca upper case pq ai na hora de vc buscar coloca upercase tbm parapoder não ter inconsistencias no banco…

Marck, mais uma vez, muito obrigado, e acho que eu vou precisar de uma ajuda pra montar uma query dinamicamente. Sera que vc pode me dar um exemplo??
alanbrasil1984, muito obrigado pela dica, eu realmente não tinha pensado em mandar tudo com upper case, vou fazer isso.

Iai, blza?

Fiz um pequeno exemplo usando um vetor de JTextField’s.
Conforme sua necessidade, você pode criar outros métodos com variações da query (OR, <>) e também, pegando dados de componentes diferentes diferentes de JTextField.

Dá uma olhada também, o porque neste caso é melhor usar StringBuilder do que String. E por último, veja sobre o PreparedStatement para saber como trocar as “?” da query pelo dado que você quer filtrar.

http://java.sun.com/j2se/1.4.2/docs/api/java/sql/PreparedStatement.html

import javax.swing.JTextField;

public class DinamicQuery {

    //"select * from TABELA where NOME like '%"+nome+"%' or DATA = '"+data+'" or SEXO = '"+sexo+"'" 
    
    private String table;
    private StringBuilder query;
    
    public DinamicQuery() {
    }
    
    
    public DinamicQuery(String table){
        
        this.table = table;
        query = new StringBuilder("SELECT * FROM " + table + " WHERE ");
    }
    
    
    public String dinamicQuery(JTextField [] fields){
    	
    	
    	for(JTextField field : fields){
    		
    	    //coloca o campo na clausula where
            query.append( field.getName() );
            
            query.append( " = ? " );
            
            query.append(" and ");
    	                		
    	}
        
        //tira o último AND
        query.replace(query.length() - 4, query.length(), "");
        
        return query.toString();
    	
    }
    
    
    public static void main(String [] args){
    	
    	JTextField jtNome = new JTextField();
    	jtNome.setName("nome");
        
        JTextField jtSexo = new JTextField();
    	jtSexo.setName("sexo");
        
    	JTextField [] jt = {jtNome, jtSexo};
    	        
        DinamicQuery dq = new DinamicQuery("CLIENTE");
                
        System.out.println( dq.dinamicQuery(jt) );
    	
    }
    
}

Abraço!

Marck, mais uma vez, muito obrigado, vou implementar aqui no meu projeto, qualquer duvida eu volto a postar. Abraços.