Solucionado (ver solução)
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.