Bom dia caros colegas.
Sou iniciante e venho utilizando o livro do Professor Sérgio Furgeri para estudar. Bem, chegando ao JDBC me surgiu a dúvida a seguir.
Tenho a classe FabricaDeConexao a seguir:
package DAO;
//import javax.sql.*;
import javax.swing.JOptionPane;
import java.sql.*;
public class FabricaDeConexao {
public boolean abreConexao() throws SQLException{
try{
//Tenta Encontrar o Driver
Class.forName(DRIVER);
conexao = DriverManager.getConnection(URL,USUARIO,SENHA);
//Retorna Verdadeiro se tudo for ok
return true;
}
//Caso o Driver não seja encontrado
catch(ClassNotFoundException erro){
JOptionPane.showMessageDialog(null, "Driver não encontrado " + erro.toString());
return false;
}
}
public void fechaConexao(){
try {
conexao.close();
}
catch(SQLException erro){
System.out.println("Erro ao fechar conexao");
}
}
Connection conexao = null;
final String DRIVER = "com.mysql.jdbc.Driver";
final String BANCO = "banco";
final String URL = "jdbc:mysql://localhost:3306/"+BANCO;
final String USUARIO = "aluno";
final String SENHA = "estacio";
}
E resolvi criar uma classe separada para realizar consultas a um banco, no caso a classe ConsultaFilme a seguir:
package DAO;
import java.sql.*;
public class ConsultaFilme {
private FabricaDeConexao fcConexao = new FabricaDeConexao();
PreparedStatement statement = null;
//A linha a seguir define uma String de nome sql que seleciona codigo e o titulo da tabela filmes onde
//o código seja maior que um valor a ser recebido e menor que outro valor a ser recebido
//Após isso, os dados são ordenados pelo código
String sql = "SELECT codigo, titulo FROM Filmes WHERE codigo" + "> ? AND codigo < ? ORDER BY codigo";
//Cria um objeto da interface PreparedStatement que possibilita a execução de um script SQL
//PreparedStatement statement = null;
//Método consultaPorCodigo recebe duas Strings, uma com o codigo menor, e outro com o maior
public void consultaPorCodigo(String codMenor, String codMaior){
try{
PreparedStatement statement = fcConexao.conexao.prepareStatement(sql);
}
catch(SQLException erro){
System.out.println(erro.toString());
}
try{
//O objeto statement usa o método setString que recebe como parametro um valor de ordenação e o valor da String
statement.setString(1, codMenor);
statement.setString(2, codMaior);
ResultSet resultado = statement.executeQuery();
System.out.println("NOME TITULO---------------------------------------------------------");
System.out.println("------ ---------------------------------------------------------------");
while(resultado.next()){
String codigo = resultado.getString("codigo");
String titulo = resultado.getString("titulo");
System.out.println(codigo + " " + titulo);
}
resultado.close();
statement.close();
}
catch(SQLException erro){
System.out.println(erro.toString());
}
}
}
Bom, finalizando, eu criei uma classe que vai operar em terminal mesmo para ler duas Strings e chamar o método consultaPorCodigo da classe acima e é aí que aparece o problema, tudo compila, mas quando eu digito os valores e o método é chamado, dá o erro: Exception in thread “main” java.lang.NullPointerException e aponta para as linhas: PreparedStatement statement = fcConexao.conexao.prepareStatement(sql); da classe ConsultaFilme e cf.consultaPorCodigo(valorMenor, valorMaior); da classe abaixo:
package DAO;
import java.util.*;
public class ConsultaFilmesTerminal {
FabricaDeConexao fc = new FabricaDeConexao();
static String valorMenor;
static String valorMaior;
private static Scanner leitor;
public static void main(String[] args) {
// TODO Auto-generated method stub
leitor = new Scanner(System.in);
System.out.println("Digite o valor Menor: ");
valorMenor = leitor.nextLine();
System.out.println("Digite o valor Menor: ");
valorMaior = leitor.nextLine();
ConsultaFilme cf = new ConsultaFilme();
cf.consultaPorCodigo(valorMenor, valorMaior);
}
}
Sei que a postagem ficou grande, mas tentei ser o mais claro possível, espero que os colegas possam me ajudar a entender isso. Obrigado e fiquem na paz!