O que acham do meu código com DAO?

40 respostas
D

Olá pessoal!

Tudo certo?
Gostaria de saber o que acham do meu código em DAO…
Se está conforme as “convenções”, etc…

Gostaria de dizer que estou fazendo em netbeans e é só um teste para “treinar”… portanto nada de WEB…

Segue os códigos das minhas classes, quem puder dar uma olhada ficarei muito grata…

1. Classe: AutorDAO

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package autor;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 *
 * @author D908
 */
public class AutorDAO {

    
    public Connection getConnection() throws SQLException{
        //Código para recuperar conexão com o Banco de Dados
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(AutorDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        Connection con = DriverManager.getConnection("jdbc:postgresql://localhost/livraria", "postgres", "admin");
        return con;
    }

    public void adicionarAutor(AutorModel autor) throws SQLException {
        Connection con = this.getConnection();
        String sql = ("INSERT INTO autor (nome, titulacao, curriculo) VALUES(?,?,?)") ;
        PreparedStatement pst = con.prepareStatement(sql);

        pst.setString(1, autor.getNome());
        pst.setString(2, autor.getTitulacao());
        pst.setString(3, autor.getCurriculoResumido());

        pst.executeUpdate();

        pst.close();
        con.close();
    }

    public void excluirAutor(AutorModel autor) throws SQLException {
        Connection con = this.getConnection();
        String sql = ("DELETE FROM autor WHERE(nome=?)") ;
        PreparedStatement pst = con.prepareCall(sql);

        pst.setString(1, autor.getNome());
        pst.executeUpdate();

        pst.close();
        con.close();
    }
    public void consultarAutor(AutorModel autor) throws SQLException{
        Connection con = this.getConnection();
        String sql = ("SELECT * from autor where (nome=?)");
        PreparedStatement pst = con.prepareStatement(sql);

        pst.setString(1, autor.getNome());
        ResultSet rs = pst.executeQuery();
        rs.next();
        autor.setNome(rs.getString("nome"));
        autor.setTitulacao(rs.getString("titulacao"));
        autor.setCurriculoResumido(rs.getString("curriculo"));
        
        rs.close();
        pst.close();
        con.close();
        
    }
    public void atualizarAutor(AutorModel autor) throws SQLException{
        Connection con = this.getConnection();
        String sql = sql = ("UPDATE autor set titulacao = ?, curriculo = ? where nome =?");
        PreparedStatement pst = con.prepareStatement(sql);

        pst.setString(1, autor.getTitulacao());
        pst.setString(2, autor.getCurriculoResumido());
        pst.setString(3, autor.getNome());

        pst.executeUpdate();

        pst.close();
        con.close();
    }
}

2. Classe: Autor

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Autor.java
 *
 * Created on 12/03/2010, 19:46:59
 */

package autor;

import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Proprietário
 */
public class Autor extends javax.swing.JFrame {

    /** Creates new form Autor */
    public Autor() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        btnSalvar = new javax.swing.JButton();
        btnExcluir = new javax.swing.JButton();
        btnConsultar = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        jTextField2 = new javax.swing.JTextField();
        jTextField3 = new javax.swing.JTextField();
        btnLimpar = new javax.swing.JButton();
        btnAtualizar = new javax.swing.JButton();

        FormListener formListener = new FormListener();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Autor");

        btnSalvar.setText("Salvar");
        btnSalvar.addActionListener(formListener);

        btnExcluir.setText("Excluir");
        btnExcluir.addActionListener(formListener);

        btnConsultar.setText("Consultar");
        btnConsultar.addActionListener(formListener);

        jLabel1.setText("Nome:");

        jLabel2.setText("Titulação:");

        jLabel3.setText("Currículo Resumido:");

        btnLimpar.setText("Limpar");
        btnLimpar.addActionListener(formListener);

