Como realizar consulta no PostgreSQL usando Java?

Salve, galera!

Estava procurando por aqui e achei algumas coisas sobre o PostgreSQL, mas não consegui assimilar com meu problema.

Estou fazendo um sistema que vai ter autenticação. Criei o banco, as tabelas e colunas no PostgreSQL e consegui estabelecer uma conexão com o banco, mas (até por ser iniciante em Java com Banco de Dados) não consigo fazer a consulta.

Gostaria de uma ajuda, se possível. :slight_smile:

Vamos lá! Essa é minha classe ‘conectaBanco’ (nome auto-explicativo):

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class conectaBanco{
  public Connection conectaAgora(){
    String url = "jdbc:postgresql://localhost:5432/Projeto";
    String usuario = "postgres";
    String senha = "admin01";

    try{
      Class.forName("org.postgresql.Driver").newInstance();
      Connection conn = DriverManager.getConnection(url, usuario, senha);
      return conn;
    }
    catch(SQLException ex){
      System.out.println("SQLException: " + ex.getMessage());
      System.out.println("SQLState: " + ex.getSQLState());
      System.out.println("VendorError: " + ex.getErrorCode());
      return null;
    }
    catch(Exception e){
      System.out.println("Problemas ao tentar conectar com o banco de dados: " + e);
      return null;
    }
  }
}

Daí eu tenho a interface com um JTextField, um JPasswordField e um JButton. Aquela clássica interface para inserir usuário, senha e entrar no sistema.
Enfim, o evento do meu botão entrar é esse:

import java.awt.event.*;
import java.sql.*;

(...)

entrar.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent entrarSistema)
                    {
                        try {
                                String user = TFieldUser.getText();
                                String pass = TFieldPass.getText();
                                String consulta = "SELECT id_usuario, usuario, senha FROM autentica WHERE usuario ='" + user + "' and senha = '" + pass + "'";

                                Connection conn = new conectaBanco().conectaAgora();

                                // testa se a conexão foi efetuada com sucesso
                                if (conn != null) {
                                System.out.println("Conexão efetuada com sucesso!");
                                    } else {
                                    System.out.println("Problemas!");
                                    }

                                Statement stm = (Statement) conn.createStatement();

                                stm.executeQuery(consulta);

                              } catch (SQLException ex) {
                                Logger.getLogger(interface1.class.getName()).log(Level.SEVERE, null, ex);
                            }


                    }
            });

Ele estabelece a conexão com sucesso!

Agora a dúvida: O código está correto?
Se sim, como eu faço a comparação para saber se foi digitado corretamente o usuário e senha?

Obrigado!

no string da consulta use o caracter scape quando quiser representar aspas, segue o exemplo:

[code]String query = "select atributo from tabela t where t.atributo =

Espero ter ajudado…" + valor + “’”;[/code]

Espero ter ajudado…

Olá!

o método executeQuery() da classe java.sql.Statement retorna um objeto ResultSet (que é a consulta do banco).
vc pode fazer assim:

ResultSet rs = stm.executeQuery(consulta);

Depois fazer como manda o tutorial do GUJ:
http://www.guj.com.br/article.show.logic?id=7

Abraços

[quote=Carlos_ds_jar]no string da consulta use o caracter scape quando quiser representar aspas, segue o exemplo:

[code]String query = "select atributo from tabela t where t.atributo =

Espero ter ajudado…[/quote]

Quando vc usa ’ (aspas simples) dentro de " ’ " (aspas duplas), não é necessário o uso de caracteres de escape.

Até mais" + valor + “’”;[/code]

Espero ter ajudado…[/quote]

Quando vc usa ’ (aspas simples) dentro de " ’ " (aspas duplas), não é necessário o uso de caracteres de escape.

Até mais

Vc ta certa, eu uso pouco sql uso mais ejbql, mas se não me engano antigamente precisava…

Desculpa aí a todos…

Não tinha encontrado esse tutorial. :?

Mas enfim, agora deu quase certo.

O evento do meu botão entrar ficou assim:

entrar.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent entrarSistema)
                    {

                    String user = TFieldUser.getText();
                    String pass = TFieldPass.getText();

                    Connection conn = new conectaBanco().conectaAgora();

                    // testa se a conexão foi efetuada com sucesso
                    if(conn != null)
                    {
                    try {
                        System.out.println("Conexão efetuada com sucesso!");
                        Statement estado = conn.createStatement();
                        ResultSet resultado = estado.executeQuery("SELECT id_usuario, usuario, senha FROM autentica WHERE usuario ='" + user + "' and senha = '" + pass + "'");

                        int id_usuario_bd = 0;
                        String usuario_bd = null;
                        String senha_bd = null;

                        while (resultado.next()) {
                            id_usuario_bd = resultado.getInt("id_usuario");
                            usuario_bd = resultado.getString("usuario");
                            senha_bd = resultado.getString("senha");
                        }

                        if ((user == usuario_bd)&&(pass == senha_bd))
                        {
                            System.out.println("Autenticado com sucesso! id = " + id_usuario_bd);
                        } else { System.out.println("Usuário incorreto! Você digitou: " + user + " " + pass + " - O correto é: " + usuario_bd + " " + senha_bd); }



                    } catch (SQLException ex) {
                        Logger.getLogger(interface1.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    } else {
                                System.out.println("Problemas!");
                            }

                    }
            });

Ele estabelece a conexão, faz a consulta correta, mas não autentica. Deve ser algo no if que não consigo enxergar. Estou comparando o usuário e senha digitado com o usuário e senha do banco, caso sejam iguais é para entrar no sistema, mas mesmo sendo iguais ele sai do if e vai pro else. O resultado é esse:

[color=green]“Conexão efetuada com sucesso!
Usuário incorreto! Você digitou: root root - O correto é: root root
CONSTRUÍDO COM SUCESSO (tempo total: 13 segundos)”[/color]

Alguma ideia? :?:

Obrigado!

Galera, valeu pela ajuda!

Agora deu certo.

Segue código com as modificações que realizei:

entrar.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent entrarSistema)
                    {

                    String user = TFieldUser.getText();
                    String pass = TFieldPass.getText();

                    Connection conn = new conectaBanco().conectaAgora();

                    // testa se a conexão foi efetuada com sucesso
                    if(conn != null)
                    {
                    try {
                        System.out.println("Conexão efetuada com sucesso!");
                        Statement estado = conn.createStatement();
                        ResultSet resultado = estado.executeQuery("SELECT id_usuario, usuario, senha FROM autentica WHERE usuario ='" + user + "' and senha = '" + pass + "'");

                        boolean achou = false;
                        while (resultado.next() && !achou)
                            {
                            if (resultado.getString("usuario").equals(user))
                            if (resultado.getString("senha").equals(pass))
                            achou = true;
                            }

                            if (!achou)
                            {
                            System.out.println("Incorreto! Você digitou: " + user + " " + pass);
                            }
                            else {System.out.println("Autenticado com sucesso!"); }

                    } catch (SQLException ex) {
                        Logger.getLogger(interface1.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    } else {
                                System.out.println("Problemas!");
                            }

                    }
            });

[color=green]“Conexão efetuada com sucesso!
Autenticado com sucesso!
CONSTRUÍDO COM SUCESSO (tempo total: 10 segundos)”
[/color]

:slight_smile:

Só uma dica, procure usar o PreparedStatement quando voce precisa setar parametros dentro de sua query com o PreparedStatement seu codigo ficaria da seguinte maneira:

[code]entrar.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent entrarSistema)
{

                String user = TFieldUser.getText();
                String pass = TFieldPass.getText();

                Connection conn = new conectaBanco().conectaAgora();

                // testa se a conexão foi efetuada com sucesso
                if(conn != null)
                {
                try {
                    System.out.println("Conexão efetuada com sucesso!");
                    
                    //voce coloca ? onde irao os seus parametros
                    String strSQL = "SELECT id_usuario, usuario, senha FROM autentica WHERE usuario = ? and senha = ?";
                    PreparedStatement estado = conn.prepareStatement(strSQL);
                    //aqui voce substitui o ? da query pelo parametro correspondente
                    estado.setString(1, user);
                    estado.setString(2, pass);

                    ResultSet resultado = estado.executeQuery();
                    boolean achou = false;
                    while (resultado.next() && !achou)
                        {
                        if (resultado.getString("usuario").equals(user))
                        if (resultado.getString("senha").equals(pass))
                        achou = true;
                        }

                        if (!achou)
                        {
                        System.out.println("Incorreto! Você digitou: " + user + " " + pass);
                        }
                        else {System.out.println("Autenticado com sucesso!"); }

                } catch (SQLException ex) {
                    Logger.getLogger(interface1.class.getName()).log(Level.SEVERE, null, ex);
                }

                } else {
                            System.out.println("Problemas!");
                        }

                }
        });

[/code]

Dessa forma o codigo fica mais “elegante” alem de se livrar dos pequenos intemperies de concatenar strings, mas sao pequenas boas praticas que voce ira aprender com o tempo

Obrigado! :slight_smile: