validação de dados login/senha

criei 2 classes uma de conexão e outra dao

como eu conseguiria fazer uma validação de login/senha com essas duas classes

conexão
```
package semeq;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author SpiriT
 */
public class ConnectionFactory {

private static final String DRIVER = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/helpsemeq";
private static final String USER = "root";
private static final String PASS = "";

public static Connection getConnection(){

    try {
        Class.forName(DRIVER);
        return DriverManager.getConnection(URL, USER, PASS);     

    } catch (ClassNotFoundException | SQLException ex) {
       throw new RuntimeException("Erro na conexão: ",ex);
    }
}

public static void closeConnection(Connection con){

        try {
            if(con != null){
            con.close();
        } 

        }catch (SQLException ex) {
             Logger.getLogger(ConnectionFactory.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


public static void closeConnection(Connection con, PreparedStatement stmt){

    closeConnection(con);

        try {
            if(stmt != null){
            stmt.close();
        } 

        }catch (SQLException ex) {
            Logger.getLogger(ConnectionFactory.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

public static void closeConnection(Connection con, PreparedStatement stmt, ResultSet rs){

    closeConnection(con, stmt);

        try {
            if(rs != null){
            rs.close();
        } 

        }catch (SQLException ex) {
            Logger.getLogger(ConnectionFactory.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

classe do DAO

Amigo, vc duplicou o post, cuidado para não acontecer isso.

Respondi no outro:

Amigo, vc vai ter que filtrar por usuário e senha digitada.
Não testei o código, é só pra vc ter uma idéia, também não citei melhores práticas como por exemplo usar o PreparedStatement

Pensando que jTextField1 será onde será digitado o login
e
jTextField2 será onde será digitado a senha.

Vamos lá:
Ex:

public void validaLogin(){
  ConnectionFactory con = new ConnectionFactory();
  con.getConnection();
  String sql = "SELECT login,senha FROM usuário where login = '"+jTextField1.getText()+"' and  senha = '"+jTextField2.getText()+"'";
 
  PreparedStatement select = con.prepareStatement(sql);
  ResultSet resultado = select.executeQuery();

    //Se houver resultado, ou seja, se validar o usuario e senha, faça algo.
    if (resultado.next()){ 
         System.out.println("Login Feito com sucesso.");
    }else {
         System.out.println("Acesso negado.");
   }
}

Teste aí de acordo com sua necessidade e nos retorne caso dê algum erro.

Dicas:
Evite usar acentos em nome de tabelas no banco de dados, ao invés de ‘usuário’, poderia ser só ‘usuario’.
Dá uma liga depois no link que coloquei ali acima, passar parametros por esse método é mto mais seguro e evita o SQL Injection.

opa mano apareceu esses erros nessas linhas.
;
PreparedStatement select = con.prepareStatement(sql); ( cannot find symbol, eu teria que criar um metodo? vc poderia me dar um exemplo?)

ResultSet resultado = select.executeQuery();

if (resultado.next()){

essas duas linhas estão dando esse error: unreported exception SqlException must be caught or thrown.

e peço desculpas pelo duplo post no momento em que estava criando o post cliquei em enviar antes de terminar ;(

Fiz umas mudanças no seu codigo.
Antes de mais nada, entendo que seu banco está configurado certinho.

Criei um banco e uns dados conforme o seu, note que tirei o acento da tabela usuário, ficando usuario.

create database helpsemeq;
use helpsemeq;

create table usuario(
login varchar(100),
senha varchar(100)
);
insert into usuario (login,senha) values ('marcos','teste');

Fiz umas alterações na classe ConnectionFactory; só pra retornar algumas coisas mais fáceis. Note que na URL coloquei uns parametros (só funciona pro MYSQL), mas só pra evitar problemas futuros ou mensagens. Tem um método tbm pra ficar mais fácil usar depois, é o executeSQL();

COLOQUE SUA SENHA DO BANCO

package teste;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ConnectionFactory {

    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/helpsemeq"+"?verifyServerCertificate=false&useSSL=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=America/Sao_Paulo";
    private static final String USER = "root";
    private static final String PASS = "senha";
    private static Connection conexao;
    public Statement statement;
    public ResultSet resultset;

    public boolean getConnection() {
        boolean result = true;
        try {
            Class.forName(DRIVER);
            conexao = DriverManager.getConnection(URL, USER, PASS);
            result = true;
        } catch (ClassNotFoundException | SQLException ex) {
            result = false;
            throw new RuntimeException("Erro na conexão: ", ex);
        }
        return result;
    }

    public static void closeConnection(Connection con) {
        try {
            if (con != null) {
                con.close();
            }
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionFactory.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void closeConnection(Connection con, PreparedStatement stmt) {
        closeConnection(con);
        try {
            if (stmt != null) {
                stmt.close();
            }
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionFactory.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void closeConnection(Connection con, PreparedStatement stmt, ResultSet rs) {
        closeConnection(con, stmt);
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException ex) {
            Logger.getLogger(ConnectionFactory.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void executeSQL(String sql) {
        try {
            statement = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            resultset = statement.executeQuery(sql);
        } catch (SQLException sqlex) {
            System.out.println("Não foi possivel executar o comando: \n" + sqlex + "\n o sql passado foi: \n" + sql);
        }
    }
}

Aí criei uma telinha com dois campos, jTextField1 e jTextField2. E um botão: jButton1

o jButton1 executa o método:

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        validaLogin();
    }

que é :

public void validaLogin(){
        try {
            ConnectionFactory conn = new ConnectionFactory();
            conn.getConnection();
            
            String sql = "SELECT login,senha FROM usuario where login = '" + jTextField1.getText() + "' and  senha = '" + jTextField2.getText() + "'";
            conn.executeSQL(sql);

            //Se houver resultado, ou seja, se validar o usuario e senha, faça algo.
            if (conn.resultset.next()) {
                System.out.println("Login Feito com sucesso.");
            } else {
                System.out.println("Acesso negado.");
            }
        }catch(SQLException e){
            System.out.println("Erro: "+e);
        }
    }

Segue um modelinho que fiz no netbeans pra ganhar mais tempo.

modelo.zip (959,8 KB)

1 curtida

unreported exception SqlException must be caught or thrown.

Esse erro é lançado geralmente quando não se coloca um conteúdo no try / Catch.

1 curtida

opa marcos eu criei o db no xamp adicionei o user a senha, mas ta dando error

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Erro na conexão: 
	at semeq.ConnectionFactory.getConnection(ConnectionFactory.java:30)
	at semeq.NewJFrame.validaLogin(NewJFrame.java:146)
	at semeq.NewJFrame.jButton1ActionPerformed(NewJFrame.java:97)
	at semeq.NewJFrame.access$000(NewJFrame.java:14)
	at semeq.NewJFrame$1.actionPerformed(NewJFrame.java:51)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6539)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6304)
	at java.awt.Container.processEvent(Container.java:2239)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
	at java.awt.Container.dispatchEventImpl(Container.java:2283)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
Caused by: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:925)
	at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1704)
	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1250)
	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2465)
	at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2498)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2283)
	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:822)
	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)
	at java.sql.DriverManager.getConnection(DriverManager.java:664)
	at java.sql.DriverManager.getConnection(DriverManager.java:247)
	at semeq.ConnectionFactory.getConnection(ConnectionFactory.java:26)
	... 40 more

Agora está dando erro de acesso ao banco. Usuário ou senha estão errados.

private static final String USER = "root";
private static final String PASS = "senha";

pelo seu exemplo anterior, seria.:

private static final String USER = "root";
private static final String PASS = "";
1 curtida

realmente kk me passei, muito obrigado man, eu estou estudando java na faculdade e até o momento não tive nada com relação a isso de interação com banco de dados eu estou bem perdido com isso de sql statement/ executequery
você tem algum artigo ou algo que eu possa estudar mais sobre isso?
mt obrigado mesmo.

@marcospaulo.suporte

opa man você pode me tirar mais uma dúvida?
Bom caso eu queira em uma tela fazer um insert ao clicar em um button ou um alter table para mudar um dados
no caso eu teria que além de pegar login e senha qunado faz o login eu teria que por um ex: id do usuario?

para qnd eu alterar ou adicionar salvar com o id desse user.

e outra dúvida caso como eu conseguiria colocar todo esse metodo que está no jframe em apenas um metodo ( no connectionfactory )

public void executeSQL(String sql) como eu adicionaria os jtextfield nessa parte?

1 curtida

Bom caso eu queira em uma tela fazer um insert ao clicar em um button ou um alter table para mudar um dados

A lógica seguirá sendo quase a mesma, vc entende um pouco de Banco de dados? Sabe como fazer uma inserção (INSERT) e uma alteração (UPDATE) ?

no caso eu teria que além de pegar login e senha qunado faz o login eu teria que por um ex: id do usuario?

sim, isso é uma boa prática, no exemplo que fiz, foi só pra fins academicos mesmo. O ideal é ter um ID sim. Inclusive pra vc recuperar e ver qual usuário. Ter tbm uma chave primária.

e outra dúvida caso como eu conseguiria colocar todo esse metodo que está no jframe em apenas um metodo ( no connectionfactory )

Isso não é uma boa prática. Essa classe é de conexão com o banco. Qual sua necessidade?

realmente pensei melhor acho desnecessário andei procurando e vi que o melhor seria criar uma classe para salvar o id do usuario
e um dao (não tenho muito conhecimento) ( se vc poder me dar um help)

sim sim eu sei sobre insert alter table e etc.

A lógica pra alterar a senha seria bem parecido, imagine que vc tenha um botão na tela do login que é pra alterar senha, vc poderia chamar o método abaixo por exemplo:

public void alterarSenha() {
        try {
            ConnectionFactory conn = new ConnectionFactory();
            conn.getConnection();
            String sql = "SELECT id,login,senha FROM usuario where login = '" + jTextField1.getText() + "' and  senha = '" + jTextField2.getText() + "'";
            conn.executeSQL(sql);

            //Se houver resultado, ou seja, se validar o usuario e senha, faça algo.
            if (conn.resultset.next()) {
                System.out.println("Você pode alterar a senha.");
                int id = conn.resultset.getInt("id");

                String novaSenha = JOptionPane.showInputDialog("Digite sua Senha nova por favor \n");
                String novaSenhaConfirma = JOptionPane.showInputDialog("Confirme a nova senha por favor \n");

                if (novaSenha.equals(novaSenhaConfirma)) {
                    String update = "UPDATE usuario SET senha='" + novaSenha + "' WHERE id = " + id + "";
                    conn.statement.executeUpdate(update);
                    JOptionPane.showMessageDialog(rootPane, "Senha alterada com sucesso...");
                } else {
                    JOptionPane.showMessageDialog(rootPane, "As duas senhas digitadas não são a mesma, tente novamente por favor");
                }
            } else {
                System.out.println("Acesso negado.");
            }
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "Erro: \n" + e.getMessage());
        }
    }

Novamente, peguei seu exemplo como amostra.
O correto seria usar PreparedStatement, fiz só pra vc ver o uso mesmo.

Lembrando que nesse caso, vc tenha um ID na sua tabela usuario, algo como:

create table usuario(
id int not null auto_increment primary key,
login varchar(100) unique,
senha varchar(100)
);

Exemplo via DAO, seguindo seu modelo:

public class daoSemeq {

    ConnectionFactory conn = new ConnectionFactory();
    private ResultSet rs;
    private Statement stm;

    public daoSemeq() {

    }

    public void alterarSenhaPorId(int id, String novaSenha) {
        try {
            conn.getConnection();
            String sql = "SELECT id,login,senha FROM usuario where id = " + id;
            conn.executeSQL(sql);
            if (conn.resultset.next()) {
                System.out.println("Você pode alterar a senha.");
                String update = "UPDATE usuario SET senha='" + novaSenha + "' WHERE id = " + id + "";
                conn.statement.executeUpdate(update);
            } else {
                System.out.println("Acesso negado.");
            }
        } catch (SQLException e) {
            System.out.println("Erro: " + e);
        }
    }

    public void alterarSenhaPorString(String usuario, String senha, String novaSenha) {
        try {
            conn.getConnection();
            String sql = "SELECT id,login,senha FROM usuario where login = '" + usuario + "' and  senha = '" + senha + "'";
            conn.executeSQL(sql);
            if (conn.resultset.next()) {
                int id = conn.resultset.getInt("id");
                String update = "UPDATE usuario SET senha='" + novaSenha + "' WHERE id = " + id + "";
                conn.statement.executeUpdate(update);
                System.out.println("Senha alterada com sucesso.");
            } else {
                System.out.println("Acesso negado.");
            }
        } catch (SQLException e) {
            System.out.println("Erro: " + e);
        }
    }
}

Aí vc pode chamar esses métodos via ação de botão ou do jeito que vc quiser, exemplo:

private void botaoDaoActionPerformed(java.awt.event.ActionEvent evt) {                                         
        daoSemeq daoUser = new daoSemeq();
        String user = jTextField1.getText();
        String passwd = jTextField2.getText();
        String newPasswd = jTextField3.getText();
        
        daoUser.alterarSenhaPorString(user,passwd,newPasswd);
    }     

Se fosse informar o id, vc poderia usar o outro método que fiz na classe daoSemeq…:wink:

teste.zip (971,9 KB)

1 curtida

opa mano mt obrigado mano, estou conseguindo entender mt mais sobre, vou procurar mais sobre jdbc, se você puder me indicar algo sobre, para aprender mais sobre essas conexão de java com bd.

E oque você acha sobre criar uma class para guardar o id do usuario?
ex:

class Usuario {
    Long id;
    public Usuario(Long id) {
        this.id = id;
    }
}

pq estou pensando em fazer um historico de requisições e para alterar seguiria mesma logica do que você falou assim pelo id, ou isso é desnecessário?

Bom dia,

pq estou pensando em fazer um historico de requisições e para alterar seguiria mesma logica do que você falou assim pelo id, ou isso é desnecessário?

Umas das formas é vc trabalhar com variáveis globais, dizem não ser uma boa prática. Pessoalmente já usei mto e tem muita gente que usa, então cabe vc escolher e ver o que acha melhor.

Outra recomendação é vc usar ‘design pattern singleton’

public class Usuario {
    // Variável estática que conterá a instancia da classe
    private static Usuario instance;

    // Construtor privado (suprime o construtor público padrão).
    private Usuario() {}

    // Método público estático de acesso único ao objeto!
    public static Usuario getInstance() {
        if (instance == null)
            instance = new Usuario();
        return instance;
    }

    /*
    Pode usar métodos, getters e setters, etc....
    */
    }

Aí na sua classe o Login.

Então na sua classe de Login , você instancia o objeto Usuario:

Usuario usuario = Usuario.getInstance();
// Aqui vc popula os atributos.

Dessa forma vc consegue pegar as informações sempre que quiser, se quiser por exemplo guardar o ID do usuario.

opa vlw mano
será que vc poderia dar uma força ?


eu estou com um problema
nessa linha
conn.executeSQL(sql);
no java fx

Qual retorno do erro ?

opa mano com relação a guarda o valor da variável id para outras telas vc poderia me dar uma ajuda?

public class Usuario {
private static Usuario instance;
private Long id;
private String login;
private String senha;
public Usuario(Long id, String login, String senha){
this.id=id;
this.login=login;
this.senha=senha;
}
public Usuario(String login, String senha){
this.login=login;
this.senha=senha;
}
public Usuario(Long id){
this.id = id;
}
   public void setId(Long id){
    this.id=id;
}
public Long getId(){
    return id;
}
public Usuario(){
}
public static Usuario getInstance() {
    if (instance == null){
        instance = new Usuario();
        }
    return instance;
}

eu fiz isso que você me falou na classe de usuario instanciei ele na tela login:`