        btnAtualizar.setText("Atualizar");
        btnAtualizar.addActionListener(formListener);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel3)
                            .addComponent(jLabel1)
                            .addComponent(jLabel2))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jTextField3)
                            .addComponent(jTextField2, javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 267, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(btnLimpar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnSalvar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnExcluir)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnConsultar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(btnAtualizar)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(24, 24, 24)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(26, 26, 26)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnSalvar)
                    .addComponent(btnExcluir)
                    .addComponent(btnConsultar)
                    .addComponent(btnLimpar)
                    .addComponent(btnAtualizar))
                .addContainerGap(60, Short.MAX_VALUE))
        );

        pack();
    }

    // Code for dispatching events from components to event handlers.

    private class FormListener implements java.awt.event.ActionListener {
        FormListener() {}
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            if (evt.getSource() == btnSalvar) {
                Autor.this.btnSalvarActionPerformed(evt);
            }
            else if (evt.getSource() == btnExcluir) {
                Autor.this.btnExcluirActionPerformed(evt);
            }
            else if (evt.getSource() == btnConsultar) {
                Autor.this.btnConsultarActionPerformed(evt);
            }
            else if (evt.getSource() == btnLimpar) {
                Autor.this.btnLimparActionPerformed(evt);
            }
            else if (evt.getSource() == btnAtualizar) {
                Autor.this.btnAtualizarActionPerformed(evt);
            }
        }
    }// </editor-fold>

    private void limparCampos(){
        jTextField1.setText("");
        jTextField2.setText("");
        jTextField3.setText("");
    }

    private void btnSalvarActionPerformed(java.awt.event.ActionEvent evt) {                                          
        AutorModel autor = new AutorModel();

        autor.setNome(jTextField1.getText());
        autor.setTitulacao(jTextField2.getText());
        autor.setCurriculoResumido(jTextField3.getText());

        AutorDAO autorBD = new AutorDAO();
        try {
            autorBD.adicionarAutor(autor);
        } catch (SQLException ex) {
            Logger.getLogger(Autor.class.getName()).log(Level.SEVERE, null, ex);
        }
        limparCampos();
    }                                         

    private void btnExcluirActionPerformed(java.awt.event.ActionEvent evt) {                                           
        AutorModel autor = new AutorModel();

        autor.setNome(jTextField1.getText());

        AutorDAO autorBD = new AutorDAO();
        try {
            autorBD.excluirAutor(autor);
        } catch (SQLException ex) {
            Logger.getLogger(Autor.class.getName()).log(Level.SEVERE, null, ex);
        }
        limparCampos();
    }                                          

    private void btnLimparActionPerformed(java.awt.event.ActionEvent evt) {                                          
        limparCampos();
    }                                         

    private void btnConsultarActionPerformed(java.awt.event.ActionEvent evt) {                                             
        AutorModel autor = new AutorModel();

        autor.setNome(jTextField1.getText());

        AutorDAO autorBD = new AutorDAO();
        try {
            autorBD.consultarAutor(autor);
        } catch (SQLException ex) {
            Logger.getLogger(Autor.class.getName()).log(Level.SEVERE, null, ex);
        }

        jTextField1.setText(autor.getNome());
        jTextField2.setText(autor.getTitulacao());
        jTextField3.setText(autor.getCurriculoResumido());

    }                                            

    private void btnAtualizarActionPerformed(java.awt.event.ActionEvent evt) {
        AutorModel autor = new AutorModel();
        
        autor.setNome(jTextField1.getText());
        autor.setTitulacao(jTextField2.getText());
        autor.setCurriculoResumido(jTextField3.getText());

        AutorDAO autorBD = new AutorDAO();
        try {
            autorBD.atualizarAutor(autor);
        } catch (SQLException ex) {
            Logger.getLogger(Autor.class.getName()).log(Level.SEVERE, null, ex);
        }
        limparCampos();
    }

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Autor().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JButton btnAtualizar;
    private javax.swing.JButton btnConsultar;
    private javax.swing.JButton btnExcluir;
    private javax.swing.JButton btnLimpar;
    private javax.swing.JButton btnSalvar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    private javax.swing.JTextField jTextField3;
    // End of variables declaration

}

3. Classe: AutorModel

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package autor;

/**
 *
 * @author D908
 */
public class AutorModel {
    private String nome;
    private String titulacao;
    private String curriculoResumido;

    public String getNome() {
        return nome;
    }

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

    public String getTitulacao() {
        return titulacao;
    }

    public void setTitulacao(String titulacao) {
        this.titulacao = titulacao;
    }

    public String getCurriculoResumido() {
        return curriculoResumido;
    }

    public void setCurriculoResumido(String curriculoResumido) {
        this.curriculoResumido = curriculoResumido;
    }
}

[color=red]Está rodando sem problemas, gostaria apenas de saber se a forma que fiz é uma considerada uma boa forma, e caso não seja, gostaria de saber o motivo…
Estou treinando isso para poder fazer/aplicar essas técnicas em um sistema maior do meu TCC…[/color]

