Sistema usando MVC+DAO - duvida se estou usando de forma correta

Olá a todos, sei que esse assunto já foi discutido aqui e acreditem que me basiei nos tópicos do GUJ e de muitos outros, fiz um sistema de forma academica usando MVC+DAO, mas o meu problema é que eu tentei usar a base teorica para implementar algo na Pratica, vou postar meus códigos que estão funcionais e colocar algumas duvidas que fiquei em relação a esses modelos.

Criei 4 pacotes e as classes que possuem:
banco - (aqui eu coloco o DAO)

  • Conexao.java
  • DaoCi.java

controle

  • ControleCi.java
  • SessionFacade.java

modelo

  • Ci.java

visao

  • TelaCadastro.java

Como o sistema funciona:
TelaCadastroCI usuario cadastra um numero e envia ao SessionFacade que envia o objeto para DaoCi que executa o inserir - Claro que uso a classe Ci.java com os Bens e a classe conexão.

Duvidas:
[color=darkblue]- Em relação ao padrão MVC+DAO, essa minha estrutura esta certa?

  • A classe SessionFacade esta servindo como uma classe de ligação entrea visão e a classe de controle ControleCi.java, li que isso é bom para caso eu queria criar uma visão diferente, basta criar uma classe session diferente acessando a mesma classe de controle que fica mais facil, eu achei meio redundante, mas isso esta certo?
  • Por enquanto não encotrei nenhuma regra de negocio que seja implementado na camada de modelo, só conexões com o banco, por isso coloquei no pacote banco que aonde ficar minha persistencia, no caso a unica coisa diferente é que eu faço uma busca se existe o numro da Ci antes de inserir. isso esta certo?
  • na camada de visão eu acabo verificando atraves do try se o valor cadastrado é um numero e não uma String, isso esta certo ? eu sei que verificações deveriam ficar na camada de modelo, mas estou tendo dificuldade de fazer isso, pois como é um tipo int, o textfield tem que ser convertido para Inteiro e de qualquer forma va idar erro se eu não verificar isso com o try.
  • Alguem tem algum comentário sobre a forma q estou programando?
  • A forma que estou usando o DAO esta certa? estou achando entrano pois tenho duas classes, uma conexão e a outra seria o DaoCi, estou achando estranho que dessa forma eu tenho que replicar o login e a senha em cada classe DAO eu acharia que ela estaria melhor na classe conexão, o que fazer?[/color]

Abraços a todos e segue as classes (pelo menos os que eu achei relevantes):

package visao;

import java.awt.BorderLayout;   
import javax.swing.*;

import java.awt.GridBagLayout;   
import javax.swing.JLabel;   
import java.awt.GridBagConstraints;   
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import modelo.Ci;
import controle.SessionFacade;

public class TelaCadastroCi extends JFrame implements ActionListener {
	private JPanel jContentPane = null;   
	  
	   private JPanel jPanel = null;   
	 
	   private JLabel jLabel = null;   
	   private JTextField jTextField = null;   
	   private JButton jButton = null;   
	   private JLabel jLabel1 = null;   
	   

 
	   private JPanel getJPanel() {   
	      if (jPanel == null) {   
	         GridBagConstraints gridBagConstraints5 = new GridBagConstraints();   
	         gridBagConstraints5.gridx = 2;   
	         gridBagConstraints5.gridy = 1;   
	         GridBagConstraints gridBagConstraints4 = new GridBagConstraints();   
	         gridBagConstraints4.fill = java.awt.GridBagConstraints.HORIZONTAL;   
	         gridBagConstraints4.gridy = 1;   
	         gridBagConstraints4.weightx = 1.0;   
	         gridBagConstraints4.gridx = 1;   
	         GridBagConstraints gridBagConstraints3 = new GridBagConstraints();   
	         gridBagConstraints3.gridx = 0;   
	         gridBagConstraints3.gridy = 1;   
	         jLabel1 = new JLabel();   
	         jLabel1.setText("Texto 2 :");   
	         GridBagConstraints gridBagConstraints2 = new GridBagConstraints();   
	         gridBagConstraints2.gridx = 2;   
	         gridBagConstraints2.gridy = 0;   
	         GridBagConstraints gridBagConstraints1 = new GridBagConstraints();   
	         gridBagConstraints1.fill = java.awt.GridBagConstraints.HORIZONTAL;   
	         gridBagConstraints1.gridy = 0;   
	         gridBagConstraints1.weightx = 1.0;   
	         gridBagConstraints1.gridx = 1;   
	         GridBagConstraints gridBagConstraints = new GridBagConstraints();   
	         gridBagConstraints.gridx = 0;   
	         gridBagConstraints.gridy = 0;   
	         jLabel = new JLabel();   
	         jLabel.setText("Texto 1 :");   
	         jPanel = new JPanel();   
	         jPanel.setLayout(new GridBagLayout());   
	         jPanel.add(jLabel, gridBagConstraints);   
	         jPanel.add(getJTextField(), gridBagConstraints1);   
	         jPanel.add(getJButton(), gridBagConstraints2);   
	         jPanel.add(jLabel1, gridBagConstraints3);   
	      
	      }   
	      return jPanel;   
	   }   
	  
	 
	   private JTextField getJTextField() {   
	      if (jTextField == null) {   
	         jTextField = new JTextField();   
	      }   
	      return jTextField;   
	   }   
	
