Usar preparedStatement[RESOLVIDO]

Ola,Lendo alguns fóruns eu aprendi que para usar o preparedStatement para salvar os dados no banco eu faço assim:PreparedStatement ps = conexao.prepareStatement("insert into aluno (nome,data_nascimento) values (?,?) "); ps.setString(1, a.getNome()); ps.setString(2, a.getData_nascimento()); ps.executeUpdate();[b]//uso o executeUpdate[/b]

Para pesquisar assim:

PreparedStatement ps = conexao.prepareStatement("select * from aluno"); ResultSet resultado = [b]ps.executeQuery();[/b] if(resultado.next()) { ....}

Mas gostaria de saber qual ps.execute() eu uso para alterar os dados do banco…
Obrigada pela ajuda :smiley:

Paty,

Faz a mesma coisa que você fez pra inclusão, a única coisa que muda é o SQL (fica “UPDATE aluno…”).

oi isaiaspf,
Fiz o que tu disseste mas acho que devo ter algum erro no meu comando pq ele não esta gerando erro mas tb nao esta alterando no banco :shock: Meu código é o seguinte:

PreparedStatement p = conexao.prepareStatement("select * from aluno where data_nascimento='"+a.getData_nascimento()+"' and nome='"+a.getNome()+"'"); ResultSet resultado = p.executeQuery(); if(resultado.next()) { consultar(a); System.out.println("aluno ja cadastrado"); } else { PreparedStatement ps = conexao.prepareStatement("insert into aluno (nome,data_nascimento,naturalidade...) values (?,?,?...) "); ps.setString(1, a.getNome().trim()); ps.setString(2, a.getData_nascimento()); ps.setString(3, a.getNaturalidade().trim()); ... ps.executeUpdate(); }
Quando eu rodo aparece a frase aluno ja cadastrado e ele chama o metodo consultar cujo codigo é o seguinte:

PreparedStatement ps = conexao.prepareStatement("update aluno set nome = ? where id = ? AND data_nascimento = ? ..."); ps.setString(1, a.getNome()); ps.setInt(2, a.getId());... ps.executeUpdate();

Pensei que era pq eu estava usando WHERE em todos os itens que quero alterar mas troquei todos os WHERE por AND mas não mudou nada não esta dando erro mas não esta funcionando :frowning:
Obrigada pela ajuda :smiley:

Paty, coloca todo código do seu método consultar, fica mais fácil pra identificar o problema :wink:

O método consultar é o seguinte:

[code]public void consultar(Aluno a)throws Exception
{
try
{
PreparedStatement ps = conexao.prepareStatement("update aluno set nome = ? where id = ? AND data_nascimento = ? AND naturalidade = ? AND nome_pai = ? AND nome_mae = ? AND estado_civil = ? AND endereco_profissional = ? AND endereco_residencial = ? AND telefone_profissional = ? AND telefone_residencial = ? AND cpf = ? AND rg = ? AND orgao_emissor = ? AND titulo = ? AND zona = ? AND num_carne = ? AND profissao = ? AND turma = ? AND sexo = ? AND nacionalidade = ? AND aproveitamento = ? AND status = ? ");
ps.setString(1, a.getNome());
ps.setInt(2, a.getId());
ps.setString(3, a.getData_nascimento());
ps.setString(4, a.getNaturalidade());
ps.setString(5, a.getNome_pai());
ps.setString(6, a.getNome_mae());
ps.setString(7, a.getEstado_civil());
ps.setString(8, a.getEndereco_profissional());
ps.setString(9, a.getEndereco_residencial());
ps.setString(10, a.getTelefone_profissional());
ps.setString(11, a.getTelefone_residencial());
ps.setString(12, a.getCpf());
ps.setString(13, a.getRg());
ps.setString(14, a.getOrgao_emissor());
ps.setString(15, a.getTitulo());
ps.setString(16, a.getZona());
ps.setString(17, a.getNum_carne());
ps.setString(18, a.getProfissao());
ps.setString(19, a.getTurma());
ps.setString(20, a.getSexo());
ps.setString(21, a.getNacionalidade());
ps.setString(22, a.getAproveitamento());
ps.setString(23, a.getStatus());
ps.executeUpdate();
}
catch(Exception e)
{
e.printStackTrace();

		throw e;
	}
}[/code]

Obrigada!

Então, o problema tá no seu SQL mesmo. Fica assim: [code]StringBuffer sql = new StringBuffer();
sql.append(“UPDATE aluno SET nome = ?, data_nascimento = ?, naturalidade = ?, …”);
sql.append(" WHERE id = ?");

PreparedStatement ps = conexao.prepareStatement(sql.toString());
ps.setString(1, a.getNome());
ps.setString(2, a.getData_nascimento());
ps.setString(3, a.getNaturalidade());

ps.setInt(23, a.getId());
ps.executeUpdate();[/code]Uma pergunta, as colunas da tabela ALUNO, exceto ID, são todas do tipo VARCHAR?

sim com exceção do ID,são todas do tipo VARCHAR
Hmm fiz as alterações mas continua não alterando :frowning:
o código agora esta assim:

public void consultarGUJ(Aluno a) { try{ StringBuffer sql = new StringBuffer(); sql.append("UPDATE aluno SET nome = ?, data_nascimento = ?, naturalidade = ?, nome_pai = ? , nome_mae = ? , estado_civil = ? , endereco_profissional = ? ,endereco_residencial = ? , telefone_profissional = ? , telefone_residencial = ? , cpf = ? , rg = ? , orgao_emissor = ? , titulo = ? , zona = ? , num_carne = ? , profissao = ? , turma = ? , sexo = ? , nacionalidade = ? , aproveitamento = ? , status = ? "); sql.append(" WHERE id = ?"); PreparedStatement ps = conexao.prepareStatement(sql.toString()); ps.setString(1, a.getNome()); ps.setString(2, a.getData_nascimento()); ps.setString(3, a.getNaturalidade()); ps.setString(4, a.getNome_pai()); ps.setString(5, a.getNome_mae()); ps.setString(6, a.getEstado_civil()); ps.setString(7, a.getEndereco_profissional()); ps.setString(8, a.getEndereco_residencial()); ps.setString(9, a.getTelefone_profissional()); ps.setString(10, a.getTelefone_residencial()); ps.setString(11, a.getCpf()); ps.setString(12, a.getRg()); ps.setString(13, a.getOrgao_emissor()); ps.setString(14, a.getTitulo()); ps.setString(15, a.getZona()); ps.setString(16, a.getNum_carne()); ps.setString(17, a.getProfissao()); ps.setString(18, a.getTurma()); ps.setString(19, a.getSexo()); ps.setString(20, a.getNacionalidade()); ps.setString(21, a.getAproveitamento()); ps.setString(22, a.getStatus()); ps.setInt(23, a.getId()); ps.executeUpdate(); } catch(Exception e) { e.printStackTrace(); } }

Bom dia paty, tenho algumas dúvidas para te ajudar:
no método consultar vc atualiza o aluno?

[quote=paty_trind]O método consultar é o seguinte:

[code]public void consultar(Aluno a)throws Exception
{
try
{
PreparedStatement ps = conexao.prepareStatement("update aluno set nome = ? where id = ? AND data_nascimento = ? AND naturalidade = ? AND nome_pai = ? AND nome_mae = ? AND estado_civil = ? AND endereco_profissional = ? AND endereco_residencial = ? AND telefone_profissional = ? AND telefone_residencial = ? AND cpf = ? AND rg = ? AND orgao_emissor = ? AND titulo = ? AND zona = ? AND num_carne = ? AND profissao = ? AND turma = ? AND sexo = ? AND nacionalidade = ? AND aproveitamento = ? AND status = ? ");
ps.setString(1, a.getNome());
ps.setInt(2, a.getId());
ps.setString(3, a.getData_nascimento());
ps.setString(4, a.getNaturalidade());
ps.setString(5, a.getNome_pai());
ps.setString(6, a.getNome_mae());
ps.setString(7, a.getEstado_civil());
ps.setString(8, a.getEndereco_profissional());
ps.setString(9, a.getEndereco_residencial());
ps.setString(10, a.getTelefone_profissional());
ps.setString(11, a.getTelefone_residencial());
ps.setString(12, a.getCpf());
ps.setString(13, a.getRg());
ps.setString(14, a.getOrgao_emissor());
ps.setString(15, a.getTitulo());
ps.setString(16, a.getZona());
ps.setString(17, a.getNum_carne());
ps.setString(18, a.getProfissao());
ps.setString(19, a.getTurma());
ps.setString(20, a.getSexo());
ps.setString(21, a.getNacionalidade());
ps.setString(22, a.getAproveitamento());
ps.setString(23, a.getStatus());
ps.executeUpdate();
}
catch(Exception e)
{
e.printStackTrace();

		throw e;
	}
}[/code]

Obrigada![/quote]

faz um teste: tenta abrir uma transação e depois commitar

Ola rjbcordeiro,
hmm atualizo o aluno tu diz depois de fazer as alterações no banco?sim

ah como assim fazer uma transação e depois commitar?eu nunca fiz isso eu acho :oops: :oops:
Obrigada pela ajuda :smiley:

fiz um exemplo para vc dar uma estudada.

public class TesteJdbc {

