Problemas com jdbc UPDATE

To tentando fazer um UPDATE, mas da erro;

Meu BD:

Os dados contidos nele (os dados que quero dar update)

Minha classe ContatoDao

package repositorio;

import java.sql.*;

import java.util.*;

import javax.swing.JOptionPane;

import com.mysql.jdbc.PreparedStatement;

import negocio.Contato;

public class ContatoDao {

private Connection con = null;

public ContatoDao() {
	this.con = new ConexaoFactory().getConnection();
}

public void adiciona(Contato contato) {
	String sql = "INSERT INTO cliente(nome,email,idade) VALUES(?,?,?)";


try {
	PreparedStatement stmt = (PreparedStatement) con.prepareStatement(sql);
	
	stmt.setString(1, contato.getNome());
	stmt.setString(2, contato.getEmail());
	stmt.setInt(3, contato.getIdade());
	
	stmt.execute();
	stmt.close();
	
	JOptionPane.showMessageDialog(null, "Gravado com sucesso!");
	
}catch (SQLException e) {
	//throw new RuntimeException(e);
	JOptionPane.showMessageDialog(null, "Erro ao tentar gravar no BD"+e);
}

}//Fim adiciona

//Método que ta dando erro!!@
public void atualiza(Contato contato) {
String sql = “UPDATE cliente SET nome = ?,email = ?,idade = ? WHERE id = ?”;

try {
	PreparedStatement stmt = (PreparedStatement) con.prepareStatement(sql);
	
	stmt.setString(1, contato.getNome());
	stmt.setString(2, contato.getEmail());
	stmt.setInt(3, contato.getIdade());
	
	stmt.executeUpdate();
	stmt.close();
	
	JOptionPane.showMessageDialog(null, "Atualizado com sucesso!");
	
}catch (SQLException e) {
	//throw new RuntimeException(e);
	JOptionPane.showMessageDialog(null, "Erro ao tentar atualizar no BD"+e);
}

}//Fim atualiza


public List<Contato> getLista() {
	
	List<Contato> contatos = new ArrayList<Contato>();
	String sql = "SELECT * FROM cliente";
	
	try {
		PreparedStatement stmt = (PreparedStatement) con.prepareStatement(sql);
		ResultSet rs =  stmt.executeQuery();
		
		

		while(rs.next()) {
			Contato contato = new Contato();
			contato.setNome(rs.getString("nome"));
			contato.setEmail(rs.getString("email"));
			contato.setIdade(rs.getInt("idade"));
			
			contatos.add(contato);
		}
		rs.close();
		stmt.close();
		//return contatos;
		
		
	}catch(SQLException e) {
		//JOptionPane.showMessageDialog(null, "Erro ao dar Select o BD"+e);
		throw new RuntimeException(e);
	}
	
	return contatos;
}

}//Fim ContatoDao

MINHA CLASSE TESTE (MAIN):

package negocio;

import repositorio.ContatoDao;

public class ContatoTeste {

static ContatoDao dao = new ContatoDao();

/**
 * @param args
 */
public static void main(String[] args) {
	// TODO Auto-generated method stub

	
	String nome = "Glauber";
	String email = "doodoh2010@hotmail.com";
	int idade = 22;
	
	Contato contato = new Contato();
	contato.setNome(nome);
	contato.setEmail(email);
	contato.setIdade(idade);
	
	dao.atualiza(contato);
	
	
}

}

Print do erro:

Faltou setar um valor para a quarta interrogação (?), no seu código você está setando valores somente para as três primeiras interrogações.

Por isso o erro:
No value specified for parameter 4 (Nenhum valor especificado para o parâmetro 4).

2 curtidas

Mas o meu id eu só tenho no BD, n tenho o get e set nem variável dele :confused:

Você precisa ter o id para saber quem está alterando. Seta ele também no getLista() e depois passa ele no parâmetro 4.

1 curtida

voce precisa especificar o id no qual esta querendo fazer a alteraçao, quando chamar o metodo update lista os dados da sua tabela antes de preferencia em uma tabela , ficando com uma aparencia mais agradavel e facilitando na hora de tu usar o update;

1 curtida

Vou corrigir agora, mas e a sintaxe “String sql = “UPDATE cliente SET nome = ?,email = ?,idade = ? WHERE id = ?”;” está correta?

Se o nome da tabela e dos campos estiverem corretos, então sim.

esta sim, qualque duvida segue pelo exemplo abaixo , so alterar o nome dos campos

    String sql = "UPDATE TASKS SET descricao = ?,nome = ?,prioridade =? WHERE ID = ? "; 
    
    pstmt = conexao.prepareStatement(sql);
    
    pstmt.setString(1,task1.getDescricaoTarefa());
    pstmt.setString(2,task1.getNomeTarefa());
    pstmt.setInt(3,task1.getPrioridadeTarefa());
    pstmt.setInt(4,idTarefa);