Pesquisa em Java

23 respostas
libo8

Olá Pessoal.

Estou fazendo um trbalho da Faculdade e o assunto e de controle de movimentações bancárias…

mas estou com um probleminha no quesito da Pesquisa…

estou indo pesquisar em um banco de dados MySQL. quando a isso não tem problema…

vou mostrar um EXEMPLO para vcs… quero pesquisar as pessoas com o nome de PEDRO…

tenho esses nomes em meu DB : Pedro Luis, Pedro Amario, Carlos Pedro… etc…

e quandos eu colocar para pesquisar pelo nome Pedro eu quero q retorne esses nomes ai em cima… estou colocando os nomes para aparecer em uma tabela…

não adianta cololocar para comprar usando o método equals() pois ele só retorna os nomes totalmente identicos…

como vcs poderam ver o meu problema é em pesquisar apenas uma parte do nome da pessoa… heheh

23 Respostas

Kassiane_Pretti

já tentou fazer um like %pedro% no codigo SQL?

D

Exemplos de utilização do like em sql:

Busca todos os registros onde o campo nome termina com PEDRO

Query:
select * from tabela where nome like ‘%PEDRO’

Exemplo de registros selecionados:
JOAO PEDRO

Busca todos os registros onde o campo nome começa com PEDRO

Query:
select * from tabela where nome like ‘PEDRO%’

Exemplo de registros selecionados:
PEDRO JOAO

Busca todos os registros onde o campo nome tenha uma ocorrencia PEDRO:

Exemplo de registros selecionados:
PEDRO JOAO
JOAO PEDRO
PAULO PEDRO JOAO

Query:
select * from tabela where nome like ‘%PEDRO%’

Abraço!

libo8
KassiPretti:
já tentou fazer um like %pedro% no codigo SQL?

pois é... eu estou pegando os valores do banco de dados e jogando em uma variavel e estou fazendo a comparação dentro do meu programa em java..

eu queria por exemplo assim

String nomeB="Pedro";
String nomeA="Luis Pedro";

if(nomeB.equals(nomeA){
SYstem.out.println("Pessoas com o nome Pedro encontrado");

}

eu queria algo do genero acima.. só que com a função equals não vai funcionar.. entendeu?

blackfalcon

Isso mesmo que eu ia falar…

So que nesse caso no lugar de pedro iria ficar a variavel ne…

Tem varios outros meios de achar um nome usando like… tem outro comando tambem que no momento me esqueci, nao sei se é REGEXP, acho que é esse… rsrs

No site do apostilando tem uma otima apostila de MySQL, de uma procurada la :slight_smile:

Abraços

Kassiane_Pretti

Então vc pode usar um metodo para analisar se a string A está contida na string B… Mas eu não lembro o nome do metodo… dá uma olhadinha no google um metodo em java para pesquisar substrings…

=)

M

Por que cargas dágua não bota o critério na consulta?!

Kassiane_Pretti

malsan tem razão, seria melhor em vez de vc trazer todos os registros do banco fazer logo o filtro dos q vc deseja usar… é mais prático e rapido

=)

libo8

KassiPretti:
malsan tem razão, seria melhor em vez de vc trazer todos os registros do banco fazer logo o filtro dos q vc deseja usar… é mais prático e rapido

=)

com certeza seria a melhor forma…

mas ainda não tive a cadeira de Banco de Dados em minha facul… e não tenho nem noção de como fazer isso…

o nosso profeessor de programção mostrou algumas coisas básicas só para a gente salvar e buscar os valores…

o resto do processo… deve ser feito dentro do programa mesmo… como o de busca… comparação. .etc

Kassiane_Pretti

Hummmm entendii
Então procure o metodo de substring em java, para vc poder buscar uma string menor dentro de outra como vc tá quendo fazer…

berg.pb

Vc pode usar um ResultSet.

O ResulSet é uma coleção que irá add os valores encontrador na pesquisa.
Seria algo mais ou menos assim, supondo que você já está conectado ao banco de dados, e qu eo nome da sua comexão é connection.

/**Cria o Statement para executar os comandos SQL*/
Statement st = connection.createStatement();

/**Cria a variável que irá armazenar a String Consulta*/
String query = "SELECT Nome FROM Tabela WHERE Nome LIKE '%PEDRO%'"

/**
a. Cria o ResultSet para armazenar os dados da pesquisa
b. Executa a pesquisa, armazenando os valores no ResultSet.
*/
ResultSet rs = st.executeQuery(query);

/**Cria a variável que irá contar o número de registros Pedro dentro da pesquisa*/
int count = 0;

/**
Navega no ResulSet. 
Enquando tiverem registros (next()), ele vai incrementar o count.
*/
while (rs.netx())
   count++