	   private JButton getJButton() {   
	      if (jButton == null) {   
	         jButton = new JButton();   
	         jButton.setText("click 1");   
	         jButton.addActionListener(new java.awt.event.ActionListener() {   
	            public void actionPerformed(java.awt.event.ActionEvent e) {   
	              // System.out.println("Seu evento aqui");    
	               // TODO Auto-generated Event stub actionPerformed() 
	                try{
	            	SessionFacade sf = new SessionFacade();
	                Ci ci = new Ci();
	                ci.setNumero(Integer.parseInt(jTextField.getText()));
	                sf.cadastrarCi(ci);
	                }catch(Exception erroGravar){
	                JOptionPane.showMessageDialog(null, "Verifiquei se todos os campos estão de acordo"+erroGravar);
	                }
	            }   
	         });   
	      }   
	      return jButton;   
	   }   
	  
	 
	   public static void main(String[] args) {   
	      TelaCadastroCi abas = new TelaCadastroCi();   
	      abas.setVisible(true);   
	  
	   }   
 
	   public TelaCadastroCi() {   
	      super();   
	      initialize();   
	   }   
 
	   private void initialize() {   
	      this.setSize(300, 200);   
	      this.setContentPane(getJPanel());   
	      this.setTitle("JFrame");   
	   }   
	  

	 
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		
	}   

	
	
}
package controle;

import modelo.Ci;



public class SessionFacade {
	
	Ci mc = new Ci();
	ControleCi cc = new ControleCi();
	
	public void cadastrarCi(Ci ci) {
		cc.iserirCi(ci);
	}
	
	
}
package controle;

import banco.DaoCi;
import modelo.Ci;

public class ControleCi {
	DaoCi daoCi = new DaoCi();
	
    public void iserirCi(Ci ci){
    	daoCi.insere(ci);
    }
	    

}
package banco;

import java.sql.Connection;   
import java.sql.ResultSet;   
import java.sql.SQLException;   
import java.sql.Statement;   
import java.util.ArrayList; 
import java.sql.*;

  
import javax.swing.JOptionPane;   
  
import modelo.Ci;   


public class DaoCi {
	 
	   private final String URL = "jdbc:mysql://localhost:3306/cidigital",   
	         NOME = "root", SENHA = "asenha";   
	  
	   private Connection con;   
	   private Statement comando;   
	  
	   public void apagar(String rg) {   
	      conectar();   
	      try {   
	         comando   
	               .executeUpdate("DELETE FROM ci WHERE numero = '" + rg   
	                     + "';");   
	      } catch (SQLException e) {   
	         imprimeErro("Erro ao apagar ci", e.getMessage());   
	      } finally {   
	         fechar();   
	      }   
	   }   
	  
	   public Ci[] buscarTodos() {   
	      conectar();   
	      String sql = "SELECT * FROM ci";
	      ArrayList<Ci> resultados = new ArrayList<Ci>();   
	      ResultSet rs;   
	      try {   
	    	 PreparedStatement p = con.prepareStatement(sql);
		     rs = p.executeQuery(); 
	         while (rs.next()) {   
	            Ci temp = new Ci();   
	               
	            temp.setNumero(rs.getInt("numero"));   
	    
	            resultados.add(temp);   
	         }   
	         return (Ci[])resultados.toArray(new Ci[0]);   
	      } catch (SQLException e) {   
	         imprimeErro("Erro ao buscar ci", e.getMessage());   
	         return null;   
	      }   
	   }   
	  
	   public void atualizar(Ci ci) {   
	      conectar();   
	      String com = "UPDATE ci SET numero = '" + ci.getNumero()   
	                + "' WHERE  numero = '" + ci.getNumero() + "';";   
	      System.out.println("Atualizada!");   
	      try {   
	         comando.executeUpdate(com);   
	      } catch (SQLException e) {   
	         e.printStackTrace();   
	      } finally {   
	         fechar();   
	      }   
	   }   
	  
	   public Ci[] buscar(int numero) {   
	      conectar();   
	      
	      ResultSet rs;   
	      try {   
	    	 String sql = "SELECT * FROM ci WHERE numero = ? ";  
	    	 
	    	 PreparedStatement p = con.prepareStatement(sql);
	    	 p.setInt(1, numero);
	    	 
	         rs = p.executeQuery(); 
	         ArrayList<Ci> resultados = new ArrayList<Ci>();   
	         while (rs.next()) {   
	            Ci temp = new Ci();   

	            temp.setNumero(rs.getInt("numero"));   
	
	            resultados.add(temp);     
	         }   
	         
	         return (Ci[])resultados.toArray(new Ci[0]);   
	      } catch (SQLException e) {   
	         imprimeErro("Erro ao buscar Ci", e.getMessage());   
	         return null;   
	      }finally {   
				fechar();   
		   }   
	  
	   }   
	  
