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