[color=violet]Agradeço desde já,
Dina[/color]

40 Respostas

Marky.Vasconcelos

Está conforme os padrões.

Mas agora que já sabe como fazer isso voce pode usar um framework de persistencia como o hibernate e fazer apenas um DAO generico, pois do seu modo a cada model voce precisa criar um novo DAO.

rogelgarcia

É Melhor renomear o AutorModel para Autor…

E a classe Autor chamar de AutorFrame, ou algo assim…

Fica seguindo mais o padrão dessa forma…

Mas é desse jeito que voce fez mesmo… ficou muito bom (nao li o código do frame profundamente… :D)

D

Mark_Ameba:
Está conforme os padrões.

Mas agora que já sabe como fazer isso voce pode usar um framework de persistencia como o hibernate e fazer apenas um DAO generico, pois do seu modo a cada model voce precisa criar um novo DAO.

Mark, vamos lá…
[color=red]1. Framework de persistência??[/color]
[color=brown]2. DAO genérico?[/color]

Realmente achei que para cada model teria que fazer um DAO.

[color=violet]3. DAO genérico seria por exemplo, um DAO onde teria conexão ao BD, o fechamento da conexão, onde todos os outros DAO’s “herdariam” este DAO genérico??[/color]

O meu sistema que farei para o meu TCC será DESKTOP…
[color=green]4. Por ser Desktop muda algo?[/color]

[color=darkred]5. Outra coisa, eu acabei chamando todos os métodos da DAO da minha classe Autor e não da classe Autor (onde tem a view e o tratamento dos botões), algum problema com isso?[/color]

Obrigada por analisar o meu código, e desculpa por esse tantão de perguntas…
Valeu mesmo…!
Dina

Editado: Correção de onde foram chamados os métodos da DAO

rogelgarcia

Sobre práticas de programação… pra ficar perfeito…

No seu DAO os métodos deveriam ter um finally para garantir o fechamento da conexão caso ocorra alguma exceçao…

Connection con;  
        PreparedStatement pst;
        try {
                con = this.getConnection();
                String sql = ("INSERT INTO autor (nome, titulacao, curriculo) VALUES(?,?,?)") ;  
                pst = con.prepareStatement(sql);  
          
                pst.setString(1, autor.getNome());  
                pst.setString(2, autor.getTitulacao());  
                pst.setString(3, autor.getCurriculoResumido());  
          
                pst.executeUpdate();  
          
        } finally {
               if(pst != null) pst.close();
               if(con != null) con.close();
        }
D

rogelgarcia:
É Melhor renomear o AutorModel para Autor…

E a classe Autor chamar de AutorFrame, ou algo assim…

Fica seguindo mais o padrão dessa forma…

Mas é desse jeito que voce fez mesmo… ficou muito bom (nao li o código do frame profundamente… :D)

Oiee…
Então, segui o que vc tinha me respondido no post anterior…
Só que quando vi, como falei no meu post anterior, acabei chamando todos os meus métodos DAO pelo Autor (ou, como vc sugeriu AutorFrame)
:?
Errado?

rogelgarcia

dina:
rogelgarcia:
É Melhor renomear o AutorModel para Autor…

E a classe Autor chamar de AutorFrame, ou algo assim…

Fica seguindo mais o padrão dessa forma…

Mas é desse jeito que voce fez mesmo… ficou muito bom (nao li o código do frame profundamente… :D)

Oiee…
Então, segui o que vc tinha me respondido no post anterior…
Só que quando vi, como falei no meu post anterior, acabei chamando todos os meus métodos DAO pelo Autor (ou, como vc sugeriu AutorFrame)
:?

Sim… ficou certo o que vc fez… eu só sugeri um rename nas classes…
As classes de modelo geralmente nao tem prefixo nem sufixo… então o AutorModel deveria se chamar só Autor

E a que é chamada Autor atualmente… voce coloca um sufixo… como AutorFrame

D

rogelgarcia:
Sobre práticas de programação… pra ficar perfeito…

No seu DAO os métodos deveriam ter um finally para garantir o fechamento da conexão caso ocorra alguma exceçao…


:slight_smile: Eba! Isso que eu quero, saber o que tem que mudar pra ficar melhor… :slight_smile: obrigada!

Mas Rogel, pelo que tinhamos falado em um outro tópico sobre onde chamar os métodos DAO, acho que não segui o que foi sugerido, ou segui?? Gostaria de saber se está OK…