public void start(Stage stage) throws Exception {
    Usuario login = Usuario.getInstance();

agr estou com dúvida do que fazer no meu metodo para guardar esse id na classe usuario, o meu metodo de validação de login está assim:

public void validaLogin(){
    UsuarioDAO dao = new UsuarioDAO();
    List<Usuario> usuarios = dao.getList();
    
    for(int x = 0; x< usuarios.size(); x++){
        if(jLogin.getText().equals(usuarios.get(x).getLogin()) && jSenha.getText().equals(usuarios.get(x).getSenha())){
            Principal pr = new Principal ();
            x = usuarios.size();
            fecha();
            try {
                Usuario login = Usuario.getInstance();
                pr.start(new Stage());
            } catch (Exception ex) {
                Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else{
            if(x == usuarios.size()-1){
                Alert al = new Alert(Alert.AlertType.ERROR);
                al.setHeaderText("Login Invalido");
                al.show();
            }
        }
    }
}

e a minha classe DAO:

public class UsuarioDAO  {
private Connection con;
public UsuarioDAO(){
this.con = new ConnectionFactory().getConnection();
}
public boolean add(Usuario u){
String sql = "INSERT INTO usuario(login,senha) VALUES(?,?)";
try{
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1, u.getLogin());
stmt.setString(2, u.getSenha());
stmt.execute();
stmt.close();
con.close();
return true;
} catch (SQLException ex){
Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
}
public boolean update(Usuario u){
String sql = "UPDATE usuario set senha = ? WHERE id_usuario=?";
try{
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1, u.getSenha());
stmt.setLong(2, u.getId());
stmt.execute();
stmt.close();
con.close();
return true;
} catch (SQLException ex){
Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
}
public boolean delete(Usuario u){
String sql = "DELETE  FROM usuario WHERE id_usuario=?";
try{
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setLong(1, u.getId());
stmt.execute();
stmt.close();
con.close();
return true;
} catch (SQLException ex){
Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
}
public List<Usuario> getList(){
   List<Usuario> usuarios = new ArrayList<>();
   String sql = "SELECT * FROM usuario";
try {
    PreparedStatement stmt = con.prepareStatement(sql);
    ResultSet rs = stmt.executeQuery();
    while(rs.next()){
        Usuario u = new Usuario();
        u.setId(rs.getLong("id_usuario"));
        u.setLogin(rs.getString("login"));
        u.setSenha(rs.getString("senha"));
        usuarios.add(u);
    }
    stmt.close();
    rs.close();
    con.close();  
} catch (SQLException ex) {
    return null;
}
return usuarios;
}    
}

mas eu ainda não consigo guardar o id .

Não é uma boa pratica “pelo menos na minha humilde opinião”, porque na hora do login você jã não guarda o ID do usuário por exemplo, um get e settes dele e acessa ele de qualquer outra classe.

No form de login, no metodo que valida, se for valido o usuario e senha e for para ação caso a condição seja verdadeira na hora que instacia a classe exemplo TelaPrincipal(); você já passa esse id para ela ficar guardado.

TelaLogin
private static int id_usuario;

public void recebe_dadosUsuario(int idUsuario)
{
id_usuario = idUsuario;
}

Na tela Login

//Chama a TELA PRINCIPAL
Main ScreenMain = new Main();
ScreenMain.setVisible(true);
ScreenMain.recebe_dadosUsuario(connect.rs.getInt(“id”));

Agora você já vai ter ela guarda no form da tela principal, qualquer coisa você só joga ela no settes e gettes para usar em qualquer classe pois já vai ter o dado ali.

Use por sua conta e risco, quebro um galho até eu conseguir resolver, qualquer coisa manda mais informações do seu problema para ajudar a resolver da maneira correta.

1 curtida

opa eu já tinha resolvido

eu tive mais ou menos uma mesma ideia
criei um singleton que guarda todos os dados .

1 curtida