Conectar JFrame Form à uma tabela PostgreSQL

14 respostas Resolvido
Javap

Quero fazer um programa simples que pega nome e sobrenome de uma JFrame Form no NetBeans e insere em uma tabela PostgreSQL.

A classe para conectar o projeto NetBeans com o Postgres funciona.

Mas na hora de conectar o JForm falta uma linha depois do initComponents().

com MySQL essa linha é conexao = ClasseConexao.connector();

mais acima tenho Connection conexao = null

Para o Postgres isso não funciona.

o que devo atribuir ao conexao depois do initComponents();

14 Respostas

Lucas_Camara

Dá algum erro qdo vc executa seu código?

Javap

esse é o trecho código do JForm depois de initComponents() tem o conexao = App.connect(), o que em teoria daria certo com MySQL, mas aqui fica sublinhado em vermelho como erro. no ponto de exclamação ao lado esta escrito: non-static method connect() cannot be referenced from static context

não consigo postar o código inteiro

public ExportaNome() {
    initComponents();
    
    conexao = App.connect();
            
            
     this.setLocationRelativeTo(null);
}
Javap

public class ExportaNome extends javax.swing.JFrame {

Connection conexao = null;
PreparedStatement pst = null;
ResultSet rs = null;
/**
 * Creates new form ExportaNome
 */
public ExportaNome() {
    initComponents();
    
    conexao = App.connect();
            
            
     this.setLocationRelativeTo(null);
}




public void cadNome(){
    String sql = "insert into nomes(nome,sobrenome) values (?,?)";

    try {
        pst = conexao.prepareStatement(sql);
        pst.setString(1,txtnome.getText());
        pst.setString(2,txtsobrenome.getText());
        
        rs = pst.executeQuery();
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null,e);
    }
}
Javap

classe de conexão do projeto ao postgres:

public class App {

private final String url = jdbc:postgresql://localhost/NBtutorial;

private final String user = postgres;

private final String password = 1234Marcos;
public  Connection connect() {
    Connection conn = null;
    try {
        conn = DriverManager.getConnection(url, user, password);
        System.out.println("Connected to the PostgreSQL server successfully.");
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }

    return conn;
}

public static void main(String[] args) {
   
    App app = new App();
    app.connect();
    
 
    ExportaNome expnome = new ExportaNome();
    expnome.setVisible(true);
    
}

}

Javap

Não consigo atribuir o método connect() em App ao conexao em ExportaNome. e conectar o JForm. Como o Connection conexao = null na classe App o JForm não conecta pois está com null atribuído e não connect() o que da erro.

 tentei tudo:

conexao = App.connect();

conexao = connect();

conexao = conn();

connect();

parece que só falta essa linha para fazer a inserção de nome e sobrenome no postgres

Lucas_Camara

O métodod connect da classe App não é estático, por isso vc não consegue fazer App.connect().

Para funcionar dessa forma, vc pode:

  • fazer o método connect ficar estático:
public static Connection connect() {
  • criar uma instância de App e chamar o método usando a referência:
App app = new App();
app.connect();
Javap

Oi Lucas, primeiramente obrigado pela resposta.

já tentei isso tb. dá erro no conn que atribui o driver na classe App, acredito que a mensagem diz que o url, o user e o password não podem ser referenciados por um método estático, mas a segunda parte deu certo.

Javap

ai se eu tiro static e rodo o projeto aparece essa mensagem

ainda não reconheceu a conexão.

Deve estar uma gambiarra dos infernos, pior que segui o tutorial do site da PostgreSQL. Vou tentar refazer de outro jeito.

valeu.

Lucas_Camara

A partir do momento em que vc coloca um método como estático, ele não pode referenciar propriedades da classe que não sejam estáticas. Com isso, vc deve fazer as variáveis url, user e password estáticas também.

Quando um elemento de código é estático, ele já terá uma instância criada automaticamente qdo o programa rodar. Com isso, ele deve ter acesso apenas à propriedades que também terão uma instância qdo a aplicação for executada (com exceção dos parâmetros no caso de métodos).

Javap

depois de criar uma instância de App e chamar o método usando a referência que vc passou

os erros sumiram sem precisar referenciar nenhum método como estático:

Connection conexao = null;
PreparedStatement pst = null;
ResultSet rs = null;
*App app= new App();*
/**
 * Creates new form ExportaNome
 */
public ExportaNome() {
    initComponents();
     
     *conexao = app.connect();*  
                        
     this.setLocationRelativeTo(null);
}

mas parece que o conn = DriverManager.getConnection(url, user, password); no App não pega.
no try catch vai pro catch e exibe a mesagem de erro . Quando roda

mas o programa não mostra mais nenhum sublinhado em vermelho com erro.

Lucas_Camara

Se caiu no catch, vc tem que colocar para imprimir a stacktrace. Dentro do catch coloque: e.printStackTrace();

Javap

acho que é assim que você quer dizer:

public Connection connect() {

Connection conn = null;

try {

conn = DriverManager.getConnection(url, user, password);

<a href="//System.out.println">//System.out.println</a>(“Connected to the PostgreSQL server successfully.”);

} catch (SQLException e) {

e.printStackTrace();

System.out.println(e.getMessage());

}
return conn;
}

mas eu tentei de outros jeitos também, fica na mesma mensagem .

org.postgresql.utilPSQLException: Nenhum resultado foi encontrado pela consulta.

Javap

A classe App de conexao eu peguei do site postgresqltutorial:

https://www.postgresqltutorial.com/postgresql-jdbc/connecting-to-postgresql-database/

Já o ExportaNome que é a classe do JFrame Form eu fiz de acordo com o que tinha feito para MySQL. Acho que isso que tá dando errado.

Vou tentar encontrar um tutorial de conexao para Java e PostgreSQL através de um JFrame Form e começar tudo do zero.

valeu

Javap
Solucao aceita

Consegui

Na verdade mesmo com a mensagem de erro tava registrando o nome e sobrenome.
Porém para corrigir o erro postei a mensagem da janela no google e fui parar nesse tutorial que explica o erro:

https://java.docow.com/14021/excecao-de-postgres-nenhum-resultado-foi-retornado-pela-consulta.html

daí vi que o comando rs = pst.executeQuery(), no método cadNome na classe ExportaNome estava incorreto.

Query= consulta
Update = atualização

como estou inserindo dados na tabela postgres e não consultando não poderia usar o Query e sim usar o Update

não dava pra atribuir o rs de ResultSet com executeUpdate().

então a solução foi a seguinte:

public void cadNome(){
String sql = “insert into nomes(nome,sobrenome) values (?,?)”;

try {
        pst = conexao.prepareStatement(sql);
        pst.setString(1,txtnome.getText());
        pst.setString(2,txtsobrenome.getText());
        
        *int adicionado = pst.executeUpdate();*
        if(adicionado > 0){
            JOptionPane.showMessageDialog(null, "Nome cadastrado");
        this.dispose();
        conexao.close();
        }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null,e);
    }
    
}

e acrecentei o this.dispose() e o conexao.close()

Está funcionando normal nome e sobrenome inseridos na tabela no Postgres.

Obrigado

Criado 2 de junho de 2021
Ultima resposta 3 de jun. de 2021
Respostas 14
Participantes 2