Valeu pelas dicas e pela ajuda…

rogelgarcia

Seguiu…

Só o nome das classes mesmo… que ficaria melhor trocar…

AutorModel -> Autor

Autor -> AutorFrame

O netbeans deve ter algum menu aí … um Refactor > Rename (no eclipse tem… nao sei como é no netbean)

Que troca todas as referencias ao nome da classe… assim vc nao tem que procurar todas as ocorrencias…

rogelgarcia

Um exemplo de framework de persistencia é o Hibernate

Um framework é uma ferramenta para auxiliar na realização de algum trabalho…

O Hibernate por exemplo… mapeia classes em tabelas… e atributos em colunas do banco de dados…

Assim voce nao precisa escrever código para cada atributo que deseja mapear… o hibernate faz esse trabalho…

Sobre o DAO genérico… voce consegue aproveitar mais do que apenas a conexão…

Voce chegou a ver o video do crud que te mandei?? o DAO lá… nao tem nenhum código… (ele extende apenas um DAO genérico… esse é um DAO beeeem genérico)

D

Alteração realizada!!
:slight_smile:

Rogel, não querendo abusar, mas já abusando, esse DAO genérico que o Mark sugeriu seria aquilo que falamos em um tópico anterior, onde tenho um DAO “mãe” para conectar/desconectar ao BD…?

rogelgarcia

Exato

D

Ah simmmmmmmmm…
:slight_smile:
Agora deu uma luz…!:slight_smile:
Consegui ligar uma coisa à outra…
Valeu mesmo pela ajuda!!!
:slight_smile:

viniciusfaleiro

Mark_Ameba:
Está conforme os padrões.

Mas agora que já sabe como fazer isso voce pode usar um framework de persistencia como o hibernate e fazer apenas um DAO generico, pois do seu modo a cada model voce precisa criar um novo DAO.

Concordo com o Mark… más veja bem… se por um acaso vc não utilizar um framework de persistencia eu não concordo com o fato de colocar a criação da sua Connection no DAO… cria uma factory separada pra isso acho que seria melhor… É simples imaginar se por exemplo vc não tem um DAO genérico com Hibernate: Logo vc tem um DAO para cada model e vai criar um método getConnection() em cada model?.. Se precisar dar manutenção bye bye…

D

Vinicius, valeu por dar sua opinião…
:wink:
Realmente a manutenção ficaria complicada…

Marky.Vasconcelos

E quando eu disse sobre DAO generico é que no meu caso eu tenho apenas um unico DAO que praticamente é um delegate da Session do hibernate, apenas passo para ela a Class<?> que esta representando e utilizo seus métodos.

viniciusfaleiro

Eu uso assim tbm!! =) … O Hibernate identifica e faz tudo sozinho!!

viniciusfaleiro

Falando nisso joguei seu tower defence esses dias!! =)… Show!!

D

Isso pouparia muito trabalho…
Mas, assim, uma dúvida talvez meio… “boba”…
Mas é comum usar Hibenate em sistemas Desktop?

viniciusfaleiro

dina:
Isso pouparia muito trabalho…
Mas, assim, uma dúvida talvez meio… “boba”…
Mas é comum usar Hibenate em sistemas Desktop?

Opa… tranquilo… não tem problema algum.

D

:slight_smile: Perfeito…!
Obrigada pessoal!

rogelgarcia

Boa observação do vinicius…

Se quiser expandir ainda mais… tem um outro framework chamado Spring

Nele tem uma classe chamada JdbcTemplate… que serve para dar uma organizada nas chamadas Jdbc… (pra voce nao ter que abrir e fechar conexao, ajuda o finally… etc)
Voce pode dar uma olhada no fonte dessa classe… pode te dar algumas ideias interessantes para voce usar no seu DAO genérico…

Na documentaçao dele vc pode ver como se usa… e no fonte voce olha como foi implementado

D

Pessoal..
Estou tentando "entender" melhor tudo isso, se eu fizer o meu sistema utilizando as técnicas utlizadas na classe Persistencia.java (segue código) seria uma forma de resolver toda essa discução sobre persistencia... generico.. etc..?

Tenho aqui o seguinte:

1. Classe Pessoa
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package persistencia;

/**
 *
 * @author leandro
 */
public class Pessoa {

    private String cpf;
    private String nome;
    private String endereco;
    private String complemento;
    private Integer cep;

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getNome() {
        return nome;
    }

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

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

