Problema com PreparedStatement e BD MySQL

Boa tarde a todos!

Sou iniciante com java… estou tendo que montar uma página para web que lê dados do BD e exibe na tela dependendo do e-mail digitado pelo usuário.

O banco de dados usado é o mysql 4.0 e o java é o 1.5

Eu fiz o seguinte: criei um bean e uma classe que tem um método que faz o select no BD e depois retorna o objeto bean.

Estou com dois problemas:

  • O primeiro é que não estou conseguindo fazer com que o select retorne algum resultado (da nullPointerexception).
  • O segundo, é que não sei como utilizar este bean no meu JSP.

Alguém pode dar uma luz??? Já tentei vários testes e nada funcionou :frowning:

Abaixo encaminho meus códigos:

ExtratoBean.java
package promo;
import java.beans.*;
import java.io.Serializable;

public class ExtratoBean {

private int idUsuario;
private String chave;
private String dataCadastro;
private int mes;
private int ano;
private int minutos;
private String nome;
private int meta;

public ExtratoBean() {
}

public ExtratoBean(int idUsuario, String chave, String dataCadastro, int mes, int ano, int minutos, String nome, int meta) {
    this.idUsuario = idUsuario;
    this.chave = chave;
    this.dataCadastro = dataCadastro;
    this.mes = mes;
    this.ano = ano;
    this.minutos = minutos;
    this.meta = meta;
    this.nome = nome;
}

public int getIdUsuario() {
    return idUsuario;
}

public void setIdUsuario(int idUsuario) {
    this.idUsuario = idUsuario;
}

public String getChave() {
    return chave;
}

public void setChave(String chave) {
    this.chave = chave;
}

public String getDataCadastro() {
    return dataCadastro;
}

public void setDataCadastro(String dataCadastro) {
    this.dataCadastro = dataCadastro;
}

 public int getMes() {
    return mes;
}

public void setMes(int mes) {
    this.mes = mes;
}

public int getAno() {
    return mes;
}

public void setAno(int ano) {
    this.ano = ano;
}

public int getMinutos() {
    return minutos;
}

public void setMinutos(int minutos) {
    this.minutos = minutos;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public int getMeta() {
    return meta;
}

public void setMeta(int meta) {
    this.meta = meta;
}

}


Classe Extrato.java

package promo;
import java.util.;
import java.sql.
;
import desejo21.ConexaoMysql;

public class Extrato {
static ExtratoBean bean = null;
ResultSet rs = null;

public static ExtratoBean extratoUsuario(String email) {

    try {
        Connection connection = ConexaoMysql.getConnection();
        PreparedStatement pstmt = connection.prepareStatement
                ("SELECT u.id_usuario, u.chave, u.data_cadastro, e.mes, e.ano, e.minutos, p.nome, p.meta " +
                "FROM extrato e, usuario u, premio p " +
                "WHERE u.id_usuario = e.id_usuario " +
                "AND u.id_premio = p.id_premio " +
                "AND u.chave = ?");
        
        pstmt.setString(1, email);
        ResultSet rs = pstmt.executeQuery();
        
        bean = new ExtratoBean(rs.getInt("id_usuario"), rs.getString("chave"),
                               rs.getString("data_cadastro"), rs.getInt("mes"),
                               rs.getInt("ano"), rs.getInt("minutos"),
                               rs.getString("nome"), rs.getInt("meta"));
 		
 		pstmt.close();  
            connection.close();
    } catch (Exception e) {
        System.out.println("Erro no comando SQL de Consulta " + e);
    }
    return bean;
}

}


extrato.jsp

<%@page contentType=“text/html”%>
<%@page pageEncoding=“ISO-8859-1”%>
<%@page import=“promo.*”%>

<%
String email = request.getParameter(“email”);
%>

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
http://www.w3.org/TR/html4/loose.dtd”>

<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=ISO-8859-1”>
<title></title>
</head>
<body>

&lt;%@ include file="topo.jsp" %&gt;
    
