[DUVIDA] Provavelmente Sintaxe de PostgreSQL

Bom dia a todos, estou com uma dúvida provável de sintaxe de PostgreSQL, pesquisei alguns tutoriais do banco de dados e de sintaxe mas não consegui concluir o exercício do FJ-21 da Caelum.

Vejam minhas classes por favor e depois a dúvida.

Tenho a Classe FuncionarioDAO


package br.com.caelum.banco;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.caelum.programa.Funcionario;

public class FuncionarioDAO {

	// variavel de conexao
	private Connection connection;

	// construtor
	public FuncionarioDAO() {
		this.connection = new ConnectionFactory().getConnection();
	}

	// adiciona na tabela funcionario
	public void adiciona(Funcionario funcionario) {
		String sql = "insert into funcionarios (nome, usuario, senha) values (?,?,?)";

		try {
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setString(1, funcionario.getNome());
			stmt.setString(2, funcionario.getUsuario());
			stmt.setString(3, funcionario.getSenha());
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	// pesquisa na tabela funcionario
	public List<Funcionario> pesquisa() {

		try {
			List<Funcionario> funcionarios = new ArrayList<Funcionario>();
			PreparedStatement stmt = this.connection
					.prepareStatement("select * from funcionarios");
			ResultSet rs = stmt.executeQuery();

			// funcionarios = new ArrayList<Funcionario>();

			while (rs.next()) {
				Funcionario funcionario = new Funcionario();
				funcionario.setNome(rs.getString("nome"));
				funcionario.setUsuario(rs.getString("usuario"));
				funcionario.setSenha(rs.getString("senha"));
				funcionario.setId(rs.getLong("id"));

				funcionarios.add(funcionario);
			}

			rs.close();
			stmt.close();
			return funcionarios;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}

	// remove linha de funcionario por ID
	public void remove(long numero) {

		String sql = "delete from funcionarios where id=?";
		try {
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setLong(1, numero);
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	//altera tabela funcionario conforme id
	public void altera(Funcionario funcionario, long id) {
		String sql = "update funcionarios set nome=?, usuario=?, senha=?, where id=?";

		try {
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setLong(1, id);
			stmt.setString(2, funcionario.getNome());
			stmt.setString(3, funcionario.getUsuario());
			stmt.setString(4, funcionario.getSenha());
			stmt.setLong(1, id);

			stmt.execute();
			stmt.close();

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

E a classe de TesteFuncionario


package br.com.caelum.teste;

import java.util.List;

import br.com.caelum.banco.FuncionarioDAO;
import br.com.caelum.programa.Funcionario;

public class TesteFuncionario {

	public static void main(String[] args) {

		Funcionario f1 = new Funcionario("Laura", "lauri", "guapa");
		
		FuncionarioDAO fDAO = new FuncionarioDAO();
		

		List<Funcionario> func = fDAO.pesquisa();

		for (Funcionario funcionario : func) {
			System.out.println("");
			System.out.println("Id: " + funcionario.getId());
			System.out.println("Nome: " + funcionario.getNome());
			System.out.println("Usuario: " + funcionario.getUsuario());
			System.out.println("Senha: " + funcionario.getSenha());
		}

		fDAO.altera(f1, 3);
		
	}

}

E o erro que aparece:




Id: 3
Nome: Vinicius
Usuario: vini
Senha: 123456

Id: 4
Nome: Laura
Usuario: lauri
Senha: guapa
Exception in thread "main" java.lang.RuntimeException: org.postgresql.util.PSQLException: ERRO: erro de sintaxe em ou próximo a "where"
  Posição: 56
	at br.com.caelum.banco.FuncionarioDAO.altera(FuncionarioDAO.java:99)
	at br.com.caelum.teste.TesteFuncionario.main(TesteFuncionario.java:27)
Caused by: org.postgresql.util.PSQLException: ERRO: erro de sintaxe em ou próximo a "where"
  Posição: 56
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:381)
	at br.com.caelum.banco.FuncionarioDAO.altera(FuncionarioDAO.java:95)
	... 1 more

Apreciando a Exception eu vejo que tenho um problema justo no WHERE do meu ALTERA em FuncionarioDAO, e ele informa o erro de sintaxe.

Ou seja, o que eu gostaria era de informar o número da ID no TestaFuncionario e alterar o mesmo com as novas informações conforme instanciado objeto.

Alguém pode me ajudar? Se tiver um tutorial muito bom de postgres por favor, agradeceria muito também.

Abraço
Vinicius Assis

public void altera(Funcionario funcionario, long id) { String sql = "update funcionarios set nome=?, usuario=?, senha=?, where id=?";

Retire a virgula antes do where.

Seguinte,
neste linha:

 String sql = "update funcionarios set nome=?, usuario=?, senha=?, where id=?"; 

remova a virgula depois do coringa da senha, ficando assim:

 String sql = "update funcionarios set nome=?, usuario=?, senha=? where id=?"; 

Testa aí.

[quote=fabiomedeirosf]Seguinte,
neste linha:

 String sql = "update funcionarios set nome=?, usuario=?, senha=?, where id=?"; 

remova a virgula depois do coringa da senha, ficando assim:

 String sql = "update funcionarios set nome=?, usuario=?, senha=? where id=?"; 

Testa aí.[/quote]

Ae cara, funcionou, impressionante como uma vírgula pode te deixar loco por 1 hora. rsss

Se tiver mais alguma dica, tutorial ou algum artigo relacionado a PostgreSQL e puder enviar eu agradeço.

Abraço.
Vinicius Assis