    public Integer getCep() {
        return cep;
    }

    public void setCep(Integer cep) {
        this.cep = cep;
    }

}
2. Classe: Persistencia
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package persistencia;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 *
 * @author leandro
 */
public class Persistencia {

    public static void salvar(Object pobjeto) {

        // inicia a construção do SQL.
        String sql = "insert into ";

        //Fica a string sql: "insert into nomeClasse"
        sql += pobjeto.getClass().getSimpleName();

        // inicia a parte dos valores do SQL.
        String valores = "";

        // adicionar as colunas à instrução SQL.
        //adiciona apartir dos nomes dos atributos
        sql += "(";
        Field[] atributos = pobjeto.getClass().getDeclaredFields();
        for(int contador=0; contador<atributos.length-1; contador++) {
            sql += atributos[contador].getName();
            sql += ", ";

            // adicionar os valores dos atributos à instrução SQL.
            try {
                Method metodoGet = pobjeto.getClass().getMethod(getNomeMetodoGet(atributos[contador].getName()), new Class[] {});
                valores += temAspas(metodoGet) + metodoGet.invoke(pobjeto, new Object[] {}) + temAspas(metodoGet);
                valores += ", ";
            }
            catch(Exception erro) {
                erro.printStackTrace();
            }
        }
        sql += atributos[atributos.length-1].getName();
        sql += ") values (";

        // adicionar os valores dos atributos à instrução SQL.
        try {
            Method metodoGet = pobjeto.getClass().getMethod(getNomeMetodoGet(atributos[atributos.length-1].getName()), new Class[] {});
            valores += temAspas(metodoGet) + metodoGet.invoke(pobjeto, new Object[] {}) + temAspas(metodoGet);
            valores += ")";
        }
        catch(Exception erro) {
            erro.printStackTrace();
        }

        sql += valores;

        System.out.println(sql);
    }

    public static void excluir(Object pobjeto) {

        // inicia a construção do SQL.
        String sql = "delete from ";
        sql += pobjeto.getClass().getSimpleName();
        sql += " where ";

        // adicionar as colunas à instrução SQL.
        Field[] atributos = pobjeto.getClass().getDeclaredFields();
        for(int contador=0; contador<atributos.length-1; contador++) {
            sql += atributos[contador].getName();
            sql += "=";

            // adicionar os valores dos atributos à instrução SQL.
            try {
                Method metodoGet = pobjeto.getClass().getMethod(getNomeMetodoGet(atributos[contador].getName()), new Class[] {});
                sql += temAspas(metodoGet) + metodoGet.invoke(pobjeto, new Object[] {}) + temAspas(metodoGet);
                sql += " and ";
            }
            catch(Exception erro) {
                erro.printStackTrace();
            }
        }
        sql += atributos[atributos.length-1].getName();
        sql += "=";

        // adicionar os valores dos atributos à instrução SQL.
        try {
            Method metodoGet = pobjeto.getClass().getMethod(getNomeMetodoGet(atributos[atributos.length-1].getName()), new Class[] {});
            sql += temAspas(metodoGet) + metodoGet.invoke(pobjeto, new Object[] {}) + temAspas(metodoGet);
        }
        catch(Exception erro) {
            erro.printStackTrace();
        }

        System.out.println(sql);

    }

    public static String getNomeMetodoGet(String patributo) {
        String nome = "get";
        nome += patributo.substring(0,1).toUpperCase();
        nome += patributo.substring(1);
        return(nome);
    }

    public static String temAspas(Method pmetodo) {
        if(pmetodo.getReturnType().getName().equals("java.lang.String")) {
            return("'");
        }
        return("");
    }
}
3. Classe: Main
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package persistencia;

/**
 *
 * @author leandro
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        Pessoa p1 = new Pessoa();
        p1.setCpf("1234");
        p1.setNome("Abc");
        p1.setEndereco("Rua abc");
        p1.setComplemento("Perto da igrejia");
        p1.setCep(888);

        Persistencia.salvar(p1);
        Persistencia.excluir(p1);
    }

}
[color=red] Obrigada pessoal![/color]
viniciusfaleiro
dina:
Pessoal.. Estou tentando "entender" melhor tudo isso, se eu fizer o meu sistema utilizando as técnicas utlizadas na classe Persistencia.java (segue código) seria uma forma de resolver toda essa discução sobre persistencia... generico.. etc..?

Tenho aqui o seguinte:

1. Classe Pessoa
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package persistencia;

/**
 *
 * @author leandro
 */
