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.
[code]public class Validacao {
public static boolean validaCadastro(String nome, String email){
Connection conexao = new ConnectionFactory().getConnection();
String sql = "SELECT login_user, email_user FROM usuario " +
"WHERE login_user LIKE '?%' OR " +
"email_user LIKE '?%'";
try{
PreparedStatement stmt = conexao.prepareStatement(sql);
}
}[/code]
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.
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.
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.
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
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.
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.
é… 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/)
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)
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!