Como saber se o sql encontrou um registro?

Olá tudo bem?

O problema é o seguinte:

1 - Utilizo o mesmo sql em várias classes, então, resolvi criar uma classe chamada Conexao para realizar esse sql e somente passar os parâmetros.

Então criei um método booleano, mas não sei como fazer para que ele me retorne true caso encontre o registro solicitado.

Como faço isso? A minha classe está logo abaixo (todo o código)

package servlets.venda;

import java.sql.*;

public class Conexao
{
Connection con;
PreparedStatement ps;
ResultSet rs = null;
boolean validado = false;

public boolean setValidaLogin(String login, String senha)
{		
		try			
		{
			Class.forName("org.gjt.mm.mysql.Driver").newInstance();
			con = DriverManager.getConnection("jdbc:mysql://localhost/vendas");
			ps  = con.prepareStatement("select * from usuario where login = ? and senha = ?");			
			ps.setString(1, login);
			ps.setString(2, senha);				
			rs = ps.executeQuery();
			
			try
			{
	        rs.next();  
	        validado = true;
	      }
	      catch(SQLException e)
	      { validado = false; }
	      
			rs.close();
			con.close();
	  } 
	  catch(SQLException e)
	  { }
	  catch(Exception e)
	  { }
	  return validado;
 }

}

Já resolvi o problema, java é muito louco!

Bastou criar um atributo do tipo booleano e atribuí-lo de rs.next();

na classe que estou chamando fiz o seguinte:

		Conexao conecta = new Conexao();

		if (conecta.setValidaLogin(login, senha) == false)
		{
				out.println( "<html> <head> <meta http-equiv= 'refresh' " + 
		  		    " content = '2; url = javascript:history.back();' " +
					 " &lt;/head&gt; <body bgcolor='#0080C0' text = 'white'> Você não possui permissão para esta sessão " + 
				    "</body>&lt;/html&gt;");
		}			 
		else .......

sacou a parada velhinho!

O código completo está logo baixo

package servlets.venda;

import java.sql.*;

public class Conexao
{
Connection con;
PreparedStatement ps;
ResultSet rs = null;
boolean validado = false;

public boolean setValidaLogin(String login, String senha)
{		
		try			
		{
			Class.forName("org.gjt.mm.mysql.Driver").newInstance();
			con = DriverManager.getConnection("jdbc:mysql://localhost/vendas");
			ps  = con.prepareStatement("select * from usuario where login = ? and senha = ?");			
			ps.setString(1, login);
			ps.setString(2, senha);				
			rs = ps.executeQuery();				
			validado = rs.next();				
			rs.close();
			con.close();
	  } 
	  catch(SQLException e)
	  { }
	  catch(Exception e)
	  { }
	  return validado;
 }

}

Só um adendo… :slight_smile:

O bloco try ficaria bem melhor assim:

try &#123; Class.forName&#40;&quot;org.gjt.mm.mysql.Driver&quot;&#41;.newInstance&#40;&#41;; con = DriverManager.getConnection&#40;&quot;jdbc&#58;mysql&#58;//localhost/vendas&quot;&#41;; ps = con.prepareStatement&#40;&quot;select * from usuario where login = ? and senha = ?&quot;&#41;; ps.setString&#40;1, login&#41;; ps.setString&#40;2, senha&#41;; rs = ps.executeQuery&#40;&#41;; validado = rs.next&#40;&#41;; &#125; catch&#40;SQLException e&#41; &#123; e.printStackTrace&#40;&#41;; &#125; catch&#40;Exception e&#41; &#123; e.printStackTrace&#40;&#41;; &#125; finally &#123; rs.close&#40;&#41;; con.close&#40;&#41;; &#125; return validado;

Porque colocar o e.printStackTrace: se ocorrer uma exceção você jamais saberá qual é! Pelo menos, deve exibi-la na saída de erro padrão.

Porque fechar o acesso ao banco no finally: se ocorrer algum erro na execução da sentença, por exemplo, o banco de dados ficará aberto aqui até o garbage collector se dignar a passar, o que pode demorar um bocado, e fazer com que novas conexões não sejam mais possíveis, já que o limite teria sido atingido.

E mais uma coisinha…não é uma boa prática usar o asterisco (*) na sentença SQL! Coloque o nome de pelo menos um campo. Se a tabela tiver 50 campos, com o asterisco, você estará pegando um registro com os 50 campos, sendo que, na prática, não precisa de nenhum!