public class Pessoa {

    private String cpf;
    private String nome;
    private String endereco;
    private String complemento;
    private Integer cep;

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getNome() {
        return nome;
    }

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

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

    public Integer getCep() {
        return cep;
    }

    public void setCep(Integer cep) {
        this.cep = cep;
    }

}
2. Classe: Persistencia
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package persistencia;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 *
 * @author leandro
 */
public class Persistencia {

    public static void salvar(Object pobjeto) {

        // inicia a construção do SQL.
        String sql = "insert into ";

        //Fica a string sql: "insert into nomeClasse"
        sql += pobjeto.getClass().getSimpleName();

        // inicia a parte dos valores do SQL.
        String valores = "";

        // adicionar as colunas à instrução SQL.
        //adiciona apartir dos nomes dos atributos
        sql += "(";
        Field[] atributos = pobjeto.getClass().getDeclaredFields();
        for(int contador=0; contador<atributos.length-1; contador++) {
            sql += atributos[contador].getName();
            sql += ", ";

            // adicionar os valores dos atributos à instrução SQL.
            try {
                Method metodoGet = pobjeto.getClass().getMethod(getNomeMetodoGet(atributos[contador].getName()), new Class[] {});
                valores += temAspas(metodoGet) + metodoGet.invoke(pobjeto, new Object[] {}) + temAspas(metodoGet);
                valores += ", ";
            }
            catch(Exception erro) {
                erro.printStackTrace();
            }
        }
        sql += atributos[atributos.length-1].getName();
        sql += ") values (";

        // adicionar os valores dos atributos à instrução SQL.
        try {
            Method metodoGet = pobjeto.getClass().getMethod(getNomeMetodoGet(atributos[atributos.length-1].getName()), new Class[] {});
            valores += temAspas(metodoGet) + metodoGet.invoke(pobjeto, new Object[] {}) + temAspas(metodoGet);
            valores += ")";
        }
        catch(Exception erro) {
            erro.printStackTrace();
        }

        sql += valores;

        System.out.println(sql);
    }

    public static void excluir(Object pobjeto) {

        // inicia a construção do SQL.
        String sql = "delete from ";
        sql += pobjeto.getClass().getSimpleName();
        sql += " where ";

        // adicionar as colunas à instrução SQL.
        Field[] atributos = pobjeto.getClass().getDeclaredFields();
        for(int contador=0; contador<atributos.length-1; contador++) {
            sql += atributos[contador].getName();
            sql += "=";

            // adicionar os valores dos atributos à instrução SQL.
            try {
                Method metodoGet = pobjeto.getClass().getMethod(getNomeMetodoGet(atributos[contador].getName()), new Class[] {});
                sql += temAspas(metodoGet) + metodoGet.invoke(pobjeto, new Object[] {}) + temAspas(metodoGet);
                sql += " and ";
            }
            catch(Exception erro) {
                erro.printStackTrace();
            }
        }
        sql += atributos[atributos.length-1].getName();
        sql += "=";

        // adicionar os valores dos atributos à instrução SQL.
        try {
            Method metodoGet = pobjeto.getClass().getMethod(getNomeMetodoGet(atributos[atributos.length-1].getName()), new Class[] {});
            sql += temAspas(metodoGet) + metodoGet.invoke(pobjeto, new Object[] {}) + temAspas(metodoGet);
        }
        catch(Exception erro) {
            erro.printStackTrace();
        }

        System.out.println(sql);

    }

    public static String getNomeMetodoGet(String patributo) {
        String nome = "get";
        nome += patributo.substring(0,1).toUpperCase();
        nome += patributo.substring(1);
        return(nome);
    }

    public static String temAspas(Method pmetodo) {
        if(pmetodo.getReturnType().getName().equals("java.lang.String")) {
            return("'");
        }
        return("");
    }
}
3. Classe: Main
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package persistencia;

