Ajuda tela login mysql e java

9 respostas
T

Olá pessoal preciso de uma ajuda, criei uma tela de login conforme segue abaixo;

public class ConexaoMysql extends javax.swing.JFrame {  
  
     
       String driver = "com.mysql.jdbc.Driver";  
       String url = "jdbc:mysql://localhost:3306/fontana";     
       Connection Conexao;  
       PreparedStatement preparedStatement;
       ResultSet resultset;  
               
    public ConexaoMysql() {  
        initComponents();  
    }  
    public boolean conecta(String usuario, String senha)  
       {  
            boolean result = true;  
            try   
            {  
                Class.forName(driver);  
                Conexao = DriverManager.getConnection(url, usuario, senha);  
            }  
            catch(ClassNotFoundException Driver)   
            {  
               JOptionPane.showMessageDialog(null,"Driver não localizado: "+Driver);  
               Driver.printStackTrace();
               result = false;  
            }  
            catch(SQLException Fonte)   
            {  
                JOptionPane.showMessageDialog(null,"Deu erro na conexão "+  
                        "com a fonte de dados: "+Fonte);  
                Fonte.printStackTrace();
                result = false;  
            }  
            return result;   
       }  
   public void desconecta()  
       {  
            boolean result = true;  
            try   
            {  
                Conexao.close();  
                JOptionPane.showMessageDialog(null,"banco fechado");  
            }  
            catch(SQLException fecha)   
            {  
                JOptionPane.showMessageDialog(null,"Não foi possível "+  
                        "fechar o banco de dados: "+fecha);  
                fecha.printStackTrace();
                result = false;  
            }  
  
       }  
    public void executeSQL(String sql)    
           {    
                try     
                {    
                    resultset = preparedStatement.executeQuery(sql);    
                }    
                catch(SQLException sqlex)     
                {    
                   JOptionPane.showMessageDialog(null,"Não foi possível "+    
                           "executar o comando sql,"+sqlex+", o sql passado foi "+sql);   
                   sqlex.printStackTrace();
                 }  
           }  
             
    
    private void bt_acessarActionPerformed(java.awt.event.ActionEvent evt) {  
        try  
        {  
        String usuario = tf_usuario.getText();  
        String senha = jtf_senha.getText();  
        conecta(usuario, senha);  
        new tela_principal().show();  
    }  
    catch (Exception erro)  
    {  
        JOptionPane.showMessageDialog(null,"Erro de compilação de usuário ou senha"+erro); 
        erro.printStackTrace();
    }  
    }

Assim ele deveria abrir minha tela principal, só que na tela principal ele tem o código abaixo;

public class tela_principal extends javax.swing.JFrame {  
      
    MaskFormatter maskDataReg;  
      
    data_hora mostra_data;  
  
