Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
40
respostas

jdbc isolando acesso aos dados e dao

minha duvida eh que na class produto ta dando erro esse codigo: new ConnectionPool().getConnection())

40 respostas

Posta o teu código, com todas as classes.

Qual é o erro ? Você poderia postar o código da sua classe produto ?

Coloque a linha toda em que etá dando o erro. E coloque também toda a mensagem de erro.

Olhando daqui, tu não estás fechando um parenteses a mais?

new ConnectionPool().getConnection())

o erro eh esse codigo que eu postei = new ConnectionPool().getConnection()) mas embaixo eu vo posta a classe q ta dando erro toda:

package lojavirtual; import lojavirtual.modelo.Produto;

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;

import sun.jdbc.odbc.ee.ConnectionPool;

public class TestaInsercaoDeProduto {

public static void main(String[] args) throws SQLException{ Produto mesa = new Produto("Mesa azul","Mesa com 4 pés");

try(Connection con = new ConnectionPool().getConnection()){

String sql = "insert into produto(nome, descricao) values(?,?)";

try(PreparedStatement stmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)){ stmt.setString(1, mesa.getNome()); stmt.setString(2, mesa.getDescricao()); stmt.execute();

try(ResultSet rs = stmt.getGeneratedKeys()){ if(rs.next()){ int id = rs.getInt("id"); mesa.setId(id); } } } } } }

Provavelmente, em seu console, aparece uma mensagem de erro. Ou o programa nem mesmo está compilando? Há um sublinhado vermelho nessa parte do código? Quando tu coloca o mouse sobre, não dá dicas?

vo falar de novo ou o sublinhado com erro eh?ConnectionPool()

Posta aqui a tua classe ConnectionPool. Explica também por que está sendo feito o import abaixo

import sun.jdbc.odbc.ee.ConnectionPool;

Roberto fiz isso e nao deu certo.ai fiz outra coisa pedi o eclipse pra criar a Class ConnectionPool

A questão é justamente essas: tu não tem a classe ConnectionPool, por isso o erro. Olha a aula de novo e codifica a classe. A partir daí o tue código irá funcionar.

mesmo assim nao da certo...

Coloca aqui o código de TODAS as classes envolvidas. E o erro que está dando.

como eu fazer isso Roberto que eu nao tneho a class to seguindo a video aula?

Exception in thread "main" java.lang.Error: Unresolved compilation problems: The constructor ConnectionPool() is undefined The method getConnection() is undefined for the type ConnectionPool

at lojavirtual.TesteInsercaoDeProduto.main(TesteInsercaoDeProduto.java:22)

esse eh o erro que ta dando

Se tu não tiver a classe criada, ou ela estiver com o nome errado, não encontrará.

Outra dica, deixe o mouse sobre o erro, e veja o que o eclipse diz sobre ele.

public class ConnectionPool {

    private DataSource dataSource;

    ConnectionPool() {
        JDBCPool pool = new JDBCPool();
        pool.setUrl("jdbc:hsqldb:hsql://localhost/loja-virtual");
        pool.setUser("SA");
        pool.setPassword("");
        this.dataSource = pool;
    }

    Connection getConnection() throws SQLException {
        Connection connection = dataSource.getConnection();
        return connection;
    }

}

Se tu tá seguindo a aula, essa classe foi criada. O erro que está dando é justamente pela inexistência da classe. Lembra que cada classe tem que estar em um arquivo separado, caso contrário irá dar erro.

arthur refiz o codigo acima conforme vc digitou. ai voltei pra class TesteInsercaoDeProduto e ai o ConnectionPool().getConnection voutou a ficar com erro..

Exception in thread "main" java.lang.Error: Unresolved compilation problems: The constructor ConnectionPool() is undefined The method getConnection() is undefined for the type ConnectionPool

at lojavirtual.TesteInsercaoDeProduto.main(TesteInsercaoDeProduto.java:22)

Retire o import "import sun.jdbc.odbc.ee.ConnectionPool;" da classe TesteInsercaoDeProduto. Será que tu não fez o import errado? Veja se te dá opção diferentes de import, sem ele.

E de novo, coloca todas as classes aqui para que a gente possa te ajudar. Sem elas a gente vai ficar só no chute e vai demora mais ainda para ter uma solução.

roberto estou colocando toas as classes que voce pediu... package lojavirtual;

public interface Connection { Result execute(String sql);

}

