Erro ao tentar conectar PostgreSQL JDBC

Oi pessoal, tô com um problema ao seguir esse tutorial aqui:

Acontece que em lugar do MySQL, quero usar o PostgreSQL. Baixei o driver e, até onde eu sei, coloquei no classpath.

Vou deixar aqui o código da ConnectionFactory e o erro que tá apresentando.

package br.com.agenda.factory;

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

public class ConnectionFactory {
	
	//nome de usuario postgres
		private static final String username = "caiomvital";
		
		//senha do banco postgres
		private static final String password = "1234";
		
		//caminho do banco de dados, porta, nome do banco de dados
		private static final String databaseURL = "jdbc:postgresql://localhost:5432/caiomvital";
		
		//conexao com o banco de dados
		
		public static Connection createConnectionToPostgreSQL() throws Exception {
			
			//faz com que a classe seja carregada pela JVM
			Class.forName("com.postgresql.jdbc.driver");
			
			Connection connection = DriverManager.getConnection(databaseURL, username, password);
			 
			return connection;
		}
		
		public static void main(String[] args) throws Exception {
			
			//recuperar uma conexão com o banco de dados
			
			Connection con = createConnectionToPostgreSQL();
			
			//testar se a conexão é nula
			if (con != null) {
			System.out.println("Conexão obtida com sucesso");
			
			con.close();
			}
		}

}

o erro segue:

java.lang.ClassNotFoundException: com.postgresql.jdbc.driver
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:375)
	at br.com.agenda.factory.ConnectionFactory.createConnectionToPostgreSQL(ConnectionFactory.java:22)
	at br.com.agenda.dao.ContatoDAO.save(ContatoDAO.java:29)
	at br.com.agenda.main.Main.main(Main.java:20)

Já pesquisei em vários locais como corrigir esse erro, mas até agora não consegui resolver.

Parece que está tudo certinho, vc só errou o nome da classe.

Troque isto:

Class.forName("com.postgresql.jdbc.Driver");

Por isto:

Class.forName("org.postgresql.Driver");

Mas de qualquer forma, esta linha é completamente desnecessárias, vc pode até removê-la que vai funcionar perfeitamente.

Carregar o driver usando Class.forName era como a gente fazia antes do JDBC 4.0. A partir da versão 4.0, o driver utiliza outro mecanismo para encontrar o driver.

Fonte: Loading the Driver (Neste link ele até explica que These older methods of loading the driver are still supported but they are no longer necessary.).

Mais fonte: Establishing a Connection (The Java™ Tutorials > JDBC Database Access > JDBC Basics) (Any JDBC 4.0 drivers that are found in your class path are automatically loaded. (However, you must manually load any drivers prior to JDBC 4.0 with the method Class.forName).

1 curtida

Boa tarde! Obrigado pela resposta, já me ajudou muito!

O erro agora é outro, parece mais legível, mas ainda não estou entendendo:

org.postgresql.util.PSQLException: ERROR: relation "contatos" does not exist
  Posição: 13
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2565)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2297)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:322)
	at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:481)
	at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:401)
	at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164)
	at org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:153)
	at br.com.agenda.dao.ContatoDAO.save(ContatoDAO.java:44)
	at br.com.agenda.main.Main.main(Main.java:20)

A tabela contatos já está criada, dentro do schema Agenda, sob o usuário caiomvital, então não sei por que ele não reconhece a tabela.

Só pelo erro eu também não sei dizer o que poderia ser.

Vc poderia me mostrar a classe ContatoDAO e o SQL que vc usou para criar as tabelas?

1 curtida

Bom dia!

Essa é a classe ContatoDAO

package br.com.agenda.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.time.LocalDate;

import br.com.agenda.factory.ConnectionFactory;
import br.com.agenda.model.Contato;

public class ContatoDAO {

	/* CRUD
	 * C CREATE
	 * R READ
	 * U UPDATE
	 * D DELETE 
	 */

	public void save(Contato contato) {

		String sql = "INSERT INTO contatos (nome, idade) VALUES (?, ?)";

		Connection conn = null;

		PreparedStatement pstm = null;

		try {
			//criar uma conexão com o banco de dados
			conn = ConnectionFactory.createConnectionToPostgreSQL();

			//criamos uma PreparedStatement para executar uma query
			pstm = (PreparedStatement) conn.prepareStatement(sql);

			//adicionar os valores que são que são esperados pela query
			LocalDate localDate = LocalDate.now();
			PreparedStatement st = conn.prepareStatement("INSERT INTO contatos VALUES (?)");
			
			pstm.setString(1, contato.getNome());
			pstm.setInt(2, contato.getIdade());
			

			//executar a query
			pstm.execute();

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

		} finally {
			//fechar as conexões
			try {
				
				if(pstm != null) {
					pstm.close();

				}
				
				if(conn != null) {
					conn.close();

				}
				
			} catch (Exception e) {

				e.printStackTrace();
			}
		}

	}

}

O SQL que usei pra fazer a tabela foi

create table contatos(
id SERIAL PRIMARY KEY,
nome varchar(40),
idade int
);

Considerando que apaguei o DataCadastro e tentei novamente, agora só com 2 atributos.

Fiz o teste aqui invocando o método save do seu DAO.

Primeiro eu testei antes de criar a tabela contatos e deu aquele mesmo erro que vc mostrou “ERROR: relation “contatos” does not exist”.

Em seguida eu fiz outro teste. Criei a tabela contatos usando o SQL que vc mostrou e depois invoquei o método save e funcionou normalmente.

Verifique no seu banco se a tabela contatos realmente foi criada, pelos meus testes é só isso mesmo que está faltando.

1 curtida

Foi, eu testei o INSERT direto no SQL e rodou. Talvez eu esteja com problema na conectividade com o banco, considerando que estou usando o DBeaver pra conectar.

1 curtida