/**
 *
 * @author leandro
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        Pessoa p1 = new Pessoa();
        p1.setCpf("1234");
        p1.setNome("Abc");
        p1.setEndereco("Rua abc");
        p1.setComplemento("Perto da igrejia");
        p1.setCep(888);

        Persistencia.salvar(p1);
        Persistencia.excluir(p1);
    }

}
[color=red] Obrigada pessoal![/color]

Olha só.. não sou a favor desse monte de string concatenada pra formar uma sql... pra que preparedStatement então neh?... Acho que vc tava indo no caminho certo antes... do mais, eu diria que era só vc tirar a criação da Connection de dentro do DAO como falei... Posteriormente ia ficar facil de implementar Hibernate.. mesmo que não use agora...

Outra coisa que não me agrada nesse código é que necessáriamente vc vai ter q ter o nome da tabela no banco com o mesmo nome da entidade!.. Por causa desse pobjeto.getClass().getSimpleName();

Não analisei a fundo más parece que ta usando Reflection nos campos tbm.. ou seja.. pelo jeito tem que os campos ter os mesmos nomes da colunas...

rogelgarcia

Perfeito dina… é por esse caminho mesmo…

Só que esse código não anula o DAO… então voce vai ter o PessoaDAO de qualquer jeito

E o PessoaDAO pode usar esse código de persistencia…


Para não ter que repetir a chamada em todos os DAOs da sua aplicacao

Vc pode fazer um GenericDAO que já tem os métodos que chamam o persistencia…

E o PessoaDAO extends GenericDAO

rogelgarcia

Isso que voce fez na classe Persistencia é o que o Hibernate faz…

Só que o hibernate tem umas flexbilidades a mais…

D

rogelgarcia

Rogel, QUE BOM!

Sim, consigo ver o motivo disso. :slight_smile:

Só para exemplificar e ver se eu entendi mesmo,

  1. Eu tenho as classes Pessoa e Curso
  2. Portanto terei os seguintes DAO’s PessoaDAO e CursoDAO.
  3. Ambos terão como pai a minha classe de Persistência.
    :arrow:[color=red]PessoaDAO extends Persistencia[/color]
    :arrow:[color=red]CursoDAO extends Persistencia[/color]

Supondo que na classe PessoaFrame tem o botão SALVAR o evento do botão chamará um método da classe PessoaDAO, e como este herda tudo de Persistencia eu chamo o método Salvar(Pessoa p)

[color=red]Correto?[/color]

rogelgarcia:
Para não ter que repetir a chamada em todos os DAOs da sua aplicacao
Vc pode fazer um GenericDAO que já tem os métodos que chamam o persistencia…
E o PessoaDAO extends GenericDAO

Hum… se eu fizer como eu falei acima (as minhas classes DAO extends minha Persistencia), utlizar esse GenericDAO seria útil ainda?

Outra coisa que vc disse:

Já que faz praticamente a mesma coisa, vc acha que poderia utilizar isso ao invés de estudar e aplicar Hibernate?

viniciusfaleiro

Foi uma forma encontrada para facilitar o acesso ao BD e diminuir o trabalho, apesar da concatenação de Strings, isso pode funcionar para todo o meu sistema… Como eu to fazendo o diagrama de sequencias do meu projeto de TCC, eu teria que decidir agora como vou fazer o acesso ao BD… por isso que tomei a decisão de fazer desta forma…

[color=green]Pessoal, obrigadão pelas respostas e pela ajuda![/color]

Marky.Vasconcelos

Falando nisso joguei seu tower defence esses dias!! =)… Show!!

Ha legal… pena que to sem tempo para continuar.

E dina acredito que seja muito mais facil usar Hibernate do que tentar criar de acordo como voce faz, Reflection é incrivel e seria legal aprender. Mas se não for extremamente OO você vai ser obrigada a ter PessoaDAO, AlunoDAO e etc…

Se quiser uma ajuda no projeto da uma olhada no meu projeto no google code e de uma olhada na classe FieldResolver e o pacote mark.util.el.*

rogelgarcia
  1. Eu tenho as classes Pessoa e Curso
  2. Portanto terei os seguintes DAO’s PessoaDAO e CursoDAO. SIM
  3. Ambos terão como pai a minha classe de Persistência. SIM ou uma GenericDAO que usa a classe persistencia

Supondo que na classe PessoaFrame tem o botão SALVAR o evento do botão chamará um método da classe PessoaDAO, e como este herda tudo de Persistencia eu chamo o método Salvar(Pessoa p)

Correto? Correto!

Hum… se eu fizer como eu falei acima (as minhas classes DAO extends minha Persistencia), utlizar esse GenericDAO seria útil ainda? Podemos dizer que o persistencia é o GenericDAO…

Já que faz praticamente a mesma coisa, vc acha que poderia utilizar isso ao invés de estudar e aplicar Hibernate? Poderia utilizar, mas com hibernate ficaria melhor…

Foi uma forma encontrada para facilitar o acesso ao BD e diminuir o trabalho, apesar da concatenação de Strings, isso pode funcionar para todo o meu sistema… Como eu to fazendo o diagrama de sequencias do meu projeto de TCC, eu teria que decidir agora como vou fazer o acesso ao BD… por isso que tomei a decisão de fazer desta forma…
De qualquer jeito voce terá a concatenacao para criar as queries… mas voce pode usar um preparedStatement… e no lugar dos valores ao invés de concatenar na String o valor mesmo… vc coloca [color=blue]?[/color] (o caracter interrogação)… e depois seta os valores reais no preparedStatement

D

rogelgarcia:

De qualquer jeito voce terá a concatenacao para criar as queries… mas voce pode usar um preparedStatement… e no lugar dos valores ao invés de concatenar na String o valor mesmo… vc coloca [color=blue]?[/color] (o caracter interrogação)… e depois seta os valores reais no preparedStatement

[color=red]:slight_smile: Rogel, boa!! Tentarei fazer isso!! :slight_smile: Vc está me ajudando muito!! Valeu mesmo pela paciência e pelas explicações![/color] Terei que sair agora, mais tarde retorno aplico o que vc falou e posto aqui o resultado final… Obrigada novamente!

Mark_Ameba Hum, sim, talvez seja mesmo mais fácil, o problema é que precisaria tirar um tempo para poder estudar hibernate…
:oops: Hum… qual é o seu projeto no google? :oops:
Obrigada pelas dicas Mark!

Marky.Vasconcelos

Literalmente é o projeto MarkUtils, tem algumas coisas legais nele.

http://code.google.com/p/markutils

E Hibernate não é tão dificil assim, apenas configurar o 1° projeto que sempre é chato.
A caelum tem uma apostila legal que tem Hibernate & JSF mas nao sei se está disponivel pra download, se tiver seria legal voce olhar a parte do Hibernate.

rogelgarcia

To montando um tutorial de hibernate… daqui a pouco posto aqui…

rogelgarcia

Justamente pra configurar o primeiro projeto… (que realmente é chato :D)

D

Mark e Rogel, obrigada :slight_smile:

Bom, acho que… vou estudar Hibernate… :slight_smile:
Caso consiga algo postarei aqui…
Valeu…:slight_smile:

rogelgarcia

Pera um tikim… vou publicar o tutorial ainda hoje… vai te eliminar dor de cabeça… já to terminando…

Até umas 8 da noite já publiquei

rogelgarcia

Promessa é divida… tá aí o tutorial espero que te ajude :smiley:

http://www.javaframework.org/portal/2010/03/17/iniciando-com-hibernate-3-utilizando-annotations/

D

Rogel,
Sem palavras pra agradecer o quanto vc ajudou…!

Valeu mesmo pela paciência e pela ajuda…!
:slight_smile:

E muito obrigada pelo tutorial… Vi só agora, irei estudá-lo.
Obrigada mesmo!!
:slight_smile:
Até mais,
Dina

rogelgarcia

Por nada…

A próxima dúvida agora vai ser: O que acham do meu código com DAO e Hibernate?? :smiley:

Ate mais

Depois vc fala se foi útil o tutorial e se foi fácil seguir

D

hehehe…
Isso aí… será esse mesmo o tópico graças a ajuda de vcs e ao seu tutorial!
Obrigada novamente!!!
Dei uma olhada rápida e vi que está bem didático, o que facilita o entendimento e torna possível aplicar o assunto…!!
Irei aplicá-lo e estudá-lo melhor amanhã logo que voltar da faculdade, pois agora estou terminando um trabalho de Inteligência Artificial que é pra entregar amahã…

Não vejo a hora de começar a nova jornada rumo ao Hibernate!!
:slight_smile:
Terá uma dedicatória a vc no meu tcc pela ajuda que vc tem me dado!! hehe

OBRIGADA OBRIGADA

Até mais!

rogelgarcia

Opa… fico muito feliz com isso… sério mesmo…

Obrigado

Marky.Vasconcelos

rogel mande pra mim seu artigo, um dia eu começei a escrever um também mas não terminei.
Quero ver onde voce parou.

Criado 16 de março de 2010
Ultima resposta 18 de mar. de 2010
Respostas 40
Participantes 4