package lojavirtual;

import java.sql.Connection; import java.sql.SQLException;

import javax.sql.DataSource;

import org.hsqldb.jdbc.JDBCPool;

public class ConnectionPool { private DataSource dataSource; ConnectionPool(){ JDBCPool pool = new JDBCPool(); pool.setUrl("jdbc:hsqldb:hsql://localhost/lojavirtual"); pool.setUser("SA"); pool.setPassword(""); this.dataSource = pool; }

Connection getConnection() throws SQLException { Connection connection = dataSource.getConnection(); return connection; } }

package lojavirtual;

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

import javax.sql.DataSource;

import org.hsqldb.jdbc.JDBCPool;

public class Database { private DataSource dataSouce; Database(){ JDBCPool pool = new JDBCPool(); pool.setUrl("jdbc:hsqldb:hsql://localhost/loja-virtual"); pool.setUser("SA"); pool.setPassword(""); this.dataSouce = pool;

} Connection getConnection() throws SQLException {

//Connection connection = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/lojavirtual", "SA", ""); Connection connection = dataSouce.getConnection(); return getConnection();

} }

package lojavirtual; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import org.hsqldb.jdbc.*;

public class TestaConexao {

public static void main(String[] args) throws SQLException { Connection connection = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/lojavirtual", "SA", "");

Statement statement = connection.createStatement(); boolean resultado = statement.execute("select * from Produto"); ResultSet resultSet = statement.getResultSet();

while(resultSet.next()) { int id = resultSet.getInt("id"); String nome = resultSet.getString("nome"); String descricao = resultSet.getString("descricao"); System.out.println(id); System.out.println(nome); System.out.println(descricao); }

connection.close(); resultSet.close(); statement.close();

}

}

package lojavirtual;

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;

import sun.font.CreatedFontTracker;

public class TestaInsercao {

public static void main(String[] args)throws SQLException {

try (Connection connection = new Database().getConnection()){; connection.setAutoCommit(false); String sql = "insert into Produto (nome, descricao) values (?,?)"; try

(PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)){

adiciona("tv lcd", "32 polegadas", statement); adiciona("blueray", "full hdmi",statement); connection.commit();

}catch(Exception ex){ ex.printStackTrace(); connection.rollback(); }

} }

private static void adiciona(String nome, String descricao, PreparedStatement statement) throws SQLException {

if(nome.equals("blueray")){ throw new IllegalArgumentException("Problema ocorrido"); } statement.setString(1,nome); statement.setString(2,descricao);

boolean resultado = statement.execute();

System.out.println(resultado); ResultSet resultSet = statement.getGeneratedKeys(); while(resultSet.next()){ String id = resultSet.getString("id"); System.out.println(id + "gerado"); } resultSet.close(); }

}

package lojavirtual;

import java.sql.DriverManager; import java.sql.SQLException; import org.hsqldb.jdbc.*; public class TestaListagem { public static void main(String[] args) throws SQLException {

Connection connection = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/lojavirtual", "SA", "");

connection.close(); }

}

package lojavirtual;

import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement;

public class TestaRemocao { public static void main(String[] args)throws SQLException { Connection connection = Database.getConnection(); Statement stmt = connection.createStatement(); stmt.execute("delete from Produto where id>3");

int count = stmt.getUpdateCount(); System.out.println(count + " linhas atualizadas"); }

}

package lojavirtual;

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;

import java.sql.Statement; import sun.jdbc.odbc.ee.ConnectionPool;

import lojavirtual.modelo.Produto;

public class TesteInsercaoDeProduto {

public static void main(String[] args)throws SQLException {

Produto mesa = new Produto("Mesa azul", "Mesa com 4 pes"); try(Connection con = new ConnectionPool().getConnection()){ String sql = "insert into produto (nome,descricao)values(?,?)"; try(PreparedStatement stmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)){

stmt.setString(1, mesa.getNome()); stmt.setString(2, mesa.getDescricao()); stmt.execute();

try(ResultSet rs = stmt.getGeneratedKeys()){ if(rs.next()){ int id = rs.getInt("id"); mesa.setId(id); } } }

} }

}

package lojavirtual.modelo;

public class Produto {

public Produto(String nome, String descricao) { super(); this.nome = nome; this.descricao = descricao; } private Integer id; private String nome; private String descricao; public String getNome() { return nome; } public String getDescricao() { return descricao; } public void setId(Integer id) { this.id = id; }

}