    &lt;h1&gt;Extrato&lt;/h1&gt;
    
    &lt;table&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;%@ include file="menu.jsp" %&gt;&lt;/td&gt;
            &lt;td&gt;
                &lt;%
                    if(email == null) {
                %&gt;
                
                &lt;form method="get" action="extrato.jsp"&gt;
                    Digite seu e-mail para poder acessar seu extrato<br>
                    &lt;input type="text" name="email"&gt; &lt;input type="submit" name="enviar" value="Ok"&gt;
                &lt;/form&gt;
                 
                &lt;%
                    } else {
                      ExtratoBean extrato = Extrato.extratoUsuario(email);
                %&gt;
                Premio: &lt;%= extrato.getChave() %&gt;<br>
                Minutos navegados: <br>
                Meta: <br>
                Ainda faltam xx minutos de navegação para você atingir sua meta!
               
                &lt;%
                    }
                %&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/table&gt;

&lt;/body&gt;

</html>

Obrigada :slight_smile:

você conferiu se a sua query (num query analizer) retorna o resultado desejado?

Conferi…

No MySQLAdmin ele retorna os dados corretos!

Mais não sei se para transpor no java eu tinha que fazer alguma alteração na sintaxe…

Até realizei testes com uma query mais simples, mais mesmo assim não rodou…

Eu estou forçando um e-mail de teste no código.

Está dando o seguinte erro: Erro no comando SQL de Consulta com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column ‘carine’ in ‘where clause’

Mais se ue rodar a query no mysqlAdmin ela retorna o resultado correto.

Será que é a sintaxe da query???

manda imprimir a query para vc ver e depois vc pega a query que ele imprimiu e coloca no mysqlAdmin e roda para ver se dar erro.

Desculpe, mais como eu mando imprimir a query?

estou testando com uma query mais simples, e esta dando esse erro: java.sql.SQLException: Before start of result set

Não sei se o problema está na query ou em alguma coisa que fiz errado do java! Pois na tela o erro é NullPointerException.

Obrigada pela ajuda

modifiquei o que está em verde, tirei de onde está AZUL e colei onde está o vermelho.

[code]
Classe Extrato.java
package promo;
import java.util.;
import java.sql.
;
import desejo21.ConexaoMysql;

public class Extrato {
[color=blue]static ExtratoBean bean = null;
ResultSet rs = null;[/color]

public static ExtratoBean extratoUsuario(String email) {

try {
[color=red]ExtratoBean bean = null;
ResultSet rs = null;[/color]
Connection connection = ConexaoMysql.getConnection();

[color=green]String comando = "SELECT u.id_usuario, u.chave, u.data_cadastro, e.mes, e.ano, e.minutos, p.nome, p.meta " +
"FROM extrato e, usuario u, premio p " +
"WHERE u.id_usuario = e.id_usuario " +
"AND u.id_premio = p.id_premio " +
“AND u.chave = ?”;
System.out.println("Extrato.extratoUsuario :: comando --> "+comando);
PreparedStatement pstmt = connection.prepareStatement
(comando);[/color]

pstmt.setString(1, email);
ResultSet rs = pstmt.executeQuery();

bean = new ExtratoBean(rs.getInt(“id_usuario”), rs.getString(“chave”),
rs.getString(“data_cadastro”), rs.getInt(“mes”),
rs.getInt(“ano”), rs.getInt(“minutos”),
rs.getString(“nome”), rs.getInt(“meta”));

pstmt.close();
connection.close();
} catch (Exception e) {
System.out.println("Erro no comando SQL de Consulta " + e);
}
return bean;
}
} [/code]

modifiquei o que está em verde, tirei de onde está AZUL e colei onde está o vermelho.

Classe Extrato.java
package promo;
import java.util.;
import java.sql.
;
import desejo21.ConexaoMysql;

public class Extrato {
[color=blue]static ExtratoBean bean = null;
ResultSet rs = null;[/color]

public static ExtratoBean extratoUsuario(String email) {

try {
[color=red]ExtratoBean bean = null;
ResultSet rs = null;[/color]
Connection connection = ConexaoMysql.getConnection();

[color=green]String comando = "SELECT u.id_usuario, u.chave, u.data_cadastro, e.mes, e.ano, e.minutos, p.nome, p.meta " +
"FROM extrato e, usuario u, premio p " +
"WHERE u.id_usuario = e.id_usuario " +
"AND u.id_premio = p.id_premio " +
“AND u.chave = ?”;
System.out.println("Extrato.extratoUsuario :: comando --> "+comando);
PreparedStatement pstmt = connection.prepareStatement
(comando);[/color]

pstmt.setString(1, email);
ResultSet rs = pstmt.executeQuery();

bean = new ExtratoBean(rs.getInt(“id_usuario”), rs.getString(“chave”),
rs.getString(“data_cadastro”), rs.getInt(“mes”),
rs.getInt(“ano”), rs.getInt(“minutos”),
rs.getString(“nome”), rs.getInt(“meta”));

pstmt.close();
connection.close();
} catch (Exception e) {
System.out.println("Erro no comando SQL de Consulta " + e);
}
return bean;
}
}

O netbeans imprimiu os seguintes erros:
Extrato.extratoUsuario :: comando --> usuario.id_usuario, usuario.chave, usuario.data_cadastro, extrato.mes, extrato.ano, extrato.minutos, premio.nome, premio.meta FROM extrato, usuario, premio WHERE usuario.id_usuario = extrato.id_usuario AND usuario.id_premio = premio.id_premio AND usuario.chave = ?

Erro no comando SQL de Consulta com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'usuario.id_usuario, usuario.chave, usuario.data_cadastro, extra

Mais tive que fazer algumas alterações no código enviado, pois não estava compilando com a variável bean dentro do try:

public class Extrato {

public static ExtratoBean extratoUsuario(String email) {
    ExtratoBean bean = null;

    try {          
        ResultSet rs = null;
        Connection connection = ConexaoMysql.getConnection();
                 
        String comando = "usuario.id_usuario, usuario.chave, usuario.data_cadastro, extrato.mes, extrato.ano, extrato.minutos, premio.nome, premio.meta " +

"FROM extrato, usuario, premio " +
"WHERE usuario.id_usuario = extrato.id_usuario " +
"AND usuario.id_premio = premio.id_premio " +
“AND usuario.chave = ?”;
System.out.println("Extrato.extratoUsuario :: comando --> "+comando);
PreparedStatement pstmt = connection.prepareStatement(comando);

        pstmt.setString(1, email);
        rs = pstmt.executeQuery();
        
        bean = new ExtratoBean(rs.getInt("id_usuario"), rs.getString("chave"),
                               rs.getString("data_cadastro"), rs.getInt("mes"),
                               rs.getInt("ano"), rs.getInt("minutos"),
                               rs.getString("nome"), rs.getInt("meta"));
 		
 	pstmt.close();  
            connection.close();
    } catch (Exception e) {
        System.out.println("Erro no comando SQL de Consulta " + e);
    }
    return bean;
}

}

Você sabe o que pode estar dando o erro?

Valeu pela ajuda :slight_smile:

:shock: Faltou a palavra [color=red]select[/color] no inicio do comando. :wink:

Desculpe minha falta de atenção…

Acho que ainda não é isso, deu a seguinte mensagem: Extrato.extratoUsuario :: comando --> SELECT usuario.id_usuario, usuario.chave, usuario.data_cadastro, extrato.mes, extrato.ano, extrato.minutos, premio.nome, premio.meta FROM extrato, usuario, premio WHERE usuario.id_usuario = extrato.id_usuario AND usuario.id_premio = premio.id_premio AND usuario.chave = ?

Erro no comando SQL de Consulta java.sql.SQLException: Illegal operation on empty result set.

int i = 0;
while (rs.next()) {
bean = new ExtratoBean(rs.getInt(“id_usuario”), rs.getString(“chave”),
rs.getString(“data_cadastro”), rs.getInt(“mes”),
rs.getInt(“ano”), rs.getInt(“minutos”),
rs.getString(“nome”), rs.getInt(“meta”));

i++;	

}
System.out.println("Extrato.extratoUsuario :: Tamanho RS --> "+i);

:cry:Deram vários erros:

INFO: Illegal access: this web application instance has been stopped already. Could not load java.net.BindException. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1238)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1198)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at com.mysql.jdbc.CommunicationsException.(CommunicationsException.java:155)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2652)
at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1345)
at com.mysql.jdbc.Connection.realClose(Connection.java:4784)
at com.mysql.jdbc.Connection.cleanup(Connection.java:2040)
at com.mysql.jdbc.Connection.finalize(Connection.java:3296)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
02/01/2007 16:56:34 org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already. Could not load java.net.BindException. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1238)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1198)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at com.mysql.jdbc.CommunicationsException.(CommunicationsException.java:155)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2652)
at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1345)
at com.mysql.jdbc.Connection.realClose(Connection.java:4784)
at com.mysql.jdbc.Connection.cleanup(Connection.java:2040)
at com.mysql.jdbc.Connection.finalize(Connection.java:3296)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
02/01/2007 16:56:35 org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already. Could not load java.net.BindException. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1238)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1198)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at com.mysql.jdbc.CommunicationsException.(CommunicationsException.java:155)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2652)
at com.mysql.jdbc.MysqlIO.quit(MysqlIO.java:1345)
at com.mysql.jdbc.Connection.realClose(Connection.java:4784)
at com.mysql.jdbc.Connection.cleanup(Connection.java:2040)
at com.mysql.jdbc.Connection.finalize(Connection.java:3296)
at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)
Extrato.extratoUsuario :: comando --> SELECT usuario.id_usuario, usuario.chave, usuario.data_cadastro, extrato.mes, extrato.ano, extrato.minutos, premio.nome, premio.meta FROM extrato, usuario, premio WHERE usuario.id_usuario = extrato.id_usuario AND usuario.id_premio = premio.id_premio AND usuario.id_usuario = 20
Extrato.extratoUsuario :: Tamanho RS --> 0

