JDBC método procurar dúvidas

Estou com a seguinte dúvida. Alguém pode me dar um help?

  1. Testando a classe quero implementar o pesquisar (procurar) no banco pelo id. Quero que digite o id e depois lista apenas o que eu pesquisei. Só que meu banco está pesquisando tudo além daquele, lista tudo, inclusive até quando o id nao existe.
    Onde errei no procurar? E no listar?
    Descrevi abaixo o repositorio e o main.
    Obs.: o inserir, atualizar e remover estão ok. No aguardo grata desde já,

public class RepositorioCertidoesBD implements RepositorioCertidoes{

private String nomeDriver;
private String urlConexao;
private String usuarioConexao;
private String senhaConexao;
private boolean indDriverCarregado;

private static final String MSG_FALHA_CARGA_DRIVER =
	"Nome do driver JDBC usado não corresponde a uma classe válida";
private static final String MSG_ERRO_CONEXAO =
	"Erro ao obter conexão com o banco de dados";

private static final String MSG_ERRO_ACESSO_BD =
	"Erro de acesso ao banco de dados";

private static final String MSG_CERTIDAO_NAO_CADASTRADA =
	"Certidao não cadastrada";

private static final String MSG_ID_NAO_ENCONTRADO =
	"ID não encontrado";

private static final String MSG_ID_INVALIDO =
	"ID inválido";

private static final String INSERT_CERTIDAO =
	 "INSERT INTO certidao (id, nome, DiasEmissao, Orgao_Emissor_id) VALUES (?,?,?,?)";

   //"INSERT INTO certidao (nome, DiasEmissao, Orgao_Emissor_id) VALUES (?,?,?,?)";

private static final String PROCURA_CERT=
	"SELECT id, nome, DiasEmissao, Orgao_Emissor_id FROM certidao WHERE id = ?";

private static final String LISTA_CERT =
	"SELECT id, nome, DiasEmissao, Orgao_Emissor_id FROM certidao";

private static final String DELETE_CERT =
	"DELETE FROM certidao WHERE id = ?";

private static final String ATUALIZAR_CERT =
		"UPDATE certidao SET nome = ? WHERE id = ?";


public RepositorioCertidoesBD(
		
		String pNomeDriver,
		String pUrlConexao,
		String pUsuarioConexao,
		String pSenhaConexao) {
	
	super();
	
	nomeDriver = pNomeDriver;
	urlConexao = pUrlConexao;
	usuarioConexao = pUsuarioConexao;
	senhaConexao = pSenhaConexao;
	indDriverCarregado = false;
}

private Connection getConexao() {

	if (!indDriverCarregado) {
		try {
			Class.forName(nomeDriver);
			indDriverCarregado = true;
		} catch (ClassNotFoundException e) {
			System.err.print(MSG_FALHA_CARGA_DRIVER);
		}
	}
	try {
		return DriverManager.getConnection(
				urlConexao,
				usuarioConexao,
				senhaConexao);
	} catch (SQLException e) {
		System.err.print(MSG_ERRO_CONEXAO);
		return null;
	}
}

public void inserir (Certidao c) {

	if (c != null) {
		Connection con = getConexao();
		PreparedStatement psCert = null;
		PreparedStatement psEnd = null;
		
		try {
			psCert = con.prepareStatement(INSERT_CERTIDAO);
			psCert.setInt(1, c.getId());
			psCert.setString(2, c.getNome());
			psCert.setString(3, c.getDiasEmissao());
			psCert.setInt(4, c.getOrgao_Emissor_id());
			

			psCert.executeUpdate();
			
		} catch (SQLException e) {
			System.err.print(e.getMessage());
			
		} finally {
			fechaRecursos(con, psCert, null);
			fechaRecursos(con, psEnd, null);
		}
	}
}

public void atualizar (Certidao c) {

	if (c != null) {
		Connection con = getConexao();
		PreparedStatement psCert = null;
		PreparedStatement psEnd = null;
		
		try {
			psCert = con.prepareStatement(ATUALIZAR_CERT);
			psCert.setString(1, c.getNome());
			psCert.setInt(2, c.getId());
			
			//psCert.setString(3, c.getDiasEmissao());
			//psCert.setInt(4, c.getOrgao_Emissor_id());
			

			psCert.executeUpdate();
			
		} catch (SQLException e) {
			System.err.print(e.getMessage());
			
		} finally {
			fechaRecursos(con, psCert, null);
			fechaRecursos(con, psEnd, null);
		}
	}
}
	
public Certidao procurar (int id) {
	if (id != 0) {
		Connection con = getConexao();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = con.prepareStatement(PROCURA_CERT);
			ps.setInt(1, id);
			rs = ps.executeQuery();
			if (rs.next()) {
				int bdId = rs.getInt(1);
				String bdNome = rs.getString(2);
				String bdDiasEmissao = rs.getString(3);
				int bdOrgao_Emissor_id = rs.getInt(4);
				
	
				Certidao cert = new Certidao();
				cert.setId(bdId);
				
				cert.setId(rs.getInt(1));
				cert.setNome(bdNome);
				cert.setDiasEmissao(bdDiasEmissao);
				cert.setOrgao_Emissor_id(bdOrgao_Emissor_id);
				

				
				return cert;
				
			} else {
				System.err.print(MSG_CERTIDAO_NAO_CADASTRADA);
			}
		} catch (SQLException e) {
			System.err.println(MSG_ERRO_ACESSO_BD);
			System.err.println(e.getMessage());
			
		} finally {
			fechaRecursos(con, ps, rs);
		}
	} 
	return null;
}

public ResultSet listar() {
		Connection con = getConexao();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = con.prepareStatement(LISTA_CERT);
			rs = ps.executeQuery();
			if (rs.next()){
				
				return rs;
			}
		} catch (SQLException e) {
			System.err.println(MSG_ERRO_ACESSO_BD);
			System.err.println(e.getMessage());
		} 
	return rs;
}

public void remover(int id) {
if (id != 0) {
	Connection con = getConexao();
	PreparedStatement ps = null;
	try {
		ps = con.prepareStatement(DELETE_CERT);
		ps.setInt(1, id);
		int rows = ps.executeUpdate();
		if (rows <= 0) {
			System.err.println("ID não encontrado");
		}
	} catch (SQLException e) {
		System.err.println(MSG_ID_NAO_ENCONTRADO);
		System.err.println(e.getMessage());
	} finally {
		fechaRecursos(con, ps, null);
	}
} else {
	System.err.println(MSG_ID_INVALIDO);
}
}

private void fechaRecursos(
		Connection con,
		PreparedStatement ps,
		ResultSet rs) {

	try {
		if (rs != null)
			rs.close();
	} catch (Exception e) {
	}
	try {
		if (ps != null)
			ps.close();
	} catch (Exception e) {
	}
	try {
		if (con != null)
			con.close();
	} catch (Exception e) {
	
	
}

}
}



public class TesteCertidoes {

@SuppressWarnings("deprecation")
public static void main(String[] args) {
	Certidao c = new Certidao();
	c.setId(2);
	c.setNome("URB");
	c.setDiasEmissao("10");
	c.setOrgao_Emissor_id(5);
	
	c.setId(3);
	c.setNome("Compesa");
    c.setDiasEmissao("12");
	c.setOrgao_Emissor_id(5);
	
	

	ConexionJDBC.obterInstancia().atualizar(c); 
	ConexionJDBC.obterInstancia().remover(2);
	ConexionJDBC.obterInstancia().procurar(1);	
	ConexionJDBC.obterInstancia().inserir(c);
	
	
	ResultSet rs = ConexionJDBC.obterInstancia().listar();
	

	ResultSetMetaData mdata;
	try {
		mdata = rs.getMetaData();
		int colCount = mdata.getColumnCount();
		String[] colNames = new String[colCount];
		for (int i = 1; i <= colCount; i++) {
			colNames[i - 1] = mdata.getColumnName(i);
		}
		rs.beforeFirst();
		while (rs.next()) {
			String[] rowData = new String[colCount];
			for (int i = 1; i <= colCount; i++) {
				rowData[i - 1] = rs.getString(i);
				System.out.println(rowData[i - 1]);
			}
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
}
}

Aparentemente o seu método pesquisar está implementado corretamente, inclusive ele só retorna um objeto do tipo Certidao, o que está certo.

Acredito que na classe onde você está usando o RepositorioCertidoesBD, você esteja invocando o método errado na hora de pesquisar. Você deve estar chamando o método listar(), ao invés de pesquisar(id).

Dica: modifica o seu método listar, para retornar uma lista de Certidao e não um ResultSet.

1 curtida

Agradeço sua atenção. Mas qual seria a diferença? Não listaria tudo?

List<Certidao> é uma lista de objetos do tipo Certidao

ResultSet é um objeto que aponta para um registro do banco
Do jeito que você implementou, quem for usar o método listar, é obrigado a iterar este ResultSet e instanciar os objetos Certidao

Fazendo as alterações que sugeri, sua classe TesteCertidoes não depende mais dos pacotes de acesso a banco, veja:

import java.util.List;

public class TesteCertidoes {

	public static void main(String[] args) {

		Certidao c = new Certidao();
		c.setId(2);
		c.setNome("URB");
		c.setDiasEmissao("10");
		c.setOrgao_Emissor_id(5);

		// as quatro linhas abaixo estão alterando os atributos do objeto
		// porque já não cria com os atributos corretos?
		c.setId(3);
		c.setNome("Compesa");
		c.setDiasEmissao("12");
		c.setOrgao_Emissor_id(5);

		// não fica chamando o tempo todo o ConexionJDBC.obterInstancia()
		// cria uma variável local
		// poderias chamar a classe simplesmente de JDBC e não ConexionJDBC
		// dica, não existe Conexion, o nome certo é Connection
		// e JDBC significa
		// Java Data Base **Connection**
		RepositorioCertidoes repositorio = ConexionJDBC.obterInstancia();
		repositorio.atualizar(c);
		repositorio.remover(2);
		repositorio.procurar(1);
		repositorio.inserir(c);

		List<Certidao> lista = repositorio.listar();
		for (Certidao encontrada : lista) {
			System.out.println(encontrada.getNome());
		}
	}
}

Sua classe RepositorioCertidoesBD refatorada:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class RepositorioCertidoesBD implements RepositorioCertidoes {

	private String nomeDriver;
	private String urlConexao;
	private String usuarioConexao;
	private String senhaConexao;
	private boolean indDriverCarregado;

	private static final String MSG_FALHA_CARGA_DRIVER = "Nome do driver JDBC usado não corresponde a uma classe válida";
	private static final String MSG_ERRO_CONEXAO = "Erro ao obter conexão com o banco de dados";

	private static final String MSG_ERRO_ACESSO_BD = "Erro de acesso ao banco de dados";

	private static final String MSG_CERTIDAO_NAO_CADASTRADA = "Certidao não cadastrada";

	private static final String MSG_ID_NAO_ENCONTRADO = "ID não encontrado";

	private static final String MSG_ID_INVALIDO = "ID inválido";

	private static final String INSERT_CERTIDAO = "INSERT INTO certidao (id, nome, DiasEmissao, Orgao_Emissor_id) VALUES (?,?,?,?)";

	// "INSERT INTO certidao (nome, DiasEmissao, Orgao_Emissor_id) VALUES (?,?,?,?)";

	private static final String PROCURA_CERT = "SELECT id, nome, DiasEmissao, Orgao_Emissor_id FROM certidao WHERE id = ?";

	private static final String LISTA_CERT = "SELECT id, nome, DiasEmissao, Orgao_Emissor_id FROM certidao";

	private static final String DELETE_CERT = "DELETE FROM certidao WHERE id = ?";

	private static final String ATUALIZAR_CERT = "UPDATE certidao SET nome = ? WHERE id = ?";

	public RepositorioCertidoesBD(

			String pNomeDriver, String pUrlConexao, String pUsuarioConexao, String pSenhaConexao) {

		super();

		nomeDriver = pNomeDriver;
		urlConexao = pUrlConexao;
		usuarioConexao = pUsuarioConexao;
		senhaConexao = pSenhaConexao;
		indDriverCarregado = false;
	}

	private Connection getConexao() {

		if (!indDriverCarregado) {
			try {
				Class.forName(nomeDriver);
				indDriverCarregado = true;
			} catch (ClassNotFoundException e) {
				System.err.print(MSG_FALHA_CARGA_DRIVER);
			}
		}
		try {
			return DriverManager.getConnection(urlConexao, usuarioConexao, senhaConexao);
		} catch (SQLException e) {
			System.err.print(MSG_ERRO_CONEXAO);
			return null;
		}
	}

	public void inserir(Certidao c) {

		if (c != null) {
			Connection con = getConexao();
			PreparedStatement psCert = null;
			PreparedStatement psEnd = null;

			try {
				psCert = con.prepareStatement(INSERT_CERTIDAO);
				psCert.setInt(1, c.getId());
				psCert.setString(2, c.getNome());
				psCert.setString(3, c.getDiasEmissao());
				psCert.setInt(4, c.getOrgao_Emissor_id());

				psCert.executeUpdate();

			} catch (SQLException e) {
				System.err.print(e.getMessage());

			} finally {
				fechaRecursos(con, psCert, null);
				fechaRecursos(con, psEnd, null);
			}
		}
	}

	public void atualizar(Certidao c) {

		if (c != null) {
			Connection con = getConexao();
			PreparedStatement psCert = null;
			PreparedStatement psEnd = null;

			try {
				psCert = con.prepareStatement(ATUALIZAR_CERT);
				psCert.setString(1, c.getNome());
				psCert.setInt(2, c.getId());

				// psCert.setString(3, c.getDiasEmissao());
				// psCert.setInt(4, c.getOrgao_Emissor_id());

				psCert.executeUpdate();

			} catch (SQLException e) {
				System.err.print(e.getMessage());

			} finally {
				fechaRecursos(con, psCert, null);
				fechaRecursos(con, psEnd, null);
			}
		}
	}

	public Certidao procurar(int id) {
		if (id != 0) {
			Connection con = getConexao();
			PreparedStatement ps = null;
			ResultSet rs = null;
			try {
				ps = con.prepareStatement(PROCURA_CERT);
				ps.setInt(1, id);
				rs = ps.executeQuery();
				if (rs.next()) {
					return carregarCertidao(rs);

				} else {
					System.err.print(MSG_CERTIDAO_NAO_CADASTRADA);
				}
			} catch (SQLException e) {
				System.err.println(MSG_ERRO_ACESSO_BD);
				System.err.println(e.getMessage());

			} finally {
				fechaRecursos(con, ps, rs);
			}
		}
		return null;
	}

	private Certidao carregarCertidao(ResultSet rs) throws SQLException {
		int bdId = rs.getInt(1);
		String bdNome = rs.getString(2);
		String bdDiasEmissao = rs.getString(3);
		int bdOrgao_Emissor_id = rs.getInt(4);

		Certidao cert = new Certidao();
		cert.setId(bdId);

		cert.setId(rs.getInt(1));
		cert.setNome(bdNome);
		cert.setDiasEmissao(bdDiasEmissao);
		cert.setOrgao_Emissor_id(bdOrgao_Emissor_id);

		return cert;
	}

	public List<Certidao> listar() {
		List<Certidao> certidoes = new ArrayList<>();
		Connection con = getConexao();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			ps = con.prepareStatement(LISTA_CERT);
			rs = ps.executeQuery();
			while (rs.next()) {
				Certidao c = carregarCertidao(rs);
				certidoes.add(c);
			}
		} catch (SQLException e) {
			System.err.println(MSG_ERRO_ACESSO_BD);
			System.err.println(e.getMessage());
		}
		return certidoes;
	}

	public void remover(int id) {
		if (id != 0) {
			Connection con = getConexao();
			PreparedStatement ps = null;
			try {
				ps = con.prepareStatement(DELETE_CERT);
				ps.setInt(1, id);
				int rows = ps.executeUpdate();
				if (rows <= 0) {
					System.err.println("ID não encontrado");
				}
			} catch (SQLException e) {
				System.err.println(MSG_ID_NAO_ENCONTRADO);
				System.err.println(e.getMessage());
			} finally {
				fechaRecursos(con, ps, null);
			}
		} else {
			System.err.println(MSG_ID_INVALIDO);
		}
	}

	private void fechaRecursos(Connection con, PreparedStatement ps, ResultSet rs) {
		try {
			if (rs != null) {
				rs.close();
			}
		} catch (Exception e) {}
		try {
			if (ps != null) {
				ps.close();
			}
		} catch (Exception e) {}
		try {
			if (con != null) {
				con.close();
			}
		} catch (Exception e) {}
	}
}
1 curtida