Na classe TestaInsercaoDeProduto, retira o import para a package da Sun. Ela não é necessária. Vi em uma outra classe que tu importou uma outra package que não é necessária também. Repara que em todos os exercícios são utilziadas as packages do java mesmo, ou seja, aquelas que começam com java.algumacoisa.

package lojavirtual;

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;

import java.sql.Statement; import sun.jdbc.odbc.ee.ConnectionPool;

import lojavirtual.modelo.Produto;

public class TesteInsercaoDeProduto {

public static void main(String[] args)throws SQLException {

Produto mesa = new Produto("Mesa azul", "Mesa com 4 pes"); try(Connection con = new ConnectionPool().getConnection()){ String sql = "insert into produto (nome,descricao)values(?,?)"; try(PreparedStatement stmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)){

stmt.setString(1, mesa.getNome()); stmt.setString(2, mesa.getDescricao()); stmt.execute();

try(ResultSet rs = stmt.getGeneratedKeys()){ if(rs.next()){ int id = rs.getInt("id"); mesa.setId(id); } } }

} }

}

Te acostuma também a colocar o código formatado, usando o recurso que temos aqui para isso - clica nos números binários na caixa de edição e coloca o código aonde indicado.

Roberto eh pra apagar o packge ?

Retira esse import

import sun.jdbc.odbc.ee.ConnectionPool;

Se continuar dando erro, posta ele aqui.

retirei

Roberto mesmo assim esta dando erro a class TesteInsercao de Produto veja:

package lojavirtual;

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

import javax.sql.DataSource;

import org.hsqldb.jdbc.JDBCPool;
public class ConnectionPool{


    private DataSource dataSource;
    ConnectionPool(){
        JDBCPool pool = new JDBCPool();
        pool.setUrl("jdbc:hsqldb:hsql://localhost/lojavirtual");
        pool.setUser("SA");
        pool.setPassword("");
        this.dataSource = pool;




    }

          Connection getConnection() throws SQLException {
            //Connection connection = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/lojavirtual", "SA", "");
            Connection connection = dataSource.getConnection();
              return connection;
        }
}
enter code here
package lojavirtual;



import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;



import java.sql.Statement;
import sun.jdbc.odbc.ee.ConnectionPool;

import lojavirtual.modelo.Produto;

public class TesteInsercaoDeProduto {

    public static void main(String[] args)throws SQLException {

        Produto mesa = new Produto("Mesa azul", "Mesa com 4 pes");
        try(Connection con = new ConnectionPool.getConnection(){
            String sql = "insert into produto (nome,descricao)values(?,?)";
            try(PreparedStatement stmt = con.prepareStatement(sql,
                    Statement.RETURN_GENERATED_KEYS)){

                stmt.setString(1, mesa.getNome());
                stmt.setString(2, mesa.getDescricao());
                stmt.execute();

                try(ResultSet rs = stmt.getGeneratedKeys()){
                    if(rs.next()){
                    int id = rs.getInt("id");
                    mesa.setId(id);
                    }
                }
            }


        }
    }

}

Gustavo, Por que na package ConnectionPool foi importada a package javax.sql.DataSource? E na classe TesteInsercaoProduto continua com o import para sun.jdbc.ee.ConnectionPool, que já foi falado várias vezes que não é necessária.

tirei os erros sairam roberto . e agora nao consta erro na classe porem ao executar a class TesteInsercaoDeProduto, na console aparece o seguinte erro:

Exception in thread "main" java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: TO
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
    at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
    at lojavirtual.TesteInsercaoDeProduto.main(TesteInsercaoDeProduto.java:18)

O teu banco está em execução? Pergunto pois erro de Unknown Source leva a crer que o programa não achou o banco. Outra possibilidade é que o banco não tenha sido criado.

roberto esta fiz o scritp pra roda banco e ate dei um ctrl c pra roda-lo novamente... olha ai roberto:

Microsoft Windows [versão 6.3.9600] (c) 2013 Microsoft Corporation. Todos os direitos reservados.

C:\Users\gustavo>cd workspace/lojavirtual/lib

C:\Users\gustavo\workspace\lojavirtual\lib>java -cp hsqldb.jar org.hsqldb.server .Server --database.0 file:lojavirtual --dbname.0 lojavirtual [Server@4b90690e]: [Thread[main,5,main]]: checkRunning(false) entered [Server@4b90690e]: [Thread[main,5,main]]: checkRunning(false) exited [Server@4b90690e]: Startup sequence initiated from main() method [Server@4b90690e]: Could not load properties from file [Server@4b90690e]: Using cli/default properties only [Server@4b90690e]: Initiating startup sequence... [Server@4b90690e]: Server socket opened successfully in 6 ms. [Server@4b90690e]: Database [index=0, id=0, db=file:lojavirtual, alias=lojavirtu al] opened sucessfully in 533 ms. [Server@4b90690e]: Startup sequence completed in 540 ms. [Server@4b90690e]: 2014-06-03 11:40:43.408 HSQLDB server 2.3.2 is online on port 9001 [Server@4b90690e]: To close normally, connect and execute SHUTDOWN SQL [Server@4b90690e]: From command line, use [Ctrl]+[C] to abort abruptly

C:\Users\gustavo\workspace\lojavirtual\lib>java -cp hsqldb.jar org.hsqldb.server
.Server --database.0 file:lojavirtual --dbname.0 lojavirtual
[Server@75e13ce3]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@75e13ce3]: [Thread[main,5,main]]: checkRunning(false) exited
[Server@75e13ce3]: Startup sequence initiated from main() method
[Server@75e13ce3]: Could not load properties from file
[Server@75e13ce3]: Using cli/default properties only
[Server@75e13ce3]: Initiating startup sequence...
[Server@75e13ce3]: Server socket opened successfully in 6 ms.
[Server@75e13ce3]: Database [index=0, id=0, db=file:lojavirtual, alias=lojavirtu
al] opened sucessfully in 568 ms.
[Server@75e13ce3]: Startup sequence completed in 577 ms.
[Server@75e13ce3]: 2014-06-03 12:20:25.133 HSQLDB server 2.3.2 is online on port
 9001