/**Exibe a quantidade de registros encontrados.*/
System.out.println("Qtde de Usuários que contêm o nome 'Pedro': " + count);

Vc pode também utilizar as interfaces Iterator e Collection para navegar e manipular os dados encontrados.
Dpa uma pesquisada no javadoc sobre: ResultSet, Collection, Iterator.

Espero ter ajudado
Qaulquer coisa, posta.

Abraços

M

Morte aos professores universitários sem noção!!!
Tenta usar o método indexOf(String s), que retorna a posição dum substring no string de onde é invocado. o método toLowerCase() também pode ajudar.
Assim:

for(String name : names){ if(name.toLowerCase().indexof(criterionName.toLowerCase()) >= 0){ found.add(name); } }

onde: names = lista de nomes que veio do banco, criterionName = nome a procurar e found = lista de nomes coincidentes!
E vê se estuda SQL depois desta!!!
Aquele abraço!!!
San

B

Você pode ter problemas se os nomes guardados no banco tiverem uma mistura de maiúsculas e minúsculas. Essas pesquisas com string geralmente são sensíveis à caixa do texto.

Alguns bancos tem funcões como o uppercase, e dá pra usar com “uppercase(nome) like ?”, que vai colocar o registros em caixa alta, daí é só passar um valor em maiúsculas.

Outros bancos dá pra colocar o modo de pesquisa de string em case insensitive, que ignora a caixa. Há opções também de accent insensitive, que ignora os acentos, onde A. a, á, ã, â são todos os mesmos caracteres.

blackfalcon

Como foi dito, teste no seu programa o metodo indexOf()

Caso a string existir, ele ira retornar o valor da posição onde começa essa string. Caso nao existir, ira ser retornado um erro, que no caso é -1. Dai voce ve o que voce faz…

Nao lembro se diferencia maiuscula de minuscula, mas caso diferenciar, voce pode usar o metodo toUpperCase para o valor do db e na hora de pesquisa usar o mesmo metodo para passar o valor da pesquisa no mesmo tipo de letra, que no caso é maiuscula, assim tem menos chances de dar erro… :slight_smile:

Abraços

berg.pb

Concordo e discordo com o Bruno

Realmente, vc pode ter alguns problemas com a caixa do texto.
Porém, neste caso específico, onde a pesquisa é por nome próprio, parto do princípio de que todo nome prórpio começa com letra maísucla.

então, vc teria que mudar a string query:

String query = "SELECT Nome FROM Tabela WHERE Nome LIKE '%Pedro%'"

Porém, se o valor da busca for repassado de algum lugar, o melhor seria encapsular numa variável e utilizar o jogo de toLowerCase() e toUpperCase() para fazer a pesquisa de todos os itens.

Então, eu alteraria:

/**Cria o Statement para executar os comandos SQL*/
Statement st = connection.createStatement();  

/**Encapsular a palacha-chave - String keyWord = (lugar de origem);
nesse caso, vou assumir que o cara digitou a palavra 'Pedro' */
String keyWord = "Pedro";
   
/**Cria a variável que irá armazenar a String Consulta
irá fazer a consulta utilizando as opções:
1. como usuário digitou (keyWord)
2. convertendo para caixa alta (keyWord.toUpperCase())
3. convertendo para caixa baixa (keyWord.toLowerCase())
*/  
 String query = "SELECT Nome FROM Tabela WHERE Nome LIKE '%" + keyWord 
           + "%' OR '%" + keyWord.toUpperCase() 
           + "%' OR '%" + keyWord.toLowerCase() 
           + "%'");
B

Você está sendo inocente. Se você partir desse principio, também tem que acreditar que o nome foi digitado corretamente pelo usuário, que o sistema tenha guardado na base o nome certinho, que você tenha controle exclusivo e total sobre esses dados, que todos os dados colocados lá antes do teu sistema aparecer estejam perfeitos, e pior, que todos os nomes próprios realmente comecem com maiúsculas.

Sério, isso não existe.

berg.pb

Fala Bruno, blz?

Realmente, eu estaria sendo inocente.
Porém, eu tenho a mania de acreditar nas pessoas.
Mas, também, pensando que o cara pode digitar diferente, que eu coloquei a 2ª opção.

Mas não quero abrir nenhuma discussão sobre esse assunto…

Abraços

libo8
berg.pb:
Vc pode usar um ResultSet.

O ResulSet é uma coleção que irá add os valores encontrador na pesquisa.
Seria algo mais ou menos assim, supondo que você já está conectado ao banco de dados, e qu eo nome da sua comexão é connection.

/**Cria o Statement para executar os comandos SQL*/
Statement st = connection.createStatement();