    public static Connection getConnection(){
        try {
            Class.forName("org.postgresql.Driver");
            Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/banco", "login", "senha");
            return con;
        } catch (Exception ex) {
            Logger.getLogger(TesteJdbc.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
            return null;
        }
    }
    
    public static void inserir(Connection con, int id, String nome, String mat) throws SQLException{
        PreparedStatement pstm = con.prepareStatement(" insert into aluno(id, nome, matricula) values (?,?,?)");
        pstm.setInt(1, id);
        pstm.setString(2, nome);
        pstm.setString(3, mat);
        pstm.execute();
        pstm.close();        
    }
    
    public static boolean existe(Connection con, String mat)throws SQLException{
        PreparedStatement pstm = con.prepareStatement(" select matricula from aluno where matricula = ?");
        pstm.setString(1, mat);
        ResultSet rs = pstm.executeQuery();
        boolean retorno = rs.next();
        rs.close();
        pstm.close();
        return retorno;
    }
    
    public static void main(String[] args) {
        Connection con = getConnection();
        try {
            if( !existe(con, "123")){
                inserir(con, 1, "Aluno 1", "123");
            }
        con.close();   
        } catch (SQLException ex) {
            Logger.getLogger(TesteJdbc.class.getName()).log(Level.SEVERE, null, ex);
            ex.printStackTrace();
        }
    
    }
}

Seria bom que seu aluno tivesse um atributo para identificar ele, como uma matricula e não data && nome pois, pode ser muito dificil, pode ter alunos que tenham o mesmo nome e datas iguais.

seria bom tb que vc dividisse as tarefas, tipo:
O método de cadastrar só cadastrar, o método de verificar se ele existe, fazer só isto e o seu controlador verificar qual o método chamar para tal.
qualquer dúvida posta ai.

obrigada pelo exemplo e explicações rjbcordeiro!
o aluno tem um registro q é unico cmo o id…vou trocar pela data de nascimento
e vou dividir as tarefas para ficar ate mais legivel o codigo
Obrigada pela ajuda qualquer coisa eu posto de novo!
:smiley:

Quando você cria uma conexão (Connection), a mesma, por padrão, vem configurada/setada no modo auto-commit.
Ou seja, cada operação vai ser tratada individualmente e comitada automaticamente.
Usando transação (Transaction) o commit (ou rollback) é feito manualmente. Para isso é necessário setar o auto-commit pra falso.connection.setAutoCommit(false);No seu caso NÃO TEM NECESSIDADE de criar uma transação.
O que eu preciso saber é quando e onde você abre e fecha a conexão com o banco (Connection).
Outra coisa, não está caindo mesmo no “catch(Exception e)” do seu método?

E se quiser aprender mais sobre Transaction: JDBC Basics - Using Transactions

[quote=paty_trind]o aluno tem um registro q é unico cmo o id…vou trocar pela data de nascimento
e vou dividir as tarefas para ficar ate mais legivel o codigo[/quote]
Não faça isso, mantém o id como chave da sua tabela.

não troca o id pela data de nascimento não, pois a chave primaria vc tem que garantir que é única.

Um exemplo para sua tabela:

//postgresql
create table aluno(
id bigserial not null, <- isto aqui um auto increment
matricula varchar(20) not null, <- vc utiliza isto aqui para achar o aluno
nome varchar(255) not null,
dt_nasc date,
...,
constraint pk_aluno_id primary key(id),
constraint unq_aluno_matricula unique(matricula)
);

sua chave matricula(candidata) vai ser quem vc precisa saber para achar um aluno, ok. qualquer coisa posta ai.

[quote=isaiaspf]Quando você cria uma conexão (Connection), a mesma, por padrão, vem configurada/setada no modo auto-commit.
Ou seja, cada operação vai ser tratada individualmente e comitada automaticamente.
Usando transação (Transaction) o commit (ou rollback) é feito manualmente. Para isso é necessário setar o auto-commit pra falso.connection.setAutoCommit(false);No seu caso NÃO TEM NECESSIDADE de criar uma transação.
O que eu preciso saber é quando e onde você abre e fecha a conexão com o banco (Connection).
Outra coisa, não está caindo mesmo no “catch(Exception e)” do seu método?[/quote]

No caso dela iria precisar sim de uma transação, se vc não percebeu, ela estava atualizando o cara (no consultar) para depois salvar, caso o desse alguma coisa errada, a transação iria segurar ela se toda a transação estaria sendo feita e não apenas uma parte.

Não, não precisa. Ela faz a consulta pra saber se o Aluno já está salvo no banco, se sim ele faz uma alteração no mesmo senão inclui um novo.
Uma coisa que não tem sentido é o nome do método que faz alteração no registro, ser chamado de consultar().
Outra coisa, deve ser setado o id do Aluno com o id do registro retornado da busca antes de enviar pra alteração.if(resultado.next()) { a.setId(resultado.getInt("id")); consultar(a); // Altera registro. }

tu tinhas razão faltava fazer: a.setId(resultado.getInt("id")); agora esta alterando certo,tipo o aluno com id certo =D
muito obrigada!!