Formulario para Alteração

Minha grande dúvida é a seguinte:

Eu quero solicitar ao usuario alterar dados de Aluno, onde ele irá clicar em um outputlink “link” para ser direcionado à visualizar dados e alterar
mas para isso vou ter que passar um objeto aluno para o meu método alterar. O que eu não quero é o seguinte:

  • Criar uma variavel para pegar a chave primária da tabela, pois usando o UPDATE na cláusura WHERE vou ter comparar com uma chave primária
    exemplo: UPDATE aluno SET nome = “TTT” WHERE idAluno = ?;

Ou seja eu teria que fazer um SELECT para pegar o idAluno que é chave primaria, de posse com idAluno eu iria fazer um UPDATE e colocar Where idAlulno = variável.

Estou fazendo isso pq meu banco de dados as chaves primárias são AUTO_INCREMENTO.

Tem uma forma de solucionar isso?

Se eu criar um atributo com o mesmo nome da chave primaría resolveria?


  public boolean alterar(Aluno aluno) throws SQLException{
        Connection con = getConexao();   
        //verificar inconsistencia com o banco de dados chave primaria
        PreparedStatement ps = con.prepareStatement("UPDATE aluno SET nome = ?,endereco = ?,telefone = ?,estado = ?, cidade = ?,email = ?, WHERE nome = ?");
        ps.setString(1, aluno.getNome());
        ps.setString(2, aluno.getEndereco());
        ps.setString(3, aluno.getTelefone());
        ps.setString(4, aluno.getEstado());
        ps.setString(5, aluno.getCidade());
        ps.setString(6, aluno.getEmail());
        con.close();
        return ps.execute(); 
    }

Meu formulario terá NOME,ENDEREÇO,TELEFONE,ESTADO,CIDADE,EMAIL ao submeté-lo serei direcioando ao AlunoDAO de conexão:

nesse ponto que entra minha dúvida: será necessario fazer um select para pegar o idAluno que é chave primária pois o update so funciona quando é comparado a uma chave primaria
where idAluno = 100 por exemplo.

Por enquanto não gostria de usar Hibernate,

Tá, mas a tua escola usa o nome do aluno como informacao de login?

E se tiver dois alunos com nomes iguais?

Basicamente toda escola usa um número único de matrícula e os alunos se logam usando esse numero e
obviamente toda operação com banco usa esse número.

Pense nisso, não se tua aplicação é real, ou apenas acadêmica, mas seu id de aluno, mesmo que de autoincremento,
é um identificados único e deveria estar no form para ser digitado.

Ou abrir um form onde apareçam todos os alunos com o mesmo nome, outras informações e por fim, o ID para que
ele selecione aquele de quem ele se trata.

Ou coloque um nome de usuário único a escolha de cada aluno.

O minha dúvida e problema é o seguinte, vejam o codigo abaixo:


package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import visao.Aluno;

public class AlunoDAO extends Conexao {      
    
    public boolean adicionar(Aluno aluno) throws SQLException{
        Connection con = getConexao();   
        
        PreparedStatement ps = con.prepareStatement("INSERT INTO aluno VALUES(?,?,?,?,?,?,?,?)");
        ps.setString(1, aluno.getNome());
        ps.setString(2, aluno.getEndereco());
        ps.setString(3, aluno.getTelefone());
        ps.setString(4, aluno.getEstado());
        ps.setString(5, aluno.getCidade());
        ps.setString(6, aluno.getSenha());
        ps.setString(7, aluno.getInstituicao().getNome());
        ps.setString(8, aluno.getEmail());
        con.close();
        return ps.execute();        
        
    }
    
    public boolean alterar(Aluno aluno) throws SQLException{
        Connection con = getConexao();   

/**
 *  Na linha abaixo ao submeter meu FORMULÁRIO para alterar os dados do aluno terei que passar o ID do aluno para tal fim, mas o comando UPDATE
 *  só é possível fazer a alteração mediante a chave primária da tabela exemplo: WHERE idaluno = 100; onde idaluno é uma chave primária
 *  lembrando que minha tabela aluno sua chave primarária é idaluno AUTO_INCREMENT, agora uma pergunta?
 *  COMO SUBMETER AO FORMULARIO E FAZER A ALTERAÇÃO? PEGAR O ID DA TABELA ALUNO? CRIAR UM ATRIBUTO CODIGO NA CLASSE ALUNO E VINCULAR O CODIGO COMO
 *  UMA CHAVE PRIMARIA? COMO ISSO FUNCIONA? ALGUÉM PODE ME AJUDAR?
 */
        PreparedStatement ps = con.prepareStatement("UPDATE aluno SET nome = ?,endereco = ?,telefone = ?,estado = ?, cidade = ?,email = ?, WHERE idaluno = ?");
        ps.setString(1, aluno.getNome());
        ps.setString(2, aluno.getEndereco()); 
        ps.setString(3, aluno.getTelefone());
        ps.setString(4, aluno.getEstado());
        ps.setString(5, aluno.getCidade());
        ps.setString(6, aluno.getEmail());
        con.close();
        return ps.execute(); 
    }
   
    
}



Pelo que entendi, seu formulário é composto pelos dados de um aluno que o user selecionou, portanto você teve que fazer um SELECT através de um de seus métodos que compõe seu DAO, entao faça o seguinte, em seu AlunoDAO, faça o seguinte atributo:

private int id_aluno;

com isso, faça o set e get:

public void setId(int id)
{
   this.id_aluno = id;
}

public int getId()
{
   return id_aluno;
}

agora, no seu método de SELECT , faça com que retorne também o id_aluno:

String comando = "SELECT * FROM aluno";
ResultSet retorno = ....
...
...
while(retorno.next())
{
   ...
   ...
   aluno.setId(retorno.getInt("id_aluno));
}

Desse modo você terá o id do aluno em sua classe de DAO, podendo utilizálo no update:

...
ps.setInt(1,getId());
...

[quote=guilherme.dio]Pelo que entendi, seu formulário é composto pelos dados de um aluno que o user selecionou, portanto você teve que fazer um SELECT através de um de seus métodos que compõe seu DAO, entao faça o seguinte, em seu AlunoDAO, faça o seguinte atributo:

private int id_aluno;

com isso, faça o set e get:

public void setId(int id)
{
   this.id_aluno = id;
}

public int getId()
{
   return id_aluno;
}

agora, no seu método de SELECT , faça com que retorne também o id_aluno:

String comando = "SELECT * FROM aluno";
ResultSet retorno = ....
...
...
while(retorno.next())
{
   ...
   ...
   aluno.setId(retorno.getInt("id_aluno));
}

Desse modo você terá o id do aluno em sua classe de DAO, podendo utilizálo no update:

... ps.setInt(1,getId()); ... [/quote]

Blz Gulherme !

Justo isso é o que eu não queria fazer, não gostaria de fazer um SELECT para pegar o idaluno depois inserir o idaluno no comando UPDATE.
tem algum outra forma?

Por exemplo: Criar um atributo chamado codAluno e vincular ele como chave primária?

Por enquanto não gostaria de usar o HIBERNATE…

Então, neste formulário em que você altera( UPDATE) os dados do aluno, as informações que estão no banco são carregadas nos devidos campos do seu form, correto ?