[Server@75e13ce3]: To close normally, connect and execute SHUTDOWN SQL
[Server@75e13ce3]: From command line, use [Ctrl]+[C] to abort abruptly

Realmente, não sei. Tem que pesquisar o quê pode estar acontecendo.

roberto, achei o erro..

String sql = "insert into to Produto (nome,descricao) values(?,?)";
tirei o to

Blz. Interessante que essa linha não estava assim na classe que tu havia passado antes. Tem que toma cuidado que quando pede ajuda, se o código mudou depois da última vez que foi postado, tem que colocar ele novamente. O código e o erro exato que está ocorrendo são importantíssimos para receber uma boa ajuda.

kra voltou a dar mesmo erro quando criei un novo package e transferia a class pra la. voltei pro pacote anterior mas o erro continuou

Quando muda a package tem que ser alterada as referências para as outras classes.

Oi Gustavo,

O caminho que o Roberto sugeriu é o ideal para esses casos de import. Você pode usar o CTRL+SHIFT+O que é um atalho muito bom nesses casos. Ele te dá a chance de importar tudo o que está faltando: tome sempre cuidado quando ele perguntar qual você quer importar, escolha sempre a do pacote que você quer.

O segundo e terceiro curso da trilha de Java dão uma idéia bem boa desses atalhos e dos erros comum no começo do uso de pacotes. Acho que vale a pena dar uma olhada neles. Como regra geral, se a linha vermelha diz que a classe não é encontrada é pois o import não foi feito. CTRL+SHIFT+O nele. Se o erro diz que o método nnao foi encontrado, mas a classe sim, é capaz de ter importado errado. Apaga o import e manda importar o certo (como o Roberto disse).

Outro detalhe que ajuda, na hora de postar código aqui, se você escapar o código antes e depois com três crases, o código fica formatado bonitinho (aqui à direita tem uma tabela explicando a formatação possivel).

Att

oi guilherme, oi rodrigo. apaguei os imports e dei o ctrl + shift + o

package lojavirtual.dao;



import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import lojavirtual.ConnectionPool;
import lojavirtual.ProdutosDao;
import lojavirtual.modelo.Produto;

e o connectionPool() ta com erro...ainda

quando eu clico no ConnectionPool() fala que o construtor ConnectionPool() nao esta visivel

E o código para darmos uma olhada?

rodrigo , guilherme fui la na class ConnectionPool e colquei opublic no construtor... o erro da casse TestaDaoDeProduto sumiu...

solução!

Ótimo Gustavo. Realmente o construtor não existia então ele estava reclamando.