Classe Conexão/Consulta Banco

20 respostas
r.campos
galera.. to com um problema.. tenho as seguites classes
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Banco;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author R.Campos
 */
public class Conexao {

    private String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    private String strc = "jdbc:sqlserver://localhost\SQLExpress:1433;databaseName=sisLoja";
    private String user = "tete";
    private String pass = "tete";
    private Connection con = null;

    public Conexao() {
        try {
            Class.forName(driver);
            con = DriverManager.getConnection(strc, user, pass);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
    }

    public void closeConexao() {
        try {
            if (con != null) {
                con = null;
            }
            con.close();
        } catch (SQLException ex) {
            Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


    public Connection openConexao() {
        return con;
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Banco;

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

/**
 *
 * @author R.Campos
 */
public class Operacoes {

    private static String erro = "";

    public static ResultSet consulta(String sql, Conexao con) {
        ResultSet rs = null;
        try {
            Statement statement = con.openConexao().createStatement(
                    ResultSet.TYPE_SCROLL_INSENSITIVE,
                    ResultSet.CONCUR_READ_ONLY);
            rs = statement.executeQuery(sql);
            return rs;
        } catch (SQLException sqlex) {
            return null;
        }
    }
}
na hora de usar faço o seguinte
ResultSet rsCat = Operacoes.consulta("SELECT * FROM categorias ORDER BY cat_nome", con);
sendo que eu crio uma instancia
conexao = new Conexao();
na primeira tela e passo por parametro para as outras (isso funciona.. pq funciona os insert, delete, update e etc) só que nas consultas meus STATEMENT estão ficando aberto.. nao da pra fecha pq senao perde o rs :S alguem sabe uma melhor maneira de fazer isso?! (seguindo essa lógica)

valeu

20 Respostas

r.campos

ngm ?!

renanedpedroso

‘seguindo essa lógica’ eu não saberei te ajudar, pois quando estava iniciando meus estudos com conexao ao BD já tentei fazer dessa forma e vi que não era o melhor caminho e pensei em outra forma de resolver…

Abraço!

juliofsn

Ao invés de retornar um ResutSet, preencha um Set ou List de Map’s.

Ou melhor ainda, crie uma classe que represente os dados que você quer retornar, intancie ela e preencha seus atributos, retornando um List ou Set de instâncias dessa classe para vários registros.

r.campos

renanedpedroso:

alguem sabe uma melhor maneira de fazer isso?! (seguindo essa lógica)

‘seguindo essa lógica’ eu não saberei te ajudar, pois quando estava iniciando meus estudos com conexao ao BD já tentei fazer dessa forma e vi que não era o melhor caminho e pensei em outra forma de resolver…

Abraço!

qual a melhor forma me aconselha?

[]´s

r.campos

juliofsn:
Ao invés de retornar um ResutSet, preencha um Set ou List de Map’s.

Ou melhor ainda, crie uma classe que represente os dados que você quer retornar, intancie ela e preencha seus atributos, retornando um List ou Set de instâncias dessa classe para vários registros.

essa seria uma das possiveis melhores soluções?
vejo que seria um tanto quanto trabalhosa em uma aplicação de médio porte!
fazer resultset joga num list depois percorrer list e etc…

renanedpedroso

Trabalhe utilizando o padrão DAO.

Utilizando o padrão dão, você não tem problemas desse tipo.

Sem falar que você pode gerenciar melhor suas transações com o banco.

renanedpedroso

Só uma pergunta…

Por que você gostaria de ‘utilizar o mesmo Statement’ (digamos assim) na sua aplicação?

Quem sabe assim, posso te ajudar melhor…

Abraço!

r.campos

renanedpedroso:
Trabalhe utilizando o padrão DAO.

Utilizando o padrão dão, você não tem problemas desse tipo.

Sem falar que você pode gerenciar melhor suas transações com o banco.


tem algum tuto sobre esse padrão DAO que vc possa indicar?

qto a questão do STATEMENT… nao é que eu queira sempre utilizar o mesmo, mais queria evitar de fica declarando vários STATEMENT pq algums vezes uso um RS pra alimenta outro!

renanedpedroso

Na verdade, do jeito que eu faço, você cria vários Statements (por isso perguntei), mas mesmo assim seu código ficará muito mais organizado, na minha opinião…

Faz o seguinte…

Crie uma classe abstrata da seguinte maneira:

public abstract class ClasseDAO {

    public PreparedStatement statement;
    public Conexao conexao;

    public abstract inserir(Object object);
    public abstract excluir(Object object);
    public abstract alterar(Object object);

}

E depois todas as suas classes que realizarão operações de CRUD (classes DAO), poderão herdar dessa classe que te passei.

Ou seja, você não estará ‘declarando manualmente seu Statement’, pois o statement será herdado.

renanedpedroso

Pode ser que exista outra maneira de fazer, mas essa eu acho mais clara, simples e objetiva.

Não sei se ‘reutilizar’ o Statement é uma boa prática, pode ser que futuramente se torne difícil de se dar manutenção…

Enfim, espero ter contribuído.

Abraço!

r.campos

renanedpedroso:
Na verdade, do jeito que eu faço, você cria vários Statements (por isso perguntei), mas mesmo assim seu código ficará muito mais organizado, na minha opinião…

Faz o seguinte…

Crie uma classe abstrata da seguinte maneira:

public abstract class ClasseDAO {

    public PreparedStatement statement;
    public Conexao conexao;

    public abstract inserir(Object object);
    public abstract excluir(Object object);
    public abstract alterar(Object object);

}

E depois todas as suas classes que realizarão operações de CRUD (classes DAO), poderão herdar dessa classe que te passei.

Ou seja, você não estará ‘declarando manualmente seu Statement’, pois o statement será herdado.

entendi a idéia… mais nao entendi a prática!
teria como posta um exemplo só pra mim ver o funcionando!?

ficaria grato!

att.

r.campos

pq na minha opnião… se eu fizer um Consult na classe DAO e retorna o RS… ainda assim vai perde o RS se fecha o statement!

renanedpedroso

Vamos supor que você vá trabalhar com uma classe Pessoa…

Então você cria essa classe…

public class Pessoa {

    private int id;
    private String nome = "";

    public String getNome() {
        return nome;
    }

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

Em seguida a classe DAO para essa classe será:

public class PessoaDAO extends ClasseDAO {

    @Override
    protected void inserir(Object object) throws BDError {
        try {


            String sql = "INSERT INTO CADPESSOA (IDPESSOA, PESSOA) VALUES (?,?)";
            Pessoa bean = (Pessoa) object;


            this.statement = conexao.prepareStatement("SELECT SEQUENCIA_CADPESSOA.NEXTVAL FROM DUAL");


            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                bean.setId(rs.getInt(1));
            }
            rs.close();
            ps.close();
            rs = null;
            ps = null;                    

            ps = conexao.prepareStatement(sql);
            ps.setInt(1, bean.getId());
            ps.setString(2, bean.getNome());
            ps.executeUpdate();
            ps.close();

            ps = null;



            bean.setInclusao(false);

        } catch (SQLException ex) {


            throw new BDError(PessoaDAO.class.getName() + " - inserir: " + ex.getMessage());
        }
    }

    @Override
    protected void alterar(Objectobject) throws BDError {
        try {

            String sql = "UPDATE CADPESSOA SET PESSOA = ? WHERE IDPESSOA = ?";
            Pessoa bean = (Pessoa) object;

            this.statement = conexao.prepareStatement(sql);
            ps.setString(1, bean.getNome());
            ps.setInt(2, bean.getId());
            int quantidade = ps.executeUpdate();
            ps.close();

            ps = null;
            if (quantidade == 0) {


                throw new BDError(PessoaDAO.class.getName() + " -  alterar: " + "Ao alterar nenhum registro foi afetado.");
            }


        } catch (SQLException ex) {


            throw new BDError(PessoaDAO.class.getName() + " -  alterar: " + ex.getMessage());
        }
    }

    @Override
    public void excluir(Objectobject) throws BDError {
        try {

            String sql = "DELETE FROM CADPESSOA WHERE IDPESSOA = ?";
            Pessoa bean = (Pessoa) object;

            this.statement = conexao.prepareStatement(sql);
            ps.setInt(1, bean.getId());
            int quantidade = ps.executeUpdate();
            ps.close();

            ps = null;
            if (quantidade == 0) {

                throw new BDError(PessoaDAO.class.getName() + " -  excluir: " + "Ao excluir nenhum registro foi afetado.");
            }


        } catch (SQLException ex) {


            throw new BDError(PessoaDAO.class.getName() + " - excluir: " + ex.getMessage());
        }
    }

Perceba que a classe ‘PessoaDAO’ herda características da classe ‘ClasseDAO’.

(Não testei o código, mas é bem por aí)…

Espero ter ajudado.

Abraço!

r.campos

cara
valeu… ajudo pra caramba!

entendi o funcionamento… seus post foram de grande valia!

abraço

renanedpedroso

Que bom que ajudou!

Muito obrigado, estamos aí pra isso!

Se o seu problema estiver solucionado mude o título do Post adicionando ‘[RESOLVIDO]’.

Abraço!

r.campos

entendi como usa o DAO… mais ainda fico a dúvida do RS e STMT!
como fazer o retorno em uma consulta?! :S

renanedpedroso

Você faz um método get que retorna um ou outro.

Porém utilizando essa estrutura que mostrei, não vejo a lógica de retornar o statement ou o resultset.

r.campos

no caso dessa estrutura DAO… o ideal seria retorna um List<?> ?!

renanedpedroso

Ah… sim…

Para consultar dados, você utilizaria List como retorno.

Ou então o próprio objeto Pessoa, no caso de busca por chave primária.

r.campos

ok..

valeu..
creio que agora está td resolvido! okakoakoakoakoakoakooka

porém uma ultima duvida essa classe
public ublic class Pessoa {

    private int id;
    private String nome = "";

    public String getNome() {
        return nome;
    }

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

seria um Bean?!
to tentando enteder os conceitos de DAO, Beans essas coisas! e me parece que é a mesma coisa!

Criado 22 de março de 2010
Ultima resposta 22 de mar. de 2010
Respostas 20
Participantes 3