Dúvida em método para verificar usaurio

18 respostas
edu_fernandes

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.
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);
			
		}
	}

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.

18 Respostas

laurocaetano1

não use like kra, use =

select count(blabla) contador from usuario where bla = 'bla'

ai vc analisa o count e retorna se existe ou não

espero ter ajudado, []'s

edu_fernandes

Obrigado pela resposta.

Implementei da seguinte forma por enquanto
public static boolean validaCadastro(String user, 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);
			ResultSet rs = stmt.executeQuery();
			
			if(rs.getString("login_user").equals(user) || rs.getString("email_user").equals(email))
				return false;
		
			stmt.close();
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
		
		return true;
	}

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?

if(rs.getString("login_user").equals(user) || rs.getString("email_user").equals(email)) return false;

Abraços!

edu_fernandes

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:

Nome: Email
Alex [email removido]
Alexandre [email removido]
Alexandro [email removido]

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:
public static boolean validaCadastro(String user, String email) {
		Connection conexao = new ConnectionFactory().getConnection();
		boolean retorno = false;
		String sql = "select count(*) contador from usuario "
				+ "where login_user = '?' OR " + "email_user = '?'";

		try {
			PreparedStatement stmt = conexao.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();

			retorno = rs.getInt("contador") > 0 ? false : true;

			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

		return retorno;
	}

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 :wink: )
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

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. :smiley:

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! :wink:

Até mais!

Criado 21 de outubro de 2010
Ultima resposta 22 de out. de 2010
Respostas 18
Participantes 4