Dúvida em método para verificar usaurio

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.

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

Obrigado pela resposta.

Implementei da seguinte forma por enquanto

[code]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;
}[/code]

O que acham?
Desde já agradeço.

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!

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.

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!

Entendo.
Não estou familiarizado com a forma que ele me explicou.
Mas vou ver o que faço aqui.
Obrigado.

Edu,

Na verdade podemos ter uma situação estranha: Seu banco poderia ter os seguintes nomes:

Nome: Email
Alex alex@gmail.com
Alexandre alexandre@gmail.com
Alexandro alexandro@gmail.com

E o usuário poderia tentar cadastrar o seguinte:
Nome: Email
Ale ale@gmail.com

Nesta situação você receberia do select mais que 1 registro, gerando problemas na sua aplicação.
Faz sentido?

Abraços!

Primeiro ponto é a performance da comparação utilizando like.

Já imaginou isso em uma tabela com 1 milhão de registros?

Tenta assim:

[code]
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;
}[/code]

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

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!

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.

Essa comparação com = pode me retornar valores que podem ser iguais em partes ou não?
Tipo Carlos Eduardo = Carlos
Ou não?

Na verdade ele retornaria só igual.
Na situação que você colocou como exemplo só o like traria desta forma.

Até mais!

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!

Ah sim.
Obrigado por esclarecer mais essa dúvida.

é… 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!

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!

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:

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!