/**Cria a variável que irá armazenar a String Consulta*/
String query = "SELECT Nome FROM Tabela WHERE Nome LIKE '%PEDRO%'"

/**
a. Cria o ResultSet para armazenar os dados da pesquisa
b. Executa a pesquisa, armazenando os valores no ResultSet.
*/
ResultSet rs = st.executeQuery(query);

/**Cria a variável que irá contar o número de registros Pedro dentro da pesquisa*/
int count = 0;

/**
Navega no ResulSet. 
Enquando tiverem registros (next()), ele vai incrementar o count.
*/
while (rs.netx())
   count++

/**Exibe a quantidade de registros encontrados.*/
System.out.println("Qtde de Usuários que contêm o nome 'Pedro': " + count);

Vc pode também utilizar as interfaces Iterator e Collection para navegar e manipular os dados encontrados.
Dpa uma pesquisada no javadoc sobre: ResultSet, Collection, Iterator.

Espero ter ajudado
Qaulquer coisa, posta.

Abraços

usei esse códigos que vc me passou..

funcionou perfeitamente..
só mudei algumas coisasinhas de acordo ao meu programa..

String nomeTEMP=campoNOME.getText();
        if(nomeTEMP.equals("")){
        JOptionPane.showMessageDialog(null,"Por favor digite um nome válido.");
        }else{
        
        String query = "SELECT * FROM dadosconta WHERE Nome LIKE '%"+nomeTEMP+"%'"; 
             boolean achado=false;
            try{
            ResultSet rec = st.executeQuery(query);
            while(rec.next()){   
             achado=true;    
             Tabela.addRow(new Object[] {rec.getString("conta"), rec.getString("nome"), rec.getString("cpf"), rec.getString("endereco"), rec.getString("cidade"), rec.getString("telefone"), rec.getString("saldo"), rec.getString("data")});             
            }
          
           
         }catch(SQLException s){
           System.out.println("sql erro:"+s.toString());
            
        }

mt obrigado..

berg.pb

Blz Cara…
Q bom que deu certo…
Po´rem, se o cara digitar mais de um espaço em branco??

Dá uma lida na subfunção ‘trim()’ da String, blz?

abraços

rodrigomelo
libo8:
KassiPretti:
já tentou fazer um like %pedro% no codigo SQL?

pois é... eu estou pegando os valores do banco de dados e jogando em uma variavel e estou fazendo a comparação dentro do meu programa em java..

eu queria por exemplo assim

String nomeB="Pedro";
String nomeA="Luis Pedro";

if(nomeB.equals(nomeA){
SYstem.out.println("Pessoas com o nome Pedro encontrado");

}

eu queria algo do genero acima.. só que com a função equals não vai funcionar.. entendeu?

Já vi soluções melhores de tratar a própria qry em si, mas só para comentar o exemplo que vc deu, além do IndexOf, temos também o contains:

public class Test {
    public static void main(String[] args) {
        String nomeB = "Pedro";
        String nomeA = "Luis Pedro";

        if (nomeA.contains(nomeB)) {
            System.out.println("Pessoas com o nome Pedro encontrado");
        } else {
            System.out.println("Não encontrei nada.");
        }
    }
}

Só que o contains funciona com a teoria de conjuntos, logo, suponho que o IndexOf funcione melhor.

Espero ter ajudado.

E

tem algum código parecido do “contains” em um int? pra fazer uma pesquisa de numero(sem ser exatamente igual, mas que contenha os numeros citados na pesquisa)

e no caso do contains, tem como fazer igual banco de dados, tipo where PE% ?

pq quando eu uso contains, é como se tivesse %PE%.

B

Eiro:
tem algum código parecido do “contains” em um int? pra fazer uma pesquisa de numero(sem ser exatamente igual, mas que contenha os numeros citados na pesquisa)

e no caso do contains, tem como fazer igual banco de dados, tipo where PE% ?

pq quando eu uso contains, é como se tivesse %PE%.

Você precisa converter o teu campo numérico no banco para string, seja em runtime da pesquisa fazendo um " string(coluna) like ‘%numero%’ ", ou se precisar de velocidade, criar um índice dessa string(coluna), ou converter essa coluna de vez para string.

E

no caso não estou usando o banco ainda.

Então não haveria forma de usar um contains em um int?

B

contains não é uma operação que existe em tipos numéricos, ela é mais válida para tipos como coleções/sequencias (considerando que uma string é uma sequencia de caracteres).

Para o teu caso, transforme o int num String, e use o contains do String.

Criado 20 de junho de 2008
Ultima resposta 29 de mai. de 2013
Respostas 23
Participantes 9