PostgreSQL e retorno de objetos do BD

Então pessoal, seguinte mais uma vez eu me meto em problemas com banco de dados (desculpem-me mas não é o meu forte ) Estou tentando criar objetos no BD e depois retorná-los, porém parece que este meu algoritmo não adiciona os objetos. Dêem uma olhada por favor

Ps. o AdicionaPessoa é um PreparedStatement (Obrigado, aprendi com vocês numa das respostas pra mim aqui).

try {
            Connection con = confac.criaConexao();

            AdicionaPessoa = con.prepareStatement("INSERT INTO caronista "
                    + "( nomecompleto , nomeusuario , senha , email , cpf , matricula , "
                    + " campusorigem , datanascimento ) " + "VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )");


            AdicionaPessoa.setString(1, c.getNomeCompleto());
            AdicionaPessoa.setString(2, c.getNomeUsuario());
            AdicionaPessoa.setString(3, c.getSenha());
            AdicionaPessoa.setString(4, c.getEmail());
            AdicionaPessoa.setString(5, c.getCpf());
            AdicionaPessoa.setString(6, c.getMatricula());
            AdicionaPessoa.setString(7, c.getCampusOrigem());
            AdicionaPessoa.setDate(8, converteData(c.getDataNascimento()));
            result = AdicionaPessoa.executeUpdate();

            System.out.println(result);
            if (result == 0) {
                System.out.println("não alterou nada");
            }

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

ConnectionFactory tá funcionando Ok, e o método de retorno é uma SQL simples de uma linha que só faz um SELECT com o cpf…

Nao conheco bem os metodos do PreparedStatement, mas nao ta errado voce esta dando um INSERT e usar um executeUpdate ? é isso mesmo ?

result = AdicionaPessoa.executeUpdate(); // Usa-se isso para dar um insert ? eu acho que é so AdicionaPessoa.execute();

E qual a mensagem de erro? se é que tem mensagem de erro.

Qual o retorno? Exception ou “não alterou nada”? Não está usando transação? Está commitando? Por que está preocupado com o Select e cadê ele? Já viu diretamente no banco se o registro não foi inserido? Mostre todo o código envolvido.

Esse é o teste que eu faço pra verificar o método

  /**
     * Cria um caronista com todos os valores válidos, insere no Banco de Dados
     * Depois, busca o caronista inserido pelo cpf.
     * Se retornar exatamente o mesmo objeto o teste foi realizado com sucesso
     * 
     * Teste para o caso de Uso Inserir Caronista
     */
    @Test
    public void testCreateCaronistaPerfeito() throws Exception {
        System.out.println("createCaronista");
        Caronista c = new Caronista();

        c.setCampusOrigem("uruguaiana");
        c.setCpf("83953666630");
        c.setDataNascimento("12/10/1990");
        c.setEmail("carlos@exemplo.com");
        c.setMatricula("89281");
        c.setNomeCompleto("Carlos Eduardo");
        c.setNomeUsuario("carloseduardo");
        c.setSenha("Senha@123");

        AuxCaronista instance = new AuxCaronista();
        instance.createCaronista(c);

        Caronista compara = instance.retornaCaronista("83953666630");

        assertEquals(compara, c);
       
        
    }

No BD não retorna nada.
O ExecuteUpdate é um método do PreparedStatement que executa o que tá na SQL, é padrão do JAVA

Este é o método que retorna o caronista do BD

 public Caronista returnCaronista(String cpf) throws ValoresIlegaisException {
        try {
            Caronista c = null;
            Connection con = confac.criaConexao();

            String SQL = "SELECT * FROM caronista WHERE cpf = " + "'"+cpf+"'";
            java.sql.Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(SQL);


            c.setNomeCompleto(rs.getString("nomecompleto"));
            c.setNomeUsuario(rs.getString("nomeusuario"));
            c.setCampusOrigem(rs.getString("campusorigem"));
            c.setDataNascimento(rs.getString("datanascimento"));
            c.setEmail(rs.getString("email"));
            c.setMatricula(rs.getString("matricula"));
            c.setSenha(rs.getString("senha"));
            c.setCpf(cpf);
        
            rs.close();
            con.close();
            return c;

Tinha esquecido, essa é a classe de modelo que faz a interação com a persistencia, e aqui o resto do método do select

public Caronista retornaCaronista (String cpf) throws ValoresIlegaisException {
       DBCaronista car = new DBCaronista();
        if(cpf!=null){
             return car.returnCaronista(cpf);
        }
        else return null;
    
   }

Não lança exception nem o não alterou nada (isso que eu acho estranho)

[quote=@Claudio_davi]Esse é o teste que eu faço pra verificar o método

  /**
     * Cria um caronista com todos os valores válidos, insere no Banco de Dados
     * Depois, busca o caronista inserido pelo cpf.
     * Se retornar exatamente o mesmo objeto o teste foi realizado com sucesso
     * 
     * Teste para o caso de Uso Inserir Caronista
     */
    @Test
    public void testCreateCaronistaPerfeito() throws Exception {
        System.out.println("createCaronista");
        Caronista c = new Caronista();

        c.setCampusOrigem("uruguaiana");
        c.setCpf("83953666630");
        c.setDataNascimento("12/10/1990");
        c.setEmail("carlos@exemplo.com");
        c.setMatricula("89281");
        c.setNomeCompleto("Carlos Eduardo");
        c.setNomeUsuario("carloseduardo");
        c.setSenha("Senha@123");

        AuxCaronista instance = new AuxCaronista();
        instance.createCaronista(c);

        Caronista compara = instance.retornaCaronista("83953666630");

        assertEquals(compara, c);
       
        
    }

No BD não retorna nada.
O ExecuteUpdate é um método do PreparedStatement que executa o que tá na SQL, é padrão do JAVA

Este é o método que retorna o caronista do BD

 public Caronista returnCaronista(String cpf) throws ValoresIlegaisException {
        try {
            Caronista c = null;
            Connection con = confac.criaConexao();

            String SQL = "SELECT * FROM caronista WHERE cpf = " + "'"+cpf+"'";
            java.sql.Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(SQL);


            c.setNomeCompleto(rs.getString("nomecompleto"));
            c.setNomeUsuario(rs.getString("nomeusuario"));
            c.setCampusOrigem(rs.getString("campusorigem"));
            c.setDataNascimento(rs.getString("datanascimento"));
            c.setEmail(rs.getString("email"));
            c.setMatricula(rs.getString("matricula"));
            c.setSenha(rs.getString("senha"));
            c.setCpf(cpf);
        
            rs.close();
            con.close();
            return c;

Tinha esquecido, essa é a classe de modelo que faz a interação com a persistencia, e aqui o resto do método do select

public Caronista retornaCaronista (String cpf) throws ValoresIlegaisException {
       DBCaronista car = new DBCaronista();
        if(cpf!=null){
             return car.returnCaronista(cpf);
        }
        else return null;
    
   }

Não lança exception nem o não alterou nada (isso que eu acho estranho)[/quote]

Acho que voce nao me entendeu, nao conhecer todos os metodos do PreparedStatement nao quer dizer que eu nao conheca alguns :smiley:

Tipo, acho que voce precisa ler a documentacao do PreparedStatement, nao discuti se é padrão do Java ou nao, mas voce precisa entender quando usar um metodo especifico, por exemplo, existe o executeQuery.

Mas deixando isso de lado, poe isso depois do seu executeUpdate();

con.commit();

Testa ae, flw!

Para tentar achar o problema tenta fazer algo mais isolado como neste exemplo: http://www.java2s.com/Code/Java/Database-SQL-JDBC/InsertRecordsUsingPreparedStatement.htm E depois veja diretamente no banco se inseriu. Se inseriu você vai aplicando aos poucos o que deseja implementar.

desculpa x.x
troquei pra

            AdicionaPessoa.executeQuery();
            con.commit();

e não mudou nada :confused:

hehehehe, c ta enrolado hein :smiley:

Tipo, poe aquilo DEPOIS do executeUpdate();, se voce usar o executeQuery, voce precisa passar a string SQL para dentro do metodo, assim:

executeQuery("INSERT INTO alguma coisa () values .......");

outro detalhe, nao vejo voce fechando a conexao:

con.close();

Le com calma que vc vai conseguir =D

Opa, tava olhando uns projetos meu aqui (faz tempo que nao uso preparedstatement, to so no hibernate agora =D), e falei errado ali, eu uso o prepared puxando para um result set, sem parametro no executeQuery(), desculpe ^^

rs = ps.executeQuery();

Modifiquei e não mudou nada :confused:

O código agora tá assim:

 public boolean insertCaronista(Caronista c) {


        try {
            Connection con = confac.criaConexao();

            AdicionaPessoa = con.prepareStatement("INSERT INTO caronista "
                    + "( nomecompleto , nomeusuario , senha , email , cpf , matricula , "
                    + " campusorigem , datanascimento ) " + "VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )");


            AdicionaPessoa.setString(1, c.getNomeCompleto());
            AdicionaPessoa.setString(2, c.getNomeUsuario());
            AdicionaPessoa.setString(3, c.getSenha());
            AdicionaPessoa.setString(4, c.getEmail());
            AdicionaPessoa.setString(5, c.getCpf());
            AdicionaPessoa.setString(6, c.getMatricula());
            AdicionaPessoa.setString(7, c.getCampusOrigem());
            AdicionaPessoa.setDate(8, converteData(c.getDataNascimento()));
            
           result = AdicionaPessoa.executeUpdate();
            con.commit();
            
            con.close();

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }

pior que tou mais que enrolado nisso…

Minha conexão tá assim:
Só que ela sempre imprime que a conexão foi realizada com sucesso.

public class ConnectionFactory {

    static String driver = "org.postgresql.Driver";
    static String user = "postgres";
    static String pass = "estudar";
    static String url = "jdbc:postgresql://localhost:5432/RP4final";

    public static Connection criaConexao() {
       Connection con = null;
     
       
       try {
            Class.forName(driver);
            

            con = (Connection) DriverManager.getConnection(url, user, pass);

            System.out.println("Conexão realizada com sucesso \n");

        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (SQLException sq) {
            sq.printStackTrace();
        }
        
        return  con;
    }

Ta usando o eclipse ?

Sabe fazer debug ?

Faça um debug no metodo insertCaronista e veja o que acontece de fato.

Vou dar uma pesquisada em como faz certinho e tentarei debugar, uso o NetBeans.
Fui usar a ferramenta de depuração e tem que ter um método main();
só que eu tou fazendo só o modelo, portanto minhas execuções são através de testes…

ok, qualquer coisa tamo ae =D, vo sair so mais tarde, to no trampo :cry:

Ok, o problema é na conexão com o Banco de Dados… ele não faz nada lá, nunca.

já pesquisei bastante aqui, só não vai pra frente… :confused:

[quote=@Claudio_davi]Ok, o problema é na conexão com o Banco de Dados… ele não faz nada lá, nunca.

já pesquisei bastante aqui, só não vai pra frente… :/[/quote]
Testou isoladamente o exemplo que passei?

Sim, inclusive tentei criar objetos ou tabelas diferentes, ele não cria nada…
porém eu fiz uma inclusão direto no BD e mandei buscar só o cpf e ele retorna direito…