Problemas com preparedStatement java.lang.ClassCastException

6 respostas
renato_the_grey

Bom, estava fazendo um aplicativo e criei uma classe pai, Gerenciar, que tem como classes filhas GerenciarAutor e GerenciarLivro.
Ambas as classes filhas usam um objeto preparedStatement. Por isso, coloquei no construtor de gerenciar a chamada de um metodo que cria um prepared statement de acordo com a conexao, que é gerada por um metodo estatico em outra classe. Enfim, quando executo o programa ele da o seguinte log de erro:

Exception in thread main java.lang.ClassCastException: com.mysql.jdbc.StatementImpl cannot be cast to java.sql.PreparedStatement

at sql.Gerenciar.prepareStatement(Gerenciar.java:34)

at sql.Gerenciar.(Gerenciar.java:13)

at sql.GerenciarAutor.(GerenciarAutor.java:10)

at main.Executar.menu(Executar.java:19)

at main.Main.main(Main.java:7)

Ai vai o codigo da classe “executar” que define a conexao e cria os “gerenciar”:

public class Executar {
	
	public void menu()
	{
		int opcao = 0;
		GerenciarConexao.createConnection();
		GerenciarAutor gerAutor = new GerenciarAutor();
		GerenciarLivro gerLivro = new GerenciarLivro();
		Autor autor = new Autor();
		Livro livro = new Livro();
		
		do
		{
			opcao = lerInt("Digite a opcao desejada\n" +
					"1- Cadastrar Livro\n" +
					"2- Consultar Livros\n" +
					"3- Alterar Livros\n" +
					"4- Deletar Livro\n" +
					/*"5- Consultar Autor\n" +*/
					"6- Sair");
			if (opcao == 1) {
				
				autor.setDados();
				livro.setDados();
				gerAutor.cadastrar(autor);
				gerLivro.cadastrar(livro);
				
			} else if (opcao == 2) {
				gerLivro.consultar();
			} else if (opcao == 3) {
				gerLivro.alterar();
			} else if (opcao == 4) {
				gerLivro.deletar();
			}
			
		}while(opcao != 6);
		
		GerenciarConexao.fecharConexao();
	}
}

Codigo da classe pai Gerenciar:

public abstract class Gerenciar {
	
	public Gerenciar()
	{
		prepareStatement();
	}

	protected String sqlSelect;
	protected String sqlCreate;
	protected String sqlUpdate;
	protected String sqlDelete;
	protected PreparedStatement pstm;
	
	public void prepareStatement(String comando)
	{
		try {
			pstm = GerenciarConexao.getConexao().prepareStatement(comando);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public void prepareStatement()
	{
		try {
			pstm = (PreparedStatement) GerenciarConexao.getConexao().createStatement();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public String lerString(String mensagem)
	{
		return JOptionPane.showInputDialog(mensagem);
	}
	
	public int lerInt(String mensagem)
	{
		return Integer.parseInt(JOptionPane.showInputDialog(mensagem));
	}

	public abstract void mostrarInformacoes(ResultSet rs);
	
	public void closeStatement(){
		try {
			pstm.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

E, por fim, o codigo da classe que cria a conexao com o banco de dados (mySql) pelo metodo estatico:

public class GerenciarConexao {
	
	private static Connection conn;
	
	public static Connection getConexao()
	{
		return conn;
	}
	
	public static void createConnection()
	{
		try
		{
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbLibrary", "root", "renato");
		}
		catch(Exception e) {    
	        e.printStackTrace();  
		}
	}
	
	public static void fecharConexao()
	{
		try
		{
			conn.close();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}

Espero ajuda aew galera o/.

Abraços,

Renato

6 Respostas

romarcio
public static void createConnection()  
    {  
        try  
        {  
            Class.forName("com.mysql.jdbc.Driver");  
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbLibrary", "root", "renato");  
        }  
        catch(Exception e) {      
            e.printStackTrace();    
        }  
    }

Tem que retornar uma conexão, você criou o método como void, não está retornando.

public static Connection createConnection()  
    {  
        try  
        {  
            Class.forName("com.mysql.jdbc.Driver");  
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbLibrary", "root", "renato");  
        }  
        catch(Exception e) {      
            e.printStackTrace();    
        } 
        return conn; 
    }
renato_the_grey

Ele nao retorna a conexao porque a variavel estatica conn esta na propria classe.
Pra retornar a conexao eu uso o getConexao… resolvi o que estava dando errado… foi só tirar o prepare statement do greneciar… aquele metodo que estava sem argumentos.

Vlw ai pra quem tentou ajudar.

Abraços.

romarcio

renato_the_grey:
Ele nao retorna a conexao porque a variavel estatica conn esta na propria classe.
Pra retornar a conexao eu uso o getConexao… resolvi o que estava dando errado… foi só tirar o prepare statement do greneciar… aquele metodo que estava sem argumentos.

Vlw ai pra quem tentou ajudar.

Abraços.

É mesmo, desculpa. Foi falha minha, não tinha reparado que a variável era estática.

renato_the_grey

Tranquilo cara, valeu msm assim :stuck_out_tongue:

abraço

wbdsjunior
Exception in thread "main" java.lang.ClassCastException: com.mysql.jdbc.StatementImpl cannot be cast to java.sql.PreparedStatement...

verifique se fez o import correto para java.sql.PreparedStatement.

renato_the_grey

Resolvi galera, vlw ai!!

Criado 18 de agosto de 2011
Ultima resposta 19 de ago. de 2011
Respostas 6
Participantes 3