    ConexaoMysql con_lancamentos, con_empreiteiros, con_obras, con_servicos, con_competencias;

Só que pra mim chamar conecta do ConexaoMysql fazendo desse jeito;

con_lancamentos = new ConexaoMysql();  
           con_lancamentos.conecta();  
           con_lancamentos.executeSQL("select * from lancamentos order by lan_codigo");

O Conecta fica em erro, como posso solucionar aqui, pois teria que digitar novamente o usuário e senha?
Ou como posso mudar na tela de ConexaoMysql para que toda vez que eu acesse ele já fique com o usuário e senha, pensei em uma classe com get e set, ta certo?

9 Respostas

ribclauport

Crie um Factory para sua Conexão, e ae use ela Dentro de sua classe...

Um exemplo bem simplista de uma Classe de conexão abaixo.

public class ConnectionFactory {
	public static Connection getConnection() throws SQLException {
		try {
			Class.forName("com.mysql.jdbc.Driver");

			return DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/livraria", "root", "root");
		} catch (ClassNotFoundException e) {
			throw new SQLException(e.getMessage());
		}

	}
}

Veja que essa classe tem um método estático, sendo assim é so chamar o mesmo no seu método!.
Na minha visão sua classe não deve ter umm atributo do tipo conexão entende... ae voce faz um método como abaixo que "pede" para a classe
fabrica de conexões uma conexão, ficaria algo como abaixo:

public List getLancamentos() {
		List<String> lanc = new ArrayList<String>();
		Connection conex = null;
		Statement st;
		try {
			conex = ConnectionFactory.getConnection();
			ResultSet rs;
			st = conex.createStatement();
			rs = st.executeQuery("select .....");//seu select aqui!!!!!!!!!!!!
			while (rs.next()) {
                        //******Aqui voce popula a lista************
				System.out.println(rs.getString(1));
			}
		} catch (SQLException e) {
			e.printStackTrace();

		} finally {
			try {
				if (conex != null && !conex.isClosed())
					conex.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lanc;
	}

Quanto ao login, eu faria um metodo em uma classe utilitária, que seria responsavel por receber, o usuário e senha, e desta forma devolveria true ou false para o mesmo, desta forma voce loga uma vez e enquanto a aplicação estiver em pé, o mesmo pode usar o sistema...

Espero ter ajudado.

T
ribclauport:
Crie um Factory para sua Conexão, e ae use ela Dentro de sua classe...

Um exemplo bem simplista de uma Classe de conexão abaixo.

public class ConnectionFactory {
	public static Connection getConnection() throws SQLException {
		try {
			Class.forName("com.mysql.jdbc.Driver");

			return DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/livraria", "root", "root");
		} catch (ClassNotFoundException e) {
			throw new SQLException(e.getMessage());
		}

	}
}

Veja que essa classe tem um método estático, sendo assim é so chamar o mesmo no seu método!.
Na minha visão sua classe não deve ter umm atributo do tipo conexão entende... ae voce faz um método como abaixo que "pede" para a classe
fabrica de conexões uma conexão, ficaria algo como abaixo:

public List getLancamentos() {
		List<String> lanc = new ArrayList<String>();
		Connection conex = null;
		Statement st;
		try {
			conex = ConnectionFactory.getConnection();
			ResultSet rs;
			st = conex.createStatement();
			rs = st.executeQuery("select .....");//seu select aqui!!!!!!!!!!!!
			while (rs.next()) {
                        //******Aqui voce popula a lista************
				System.out.println(rs.getString(1));
			}
		} catch (SQLException e) {
			e.printStackTrace();

		} finally {
			try {
				if (conex != null && !conex.isClosed())
					conex.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return lanc;
	}

Quanto ao login, eu faria um metodo em uma classe utilitária, que seria responsavel por receber, o usuário e senha, e desta forma devolveria true ou false para o mesmo, desta forma voce loga uma vez e enquanto a aplicação estiver em pé, o mesmo pode usar o sistema...

Espero ter ajudado.

Cara sobre a conexão eu teria que fazer para todas as tabelas aquilo que você mandou??
pois tenho além de lancamentos, tenho empreiteiros, obras.... e por ai vai.
Sobre a classe utilitaria acredito que foi isso que fiz, estou usando OO

ViniGodoy

Tópico movido para o fórum de interface gráfica.

Por que você retorna só List, e não List<String>?

ribclauport

Tem razão, aliás se é getLancamentos, deveria ser algo do tipo List<Lancamentos>…
Foi erro mesmo ali na hora de exemplificar.

ribclauport

Veja bem, sua classe se chama ConexaoMysql e herda de javax.swing.JFrame, desta forma poderiamos fazer a seguinte afirmação:

Uma conexão mysql “é um” JFrame.

E depois você tem a classe: tela_principal que “tem um” ConexaoMysql , acredito que você não esta usando OO, e sim causando uma baixa “coesão” neste seu modelo, ou seja sua classe que é responsável por devolver conexão, também é responsável por efetuar login, que também é responsável por executar um sql…
Se está querendo saber qual seria a implementação mais indicada, eu acredito que deveria pesquisar coisas do tipo: “DAOFactory”, “DAO”, além de outros “padrões”…

T

Certo, você me passou ali para um exemplo simples de conexão, só que ali você já coloca root e root, só que eu gostaria de acessar com um usuário e senha e não com um senha ali já. Ou como faço se criar uma tabela para usuário e senha e setor, só que precisaria dar limitações a esse usuário.

ribclauport

Na realidade, acredito que a conexão deva “pegar”, usuário e senha de um “properties”, e na realidade o mais indicado é usar um “Data Source”, para a conexão, o quao irá oferecer um “pool de conexões”, no caso de “acessar”, use um prepared statement, o qual será usado com dados vindos de sua “entrada” no caso pode ser uma view… veja o trecho de codigo abaixo para ter uma noção:

ResultSet rs;

PreparedStatement p = conex.prepareStatement("SELECT COUNT(username) FROM login WHERE username=? and pwd=?");
p.setString(1, usuarioVindoDaView);
p.setString(2, senhaVindoDaView);
			
rs = p.executeQuery();
			
if(rs.next())
     //faz aqui as regras de login

Prefira esse tipo de abordagem para evitar “sql injection”.

T

ribclauport:
Na realidade, acredito que a conexão deva “pegar”, usuário e senha de um “properties”, e na realidade o mais indicado é usar um “Data Source”, para a conexão, o quao irá oferecer um “pool de conexões”, no caso de “acessar”, use um prepared statement, o qual será usado com dados vindos de sua “entrada” no caso pode ser uma view… veja o trecho de codigo abaixo para ter uma noção:

ResultSet rs;

PreparedStatement p = conex.prepareStatement("SELECT COUNT(username) FROM login WHERE username=? and pwd=?");
p.setString(1, usuarioVindoDaView);
p.setString(2, senhaVindoDaView);
			
rs = p.executeQuery();
			
if(rs.next())
     //faz aqui as regras de login

Prefira esse tipo de abordagem para evitar “sql injection”.

Certo, ali ele vai verificar usuário e senha pela tabela, e como farei pra dar permissão para o usuário x da tabela login na linha y da coluna z da tabela lancamento?.

ribclauport

Na verdade você está falando de perfis de acesso, desta forma cada usuário tem um perfil, e dependendo do seu perfil, você vai restringir operações para o mesmo, existe n formas de implementar isso!, acredito que o post abaixo vai dar uma idéia para você por onde começar.

http://www.guj.com.br/java/218387-tabela-db-permicoes-de-acesso-o-que-voces-acham-que-e-melhor

De uma olhada nesse post e qualquer coisa pergunte novamente.

Criado 23 de março de 2012
Ultima resposta 26 de mar. de 2012
Respostas 9
Participantes 3