Ajuda com uma estrutura de um codigo sql

String matricula = "SELECT matricula.id_matricula matricula.numero_computador FROM usuario,matricula where usuario.id_usuario= " + Sessao.getInstancia().getUsuario().getId() + "  and usuario.idmatricula = " + Sessao.getInstancia().getUsuario().getMatricula() + "";    

tou com dúvida em como estrutura esse codigo sql
bom primeiro ele compara o id_usuario com o id do usuario logado e depois compara o idmatricula com o id da matricula do usuario logado (sei que isso é desnecessario ), minhas dúvida é como eu faria com esses 2 dados essa comparação:
usuario.idmatricula = matricula.id_matricula

Não sei se resolveria seu problema, mas você ja pensou em usar este campo como foreign key? Daí, ele como chave estrangeira você conseguiria manipulá-lo melhor, creio eu… :thinking:

mas já é chave estrangeira mano,
eu queria buscar essa chava com o id do usuario q eu guardo no singleton
mas não estou sabendo como fazer .

(essa é a conta q eu utilizo no meu trabalho)

Acredito que um simples join resolva!

Exemplo:

SELECT 
	m.id_matricula, 
	m.numero_computador 
FROM 
	usuario u
INNER JOIN 
	matricula m ON(u.idmatricula = m.id_matricula)
WHERE 
	u.id_usuario =  //Informe ID do usuário logado
AND u.idmatricula = //Informa ID da matrícula do usuário logado
2 curtidas

deu certo mano mt obrigado.

Você poderia me tirar mais uma dúvida?

Bom eu tenho a tabela permissão que tem o id / nome da permissão
e a tabela matricula que tem o id / o numero da matricula / numero do computador

tou com dúvida ao criar uma conta como eu faria esses insert’s

pq a tabela usuario recebe as chaves estrangeira de matricula / numero computador

eu sei que terei que fazer um commit de todos os insert’s , mas não tenho ideia a logica que vou usar nesses insert’s pois terá que ser em tabelas diferentes.

como está o meu diagrama:

Antes de cadastrar um novo usuário já devem existir registros na tabela matrícula e permissão, com isso basta informar os ID’s de matrícula e permissão no insert de usuário.

Exemplo:

INSERT INTO MATRICULA(id_matricula, numero_computador) VALUES(1, 1234); --Inserindo uma matrícula
INSERT INTO PERMISSAO(id_matricula, numero_computador) VALUES(1, 'Categoria 1'); --Inserindo uma permissão
INSERT INTO USUARIO(id_usuario, idpermissao, login, senha, nome, numero_computador, idmatricula) VALUES(1, 1, 'admin', 'admin', 'Administrador', 1234, 1); --Inserindo um usuário

opa vlw mano

mesmo esse id matricula e id permissão sendo auto increment?
pq id permissão eu coloquei como auto increment
e matricula também
permissão creio que não fosse necessário, mas matricula acho que sim, por que vão ser muitos registros.

Se são auto incrementais você não precisa passá-los, o próprio BD gerencia isso pra você nesse caso.

A única coisa é, obtenha os ID’s das chaves estrangeiras de matrícula e permissão antes de inserir o usuário, o resto segue o mesmo padrão pra tudo.

você pdoeria me dar um help de como faria isso? estou meio travado nessa parte.

Sem saber no que exatamente você está com dificuldade e como estão os seus códigos fica difícil te dar um help…

Imagino que você tenha uma tela para cadastrar os usuários certo?
Nessa tela você deve ter os campos para que sejam informados a matrícula e a permissão certo?
Basta pegar os valores destes dois campos, validar se eles são valores válidos no BD (Um SELECT simples), caso não sejam válidos informe o usuário, e se forem válidos faça o INSERT normalmente igual já te mostrei em uma resposta anterior.

sim vou tentar
no caso seria a tela de cadastro de administrador
a pessoa iria cadastrar a matricula o numero do computador
e a categoria da pessoa (usuario nroaml, estagiario, adm)
então eu tive algumas ideias
como dar insert na tabela matricula e guardar as chaves com ```
RETURN_GENERATED_KEYS

vou testar pra ver
String sql= "INSERT INTO MATRICULA(numero_matricula, numero_computador) VALUES(?, ?)";
PreparedStatement stmt;
try{
    stmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    stmt.setString(1, getMatricula());
    stmt.setString(2, getNumero_computador());
    stmt.executeUpdate();
	ResultSet rs = stmt.getGeneratedKeys();
    rs.next();
    int idGerado = rs.getInt(1);
    matricula.setId(idGerado);

ficaria algo assim, minha dúvida é como eu conseguiria commitar isso junto com esses outros 2 insert’s

Se esta forma que você implementou estiver funcionando, não tem segredo em aplicar o commit, pois todos os 3 inserts vão estar contidos na mesma transação!

1 curtida

opa man essa forma deu certo, mas encontrei um problema no segundo insert
ele funciona normalmente recebe todos os valores certinho, mas na hora de inserir não vai:

public  boolean cadastrar(Usuario u, Matricula m) throws SQLException {     
    PreparedStatement matricula = con.prepareStatement("INSERT INTO MATRICULA(numero_matricula, numero_computador) VALUES(?, ?)",PreparedStatement.RETURN_GENERATED_KEYS);
    matricula.setInt(1, m.getNumero_matricula());
    matricula.setInt(2, m.getNumero_computador());
    try {
    con.setAutoCommit(false);
    matricula.executeUpdate();
    ResultSet rs = matricula.getGeneratedKeys();
    rs.next();
    Long idGerado = rs.getLong(1);
    Sessao.getInstancia().getMatricula().setId_matricula(idGerado);
    PreparedStatement cadastrar = con.prepareStatement("INSERT INTO USUARIO(idpermissao,idmatricula, login, senha, nome) VALUES("+u.isAdm()+","+idGerado+",?,?,?)");
    cadastrar.setString(1, u.getLogin());
    cadastrar.setString(2,u.getSenha());
    cadastrar.setString(3,u.getNome());
    cadastrar.executeUpdate();
    }catch(Exception e){
        con.rollback();
        return false;
        }
        con.commit();
        return true;
    }

e o pior não apresenta nenhum error.
vai direto para essa parte do meu codigo:

else {
                alertar.alertUsuarioNCadastrado();


  public void testar() throws SQLException{
        int matriculax = Integer.parseInt(txtMatricula.getText()), computador = Integer.parseInt(txtComputador.getText());
        String login = txtLogin.getText(), senha = txtSenha.getText(), confirm = confirmSenha.getText(), nome = txtNome.getText();
        Usuario usuario = new Usuario(login, senha);
        usuario.setNome(nome);
        if(cADM.isSelected()){
            usuario.setAdm(1);
        }
        if(cNormal.isSelected()){
            usuario.setAdm(3);
        }
        if(cEsta.isSelected()){
            usuario.setAdm(2);
        }
        UsuarioDAO usuarioDAO = new UsuarioDAO();
        Matricula matricula = new Matricula(matriculax,computador);
        Alerts alertar = new Alerts();
        if (txtLogin.getText().trim().isEmpty() || txtSenha.getText().trim().isEmpty()) {
            alertar.alertCadastroVazio();
        }else if (senha.equals(confirm)) {
            if (aFachada.getInstancia().incluirUsuario2(usuario,matricula)) {
                alertar.alertUsuarioCadastrado();
            } else {
                alertar.alertUsuarioNCadastrado();
            }
        } else {
                alertar.alertSenhaDif();
        }
    }

Consegui resolver o problema é que tinha um campo online que não aceita nulo .