Conectar JFrame Form à uma tabela PostgreSQL

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();

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

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);
}

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);
    }
}

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);
    
}

}

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.

já 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

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();

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.

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.

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).

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.

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

acho que é assim que você quer dizer:

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) {
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.

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

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

1 curtida