Alterei o WHERE para um valor que retorna um resultado e deram os erros acima…

cara, faz um log legal, imprimindo a query e o erro que ele retorna…
Pra mim ja ta mto complicado de ler esse topic…

mas se a query executa normal, o problema pode ser o formato do dado q vc envia (as vezes a query tá pra receber int, e vc ta mandando varchar, sei lá), ou algum detalhe besta que não estamos percebendo.

Com o log fica mais fácil.

Abraço

mais o problema aí não é mais na query e sim na parte de carregar a tela

Eu ainda não sei como fazer um log… Estou iniciando no java :frowning:

Mais com relação ao formato do dado enviado, eu to mandando um int para a query. Não to? O id_usuario da clausula where não é um int?

Obrigada pela ajuda :slight_smile:

pstmt.setString(1, email);
rs = pstmt.executeQuery();

bean = new ExtratoBean(rs.getInt(“id_usuario”), rs.getString(“chave”),
rs.getString(“data_cadastro”), rs.getInt(“mes”),
rs.getInt(“ano”), rs.getInt(“minutos”),
rs.getString(“nome”), rs.getInt(“meta”));

} catch (Exception e) {
System.out.println("Erro no comando SQL de Consulta " + e);
} finally {
pstmt.close();
rs.close();
connection.close();
}
}
}

deu td certo?

Testando com uma query mais simples funcionou direitinho, mais com a query mais complicada, continua dando erro!

Deixa eu fazer uma pergunta: Porque fechar a conexão no finaly? Se ele não entrar no try e abrir a conexão isso não vai dar erro???

Valeu pela ajuda…

ele sempre vai passar pelo finally, dando erro ou não