	   public void insere(Ci ci){   
	      conectar();   
	      
           DaoCi daoCi = new DaoCi();
           if( daoCi.buscar(ci.getNumero()).length==0 ){
	    	
            try {   
			comando.executeUpdate("INSERT INTO ci(numero) VALUES('"  
			+ ci.getNumero() + "' )");   
			            /*   + pessoa.getIdade() + ",'" + pessoa.getCidade() + "','"  
			               + pessoa.getEstado() + "'  */
			System.out.println("Inserida!");   
			} catch (SQLException e) {   
			imprimeErro("Erro ao inserir CI", e.getMessage());   
			} finally {   
			fechar();   
			}
			      
	    }else{
	    	System.out.println("já tem"+daoCi.buscar(ci.getNumero()));  
	    }
   
	   }   
	  
	   private void conectar() {   
	      try {   
	         con = Conexao.conexao(URL, NOME, SENHA, Conexao.MYSQL);   
	         comando = con.createStatement();   
	         System.out.println("Conectado!");   
	      } catch (ClassNotFoundException e) {   
	         imprimeErro("Erro ao carregar o driver", e.getMessage());   
	      } catch (SQLException e) {   
	         imprimeErro("Erro ao conectar", e.getMessage());   
	      }
	   }   
	  
	   private void fechar() {   
	      try {   
	         comando.close();   
	         con.close();   
	         System.out.println("Conexão Fechada");   
	      } catch (SQLException e) {   
	         imprimeErro("Erro ao fechar conexão", e.getMessage());   
	      }   
	   }   
	  
	   private void imprimeErro(String msg, String msgErro) {   
	      JOptionPane.showMessageDialog(null, msg, "Erro crítico", 0);   
	      System.err.println(msg);   
	      System.out.println(msgErro);   
	      System.exit(0);   
	   }  
}
package banco;  

import java.sql.*;   
import java.util.logging.Level;   
import java.util.logging.Logger;   
import javax.swing.*;   

public class Conexao{   
	   public static final int MYSQL = 0;   
	   private static final String MySQLDriver = "com.mysql.jdbc.Driver";   
	  
	   public static Connection conexao(String url, String nome, String senha,   
	         int banco) throws ClassNotFoundException, SQLException {   
	      switch (banco) {         
	      case MYSQL:            
	         Class.forName(MySQLDriver);   
	         break;   
	      }   
	      return DriverManager.getConnection(url, nome, senha);   
	   } 
	
} 

Bom dia,

Me interesso muito por esse tema, mas tenho pouco conhecimento. Gostaria de saber se existe alguma apostila ou tutorial free?

Muito grato, André.

http://www.caelum.com.br/apostilas/

ajuda?

Olá… :smiley:

Antes, deixa mostrá-lo alguns detalhes conceituais. Já entendi que quer prática não teoria. Mas essa prática naturalmente acontecerá se aprender corretamente alguns conceitos sobre o assunto.

MVC é uma camada de código presente, geralmente, no andar Cliente. ( Não entendeu a palavra ‘andar’? Clique aqui! )
Um andar contém 1…n camadas de código. No caso do MVC, ele é uma camada de código presente no andar Cliente ( poderia estar no andar Apresentação ) de sua arquitetura mas esta camada de código não deve estar espalhada pelos outros andares. Os três elementos do MVC tem responsabilidades bem definidas, como pode conferir no link.

Uma boa arquitetura costuma ter cinco andares: Cliente, Apresentação, Domínio, Integração e Recursos.

DAO é uma camada de código presente, geralmente, no andar Integração.
DAO deve ser reutilizável, plugável e independente do programa onde é usado ( do seu domínio ). DAOs não devem saber as regras de dominio.

Pronto. Chega de teorias :stuck_out_tongue: Mas estude bem elas e pergunte a sí mesmo o que deve estar nos andares de Apresentação, Domínio e Recursos?
Provavelmente após realizar esse estudo vai saber separar melhor as responsabilidades dos seus objetos e entender melhor o básico de uma arquitetura.
Abra sua mente para novas idéias e acredite muito na teoria dos links escritos pela mesma pessoa, independentemente do que ler por aí em outras postagens. Ok? :wink:

Tem alguns lendários tópicos nos quais poderá aprofundar melhor seu conhecimento e fazer perguntas mais específicas. São eles:
MVC - http://www.guj.com.br/posts/list/129277.java
DAO - http://www.guj.com.br/posts/list/146051.java e http://www.guj.com.br/posts/list/102742.java
ANDARES - http://www.guj.com.br/posts/list/206664.java

Também sou nova e estou aprendendo. Até +… Obrigada :smiley:

Olá ingridfarabulini,
obrigado por responder, li o que vc me mandou e me acresentou muito, o problema é que esta me falatando é segurança de que estou fazendo esta certo, mandei o código só para o pessoal olhar e ver se o que estou fazendo é ou não mvc!! obrigado
E ae pessoal, estou no caminho certo?