Re:JDBC-ODBC / Comparação de textfield com campo do banco

14 respostas
Pedrosa

Crie um metodo separado para essa validação:

Exemplo DAO:

public boolean validaLogin(LoginModel login) throws SQLException {
		String sql = "SELECT * FROM USUARIO WHERE USUARIO =  ? AND SENHA = ?";
		PreparedStatement stmt = this.connection.prepareStatement(sql);
		stmt.setString(1, login.getUsuario().trim());
		stmt.setString(2, login.getSenha().trim());
		ResultSet rs = stmt.executeQuery();
		if(rs.next()){
			return true;
		}else{
			return false;
		}
}

//Na sua interface

LoginModel login = new LoginModel();
login.setUsuario(txtUsuario.getText());
login.setSenha(txtSenha.getText());
if(validaLogin(login)){
...
}

14 Respostas

Pedrosa

Na verdade a classe é LoginModel, eu crio um modelo do banco de dados em uma classe com getters e setters, o ideal é vc separar sua aplicação em camadas, faça uma classe só para conexao, outra para modelo, outra com regras de negocio e por fim sua apresentação que seria a interface, de jeito que vc está fazendo vc fica replicando codigo, vamos supor que vc tenha mais de uma tela, vc ficar conectando toda hora?, não crie uma classe so para isso, se seu sistema crescer vc terá mais controle.

//Exemplo classe modelo

public class LoginModel {
	private String usuario;
	private String senha;
	
	public String getSenha() {
		return senha;
	}
	
	public void setSenha(String senha) {
		this.senha = senha;
	}
	
	public String getUsuario() {
		return usuario;
	}
	
	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}
	
}

//Exemplo de conexao

package br.com.pedrosa.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ConnectionFactory { 

	private static final String url = "jdbc:jtds:sqlserver://server/bd";
	private static final String driver = "net.sourceforge.jtds.jdbc.Driver";
	private static final String usuario = "user";
	private static final String senha = "password";
	
	public static Connection getConnection() throws SQLException {
		try {
			Class.forName(driver);
			return DriverManager.getConnection(url, usuario, senha);
		} catch (ClassNotFoundException e) {
			throw new SQLException(e.getMessage());
		}
	}
	
}
Pedrosa

Algo assim:

