Problema em INSERT em tabelas relacionadas

Boa tarde pessoALL.

Cheguei ao meu limite com o problema de um INSERT em tabelas relacionadas.

Como inserir dados em tabelas relacionadas?

Por exemplo:

tabela login

  • idLogin - PK
  • email
  • senha

tabela usuario

-idUsuario
-nome
-end
-telefone

  • idLogin - FK

Primeiro tenho que inserir os dados na tabela login depois em usuario
como faço para pegar o AUTO_INCREMENT da tabela login?
Lembrando que AUTO_INCREMENT é uma chave privada de login, que a cada inserção é
gerada a chave que vai identificar o email e senha
do usuario.

O meu código é um cadastro de usuário onde tenho os dados de usuário e login.
Após submeter a entrada primeiro ele insere os dados de login depois o dados de
usuário.

Ou seja como faço para pegar o AUTO_INCREMENT da tabela login "PK"e jogar no
INSERT da tabela usuário automatico.

1 - Primeiro estou usando a classe LoginDAO para fazer o ISERT

INSERT INTO login (email,senha) values(?,?)

2 - Segundo após o INSERT na tabela login tento fazer o insert na tabela usuario e ai que não estou conseguindo.

INSERT INTO usuario (nome,end,telefone //idLogin como faço para pegar o
autoIncremento? ) values(?,?,?,?)

public class Apresentacao<T> {
    
    public void cadastrarDados(T objeto) {
        
        if (objeto instanceof Usuario) {

            Usuario usuario = new Usuario();
            Login login = new Login();

            String nome = JOptionPane.showInputDialog("Nome :");
            usuario.setNome(nome);

            String endereco = JOptionPane.showInputDialog("Endereco :");
            usuario.setEndereco(endereco);

            String telefone = JOptionPane.showInputDialog("Telefone :");
            usuario.setTelefone(telefone);
            
            String email = JOptionPane.showInputDialog("E-mail :");
            login.setEmail(email);

            String senha = JOptionPane.showInputDialog("Senha :");
            login.setSenha(senha);

            LoginControle loginControle = new LoginControle();          
            UsuarioControle usuarioControle = new UsuarioControle();

            if (loginControle.verificarDados(login) && usuarioControle.verificarDados(usuario) ) {
                JOptionPane.showMessageDialog(null, "Usuario gravado com sucesso !");
            } else {
                JOptionPane.showMessageDialog(null, "Não possível gravar o usuario !");
            }

        }


    }
}

----------------------------------------------------------------------------------------------------------------------------

public class LoginControle {

    public boolean verificarDados(Login login) {
        LoginDAO loginDAO = new LoginDAO();
        if (loginDAO.inserirDados(login)) {
            return true;
        }
        return false;

        // loginDAO loginDAO = new LoginDAO(usuario);

    }
}

----------------------------------------------------------------

public class LoginDAO {

    public boolean inserirDados(Login login) {

        
        Connection con = Conexao.conectar();
        String inserir = "INSERT INTO login(email,senha) VALUES(?,?)";

        try {

            PreparedStatement pst = con.prepareStatement(inserir);

            pst.setString(1, login.getEmail());
            pst.setString(2, login.getSenha());
            pst.execute();
            con.close();
            return true;

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }


    }
}

------------------------------------------------------------------------------------------------------
public class UsuarioControle {
   
    public boolean verificarDados(Usuario usuario){
        UsuarioDAO usuarioDAO = new UsuarioDAO();
        if(usuarioDAO.inserirDados(usuario)){
            return true;
        }
        return false;
        
      // loginDAO loginDAO = new LoginDAO(usuario);
        
    }
    
    
    
}
--------------------------------------------------------------------------------------------------------

public class UsuarioDAO {
    
    
    
    

    public boolean inserirDados(Usuario usuario) {

        Connection con = Conexao.conectar();
        String inserir = "INSERT INTO usuario(nome,endereco,telefone,idLogin) values(?,?,?,?)"; // COMO FAÇO PARA PEGAR O IDLOGIN AUTO_INCREMENTO DA TABELA LOGIN
        try {

            PreparedStatement pst = con.prepareStatement(inserir);

            // pst.setInt(1, usuario.getCodigo());
            pst.setString(1, usuario.getNome());
            pst.setString(2, usuario.getEndereco());
            pst.setString(3, usuario.getTelefone());
            pst.execute();
            con.close();
            return true;

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }


    }
}

Então, este é um dos maiores problemas neste sentido.
Bom, há algumas opções, você pode inserir, fazer um select max(id), armazenar este numa variável e então fazer o insert na outra tabela.
Dois problemas, 1, se houver concorrência, não há como dizer se o último pertence ao usuário X ou Y que solicitaram a gravação.
Uma forma de tentar evitar isto é fazer um select com where, passando os dados como parâmetro. Performance, muito baixa.
Outra opção, caso você manipule o BD, é criar storedprocedure que faça tudo isso.
Mais trabalhoso, mas a performance é superior.