Não estou conseguindo alterar um contato no banco


public void altera(Contato contato) {
    	   
    	   String sql = "update contatos set nome=?, email=?, endereco=?, dataNascimento=?, where id=?";
    	  
    	   try{
    		   PreparedStatement stmt = connection.prepareStatement(sql);
    		   stmt.setString(1, contato.setNome());
    		   stmt.setString(2, contato.getEmail());
    		   stmt.setString(3, contato.getEndereco());
    		   stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
    		   stmt.setLong(5, contato.getId());
    		   stmt.executeUpdate();
    		   stmt.close();
    	   } catch (SQLException e) {
    		   throw new RuntimeException(e);
    	   }
       }


public class TestaInsere {
	
	 
	public static void main(String[] args) {
		
		//pronto para gravar
		
		Contato contato = new Contato();
		contato.setNome("Allan");
		contato.setEmail("allan@hotmail.com.br");
		contato.setEndereco("R. Januario de Souza 4585 cj34");
		contato.setDataNascimento(Calendar.getInstance());
		
		//grave nessa conexão
		ContatoDAO dao = new ContatoDAO();
		
		//método elegante
		dao.altera(contato);
		
		System.out.println("Gravado!");
					
		}

	}
     OBS.: Criei um método altera e não estou conseguindo fazer o update no contato. O que preciso
              mudar no main para funcionar?  Ou não é no main que preciso mudar? Pode ser com dicas
              ou implementações no código. Desde já agradeço pela atenção. No aguardo, obrigado.

Contato contato = new Contato(); contato.setNome("Allan"); contato.setEmail("allan@hotmail.com.br"); contato.setEndereco("R. Januario de Souza 4585 cj34"); contato.setDataNascimento(Calendar.getInstance());
Vc não deu setId. Com isso, vai sempre 0.

tem uma virgula a mais na query sql

Seu SQL

String sql = "update contatos set nome=?, email=?, endereco=?, dataNascimento=?, where id=?"; 

Altere para

String sql = "update contatos set nome=?, email=?, endereco=?, dataNascimento=? where id=?";