actionPerformed( ActionEvent e ) {
     ClasseModelo modelo = new ClasseModelo();
 
         // Aqui eu envio o valor do campo para um modelo
         modelo.setUsuario( user.getText() );
         modelo.setSenha( pass.getText() );
 
         //classe DAO
         ClasseDAO regra = new ClasseDAO();
         // aqui eu chamo o método para fazer a comparação dos campos
         regra.validaLogin(modelo)
Pedrosa

Exatamente tudo separado, para mais detalhes pesquise sobre MVC.

//Classe DAO

package br.com.pedrosa.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.List;

import br.com.pedrosa.jdbc.ConnectionFactory;
import br.com.pedrosa.model.LoginModel;

/**
 * Classe de Negócios
 * Autor: Fabio Pedrosa
 * Data: 05/04/2006
 */

 
public class ClasseDAO {
	private Connection connection;
  
	public ClasseDAO(Connection con){
		this.connection = con;
	}

	public ClasseDAO() throws Exception {
		this.connection = ConnectionFactory.getConnection();
	}

	public boolean validaLogin(LoginModel login) throws SQLException {
		String sql = "SELECT * FROM USUARIO WHERE USUARIO =  ? AND SENHA = ?";
		PreparedStatement stmt = this.connection.prepareStatement(sql);
		stmt.setString(1, login.getUsuario().trim());
		stmt.setString(2, login.getSenha().trim());
		ResultSet rs = stmt.executeQuery();
		if(rs.next()){
			return true;
		}else{
			return false;
		}
	}

}
Pedrosa

Sim chama o modelo e a classe dao passando o objeto modelo para essa classe

actionPerformed( ActionEvent e ) {
      ClasseModelo modelo = new ClasseModelo();
       // Aqui eu envio o valor do campo para um modelo
      modelo.setUsuario( user.getText() );
      modelo.setSenha( pass.getText() );
      //classe DAO
      ClasseDAO regra = new ClasseDAO();
      // aqui eu chamo o método para fazer a comparação dos campos
     //trato qualquer excessao aqui. 
      try{
         regra.validaLogin(modelo)
      } catch (Exception err) {
         JOptionPane.showMessageDialog(null,"Erro ao xxx:!" + err,"Erro",JOptionPane.ERROR_MESSAGE);

      }
Pedrosa

De uma olhada nos seus tratamentos de erros, naquele exemplo que te passei usei throws SQLException no DAO ou seja quem chamar essa classe deve tratar o erro, e sua mensagem deve ser mais generica, pois pode ocorrer erro de conexão e de jdbc na classe DAO.

Spool

Boa tarde pessoal:
Me ajudem nesse problema:

Tenho um frame padrão com dois campos, um textfield e um passwordfield para validação de acesso ao sistema.

Quando o botão ok for clicado, deverá chamar um método para verificar se o nome e senha conferem com algum cadastrado no banco de dados.

Como eu poderia fazer isso?
Tentei com o codigo abaixo, mas não deu certo. Porque o campo sendo válido ou não ele permite o acesso.

try {
                Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
                Connection conn = DriverManager.getConnection( url );
                
                state = conn.createStatement();
                sql = "SELECT * FROM tb_usersDetails WHERE nickName = '" + 
                        user + 
                        "'";
                
                rs = state.executeQuery( sql );
                rs.next();
                
               JOptionPane.showMessageDialog( null,
                        user, "teste", JOptionPane.INFORMATION_MESSAGE );
                               
                rs.close();
                
            }
            catch( ClassNotFoundException e ) {
                JOptionPane.showMessageDialog( null,
                        "Erro - ODBC
                        "JDBC-ODBC Driver Error", JOptionPane.ERROR_MESSAGE );
            }
            catch( SQLException exception ) {
                JOptionPane.showMessageDialog( null,
                        "Erro - SQL",
                        "SQL Internal Error",JOptionPane.ERROR_MESSAGE );
            }

Outra coisa, como faço a validação do campo PasswordField? Ele não tem um método getText(). Achei um getChar(). Será que teria que converter para String? Se sim, como fazer?!

Desde já agradeço.

Abraços.

Spool

Pedrosa:
Crie um metodo separado para essa validação:

Exemplo DAO:

public boolean validaLogin(LoginBean login) throws SQLException {
		String sql = "SELECT * FROM USUARIO WHERE USUARIO =  ? AND SENHA = ?";
		PreparedStatement stmt = this.connection.prepareStatement(sql);
		stmt.setString(1, login.getUsuario().trim());
		stmt.setString(2, login.getSenha().trim());
		ResultSet rs = stmt.executeQuery();
		if(rs.next()){
			return true;
		}else{
			return false;
		}
}

//Na sua interface

LoginModel login = new LoginModel(); login.setUsuario(txtUsuario.getText()); login.setSenha(txtSenha.getText()); if(validaLogin(login)){ ...

Poderia comentar sobre esse codigo?
Por exemplo, que tipo de objeto é um LoginBEan??

Muito grato pela atenção.

Spool

Vamos ver se eu entendi:

Tenho a ClasseUI:

actionPerformed( ActionEvent e ) {
    ClasseValidaLogin validaLogin = new ClasseValidaLogin();

        // Aqui eu envio o valor do campo para um metodo validador
        validaLogin.setUsuario( user.getText() );
        validaLogin.setSenha( pass.getText() );

        // aqui eu chamo o método para fazer a comparação dos campos
        
        ClasseComparaDados compara = new ComparaDados( login );

Seria isso?

Abraços.

Spool
Pedrosa:
Algo assim:
actionPerformed( ActionEvent e ) {
     ClasseModelo modelo = new ClasseModelo();
 
         // Aqui eu envio o valor do campo para um modelo
         modelo.setUsuario( user.getText() );
         modelo.setSenha( pass.getText() );
 
         //classe DAO
         ClasseDAO regra = new ClasseDAO();
         // aqui eu chamo o método para fazer a comparação dos campos
         regra.validaLogin(modelo)

Entendi.
Dai na classeDAO eu crio uma instancia da ConnectionFactory?

Como ficaria a classeDAO ?

Valew!

Spool

Tipo, ate aqui beleza, mas como vc esta passando as excessões quando crio uma instancia da classe DAO, como eu declaro a SQLException?!

Não entendi essa parte.

Por ex. no actionPerformed do botão, eu teria que chamar a classe DAO correto?

Só que a classe DAO passa a Excessão, pelo que eu entendo a excessão deve ser tratada na próxima classe mais concreta. ( me corrijam caso esteja errado ).

Então a duvida eh essa: Como instanciar a classe declarando a excessão?!

Abraços.

Spool

Tipo, ate aqui beleza, mas como vc esta passando as excessões quando crio uma instancia da classe DAO, como eu declaro a SQLException?!

Não entendi essa parte.

Por ex. no actionPerformed do botão, eu teria que chamar a classe DAO correto?

Só que a classe DAO passa a Excessão, pelo que eu entendo a excessão deve ser tratada na próxima classe mais concreta. ( me corrijam caso esteja errado ).

Então a duvida eh essa: Como instanciar a classe declarando a excessão?!

Abraços.

Spool

To fazendo assim:

LoginModel model = new LoginModel();
                model.setUsername( usernameTextField.getText() );
                model.setPassword( new String( passwordPasswordField.getPassword() ) );
                
            LoginDAO dao = new LoginDAO();
                try {
                    dao.validateLogin( model );
                }
                catch( Exception e ) {
                    JOptionPane.showMessageDialog( null,
                            "Erro na conexão com o banco de dados.", "Error", 
                            JOptionPane.ERROR_MESSAGE );
                }

Da erro:

must be caught or declared to be throw

Onde estou errando?

Spool

Bom, deu certo agora…
Valew!

Agora minha duvida:

O DAO retorna um valor true ou false certo?

Como faço pra trabalhar com esse valor retornado?
No caso de true, por ex., onde coloco o codigo pra fechar a janela de login e abrir a janela principal?

Valew por enquanto.

Spool

Spool:
Bom, deu certo agora…
Valew!

Agora minha duvida:

O DAO retorna um valor true ou false certo?

Como faço pra trabalhar com esse valor retornado?
No caso de true, por ex., onde coloco o codigo pra fechar a janela de login e abrir a janela principal?

Valew por enquanto.

RESOLVIDO!

if ( dao.validateLogin( model ) ) {

valew pela ajuda cara!!!

abraços!

Criado 5 de maio de 2006
Ultima resposta 8 de mai. de 2006
Respostas 14
Participantes 2