Boa noite a todos.
Antes de tudo, não sei se estou postando no lugar correto, mas vamos lá.
Minha dúvida é a seguinte.
Estou com um método que verifica se o login e o email de um usuario existem ou não.
Vejam ele.
publicclassValidacao{publicstaticbooleanvalidaCadastro(Stringnome,Stringemail){Connectionconexao=newConnectionFactory().getConnection();Stringsql="SELECT login_user, email_user FROM usuario "+"WHERE login_user LIKE '?%' OR "+"email_user LIKE '?%'";try{PreparedStatementstmt=conexao.prepareStatement(sql);}}
Eu não o terminei ainda porque ai que entra minha dúvida.
Existe uma forma de eu saber se retornou resultado ou não minha busca com o Prepared?
Por exemplo, se existe esses valores, retorna true ou algo que signifique a mesma coisa para o método?
Espero que possam me ajudar.
Desde já agradeço.
publicstaticbooleanvalidaCadastro(Stringuser,Stringemail){Connectionconexao=newConnectionFactory().getConnection();Stringsql="SELECT login_user, email_user FROM usuario "+"WHERE login_user LIKE '?%' OR "+"email_user LIKE '?%'";try{PreparedStatementstmt=conexao.prepareStatement(sql);ResultSetrs=stmt.executeQuery();if(rs.getString("login_user").equals(user)||rs.getString("email_user").equals(email))returnfalse;stmt.close();}catch(SQLExceptione){thrownewRuntimeException(e);}returntrue;}
O que acham?
Desde já agradeço.
AlexandreGama
Olá Edu!
Realmente o Like na sua consulta trará a você um comportamento estranho. Dependendo
do usuário e do email, você terá uma consulta retornando vários registros.
Quanto a sua lógica, é realmente este o comportamento que você deseja?
O que eu quero é o seguinte.
O usuario não pode cadastrar um nome de usuario e email que já existirem. Por isso acredito que o LIKE não vai retornar nada além de um registro.
No caso da comparação eu quero o seguinte. Se o usuario no banco existir e for igual ao que eu passo como parâmetro no método ele retorna falso caso existam
registros iguais aos que ele quer gravar.
AlexandreGama
E só respondendo sua dúvida:
Você pode fazer como o nosso amigo falou, uma consulta com count ou pode verificar se há
registros no seu ResultSet fazendo uma iteração com o seu rs.
Mas neste caso, com uma consulta direta ao banco de dados, com a verificação de igualdade de registros,
não seria interessante.
Você só precisará fazer iterações caso realmente precise dos registros retornados pelo ResultSet.
Abraços!
edu_fernandes
Entendo.
Não estou familiarizado com a forma que ele me explicou.
Mas vou ver o que faço aqui.
Obrigado.
AlexandreGama
Edu,
Na verdade podemos ter uma situação estranha: Seu banco poderia ter os seguintes nomes:
E o usuário poderia tentar cadastrar o seguinte:
Nome: Email
Ale [email removido]
Nesta situação você receberia do select mais que 1 registro, gerando problemas na sua aplicação.
Faz sentido?
Abraços!
laurocaetano1
Primeiro ponto é a performance da comparação utilizando like.
Já imaginou isso em uma tabela com 1 milhão de registros?
Tenta assim:
publicstaticbooleanvalidaCadastro(Stringuser,Stringemail){Connectionconexao=newConnectionFactory().getConnection();booleanretorno=false;Stringsql="select count(*) contador from usuario "+"where login_user = '?' OR "+"email_user = '?'";try{PreparedStatementstmt=conexao.prepareStatement(sql);ResultSetrs=stmt.executeQuery();retorno=rs.getInt("contador")>0?false:true;stmt.close();}catch(SQLExceptione){thrownewRuntimeException(e);}returnretorno;}
Edit para explicar a lógica ->
Executa um selec pra contar quantas linhas contem os registros passados por parametros.
Se o contador for maior que 0 (que é quando cai em uma das condições -> email igual ou usuario igual) vc retorna falso e diz q já existe usuário cadastrado com esses dados..
A validação e o count(*) vc pode melhorar..
count(email) email e count(login_user) usuario pra saber quantas linhas tem de cada registro.. e por ai vai
[]'s
AlexandreGama
Edu,
A forma que ele falou é interessante caso você queira deixar para o banco a verificação se existe ou não.
Da forma que você pensou está correta, porém, além do banco verificar os registros com o where
você ainda faz outra verificação com os registros retornados, que na teoria não seria necessária.
Você poderia fazer o select com o count e simplesmente verificar se existe pelo menos 1 registro retornado
pelo ResultSet. Esta é uma das maneiras, claro.
Até mais!
edu_fernandes
Muito obrigado pela paciencia e pelas dicas.
Consegui compreender o que queriam me dizer.
Estava fazendo trabalho em dobro.
Espero que este tópico seja util para mais pessoas além de mim.
Abraço a todos e obrigado novamente.
edu_fernandes
Essa comparação com = pode me retornar valores que podem ser iguais em partes ou não?
Tipo Carlos Eduardo = Carlos
Ou não?
AlexandreGama
Na verdade ele retornaria só igual.
Na situação que você colocou como exemplo só o like traria desta forma.
Até mais!
AlexandreGama
Edu,
Só discordo do laurocaetano1 em relação ao primeiro ponto negativo do like ser a performance (não me leve a mal laurocaetano1 )
Mas com like, a sua regra de negócio está errada. Logo, o primeiro ponto a ser levado em consideração na sua aplicação
é se ela atende a sua lógica e em segundo (a grosso modo) é se ela possui uma eficiência aceitável do algoritmo.
Abraços!
edu_fernandes
Ah sim.
Obrigado por esclarecer mais essa dúvida.
laurocaetano1
é… acabei me expressando mal em relação ao uso do like. Depende da regra de negocio também.
Mas digo: tente evitar, mas se precisar procurar por nomes, dê uma pesquisada em busca fonética (uma implementação em português: http://www.incor.usp.br/spdweb/ccssis/fonetica/)
abraços!
AlexandreGama
Isso mesmo Edu.
Como o laurocaetano1 disse, verificar bem o motivo do like. Há situações que deve e situações que não deve ser usado (mesmo resolvendo o problema)
Abraços!
D
dodo1
pessoal sou novo no forum e estou começando em java agora
tenho uma duvida, se vcs puderem me ajudar eu agradeço.
vc poderiam me explicar por favor o que significa
public,static ,void e main
se o void nao tem retorno, pq ele esta junto com o main "que passa a idéia p/ compilador que esta classe é executavel ???
me ajudem, por favor.
AlexandreGama
Olá dodo!
Só pra manter a organização, como este tópico já foi resolvido, sugiro que você crie outro tópico
para as suas dúvidas, assim não ficamos com dúvidas totalmente distintas no mesmo tópico!