Análise do meu código 3 camadas

22 respostas
charlesbraw

Galera,
Apesar de ter me cadastrado no forum a muito tempo, agora estou começando a participar.
Sou programador PHP e quero muito aprender java, já li algumas apostilas da caelum e outros materiais da net.
Aprendi sobre OO quando esta fazendo a graduação e usamos java como plataforma, pena que máteria é muito corrida e só da uma base geral, enfim, vamos ao que interessa.

Fiz varios teste usando JDBC puro com mysql em um arquivo só e funcionou beleza, usei o banco MySQL.

Agora estou estudando java com 3 camadas, segue um exemplo que achei no guj e gostaria de ouvir a opinião de vocês sobre como ficou meu teste.

Esse é o arquivo de conexão.

package persistencia;

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

/**
 * Classe que controla a conexão com o banco de dados
 * @author eu
 */
public class Conexao {
    private static Conexao instance = null;
    
    private String url = null;
    private String user = null;
    private String pass = null;
    private String driver = null;
    
    private Connection conn = null;
    
    private Conexao() throws SQLException, ClassNotFoundException {
      this.driver    = "sun.jdbc.odbc.JdbcOdbcDriver";  
      this.user   = "root";  
      this.pass   = "";
      this.url = "jdbc:mysql://localhost/teste";
      
      Class.forName(this.driver);
      conn = DriverManager.getConnection(url,user,pass);
    }
    public Connection getConnection() {
        return this.conn;
    }
    public static Conexao getInstance() throws SQLException, ClassNotFoundException {
        if (instance == null) {
            instance = new Conexao();
        }
        return instance;
    }
    
}

Classe setor (eu poderia ter colocado para setar nome no construtor, mas o foco foi testar mvc mesmo)

package modelo;

import java.sql.SQLException; 
import persistencia.SetorDAO;
/**
 * Classe que representa o setor
 * @author eu
 */
public class Setor {
    private String nome;
    
    public void setNome(String nome) {
        this.nome = nome;
    }
    
    public String getNome() {
        return this.nome;
    }

   public void insert() throws SQLException, ClassNotFoundException {  
        SetorDAO dao = new SetorDAO(this);  
        dao.insert();  
   }
    
}

Persistencia SetorDAO

package persistencia;

import java.sql.PreparedStatement;
import java.sql.SQLException;

import modelo.Setor;

/**
 * Persistencia com Setor
 * @author eu
 */
public class SetorDAO {
    private Setor setor = null;
    
    public SetorDAO(Setor setor) {
        this.setor = setor;
    }
    
    public void insert() throws SQLException, ClassNotFoundException {
        String sql = "insert into setor (cod_setor,nome)values(?,?)";
    
        Conexao conn = Conexao.getInstance();
        PreparedStatement query = conn.getConnection().prepareStatement(sql);
        
        query.setString(1,null);
        query.setString(2,this.setor.getNome());
        query.executeUpdate();
        query.close();
    }
}

Programa principal (teste)

package visao;

import modelo.Setor;

/**
 *
 * @author eu
 */
public class Principal {
    public static void main(String args[]) {
        Setor setor = new Setor();
        setor.setNome("teste123");
        
        System.out.println(setor.getNome());
        
        try {  
           setor.insert();  
        } catch (Exception e1) {  
           System.out.println(e1.getMessage());  
        }          
    }
    
}

A minha idía seria talvez passar para o motodo insert da classe DAO o objetco setor, assim eu eliminaria o método insert que existe na classe Setor.
Como vocês avaliam este exemplo criado? Fiz alguma coisa errada? O que poderia ser melhorado?
obs: Esta cadastrando corretamente.

Se vocês tiverem mais material de java mvc para me indicar ficarei grato, pois quero muito aprender.

Valeu.

22 Respostas

P

está no caminho certo…

Mude as classes para que a classe Principal aceite isso:

SetorDAO  setorDAO = new SetorDAO();

setorDAO.insert(setor);
nathanpsouza

Ta no caminho certo sim cara, MVC consiste em separar sua aplicação em camadas, e seu teste cumpriu esse requisito, veja que vc abstraiu o sql de suas regras de negócio, e não teve regras de negócio (vou assumir aquele main como view) na view, então teoricamente o padrão mvc se fechou :}

agora com relação a classe que gera conexão com o banco ser singleton, em um programa real isso vai te dar problemas caso precise de varias conexões simultaneas, mas pra testes funciona legal :smiley:

Zeed01

Boa tarde Galera !

Vocês acham que esta correto o método insert dentro da classe Setor ?
Nesse exemplo Setor não seria uma Entity ?

[]s

nathanpsouza

puts nem reparei no insert ali hohohoho
verdade, esse insert deveria estar no dao, e receber um objeto setor como parametro

charlesbraw

Galera obrigado a dica de todos, o fato do insert esta dentro da classe setor eu tambem estava achando muito estranho rsrsr.
Mas fiz algumas adaptações

SetorDAO

package persistencia;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import modelo.Setor;

/**
 * Persistencia com Setor
 * @author eu
 */
public class SetorDAO {
        
    public void insert(Setor setor) throws SQLException, ClassNotFoundException {
        String sql = "insert into setor (cod_setor,nome) values (?,?)";
    
        Conexao conn = Conexao.getInstance();
        PreparedStatement query = conn.getConnection().prepareStatement(sql);
        
        query.setString(1,null);
        query.setString(2,setor.getNome());
        query.executeUpdate();
        query.close();
    }
}

main(Principal)

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

package visao;

import modelo.Setor;
import persistencia.SetorDAO;
/**
 *
 * @author eu
 */
public class Principal {
    public static void main(String args[]) {
        Setor setor1 = new Setor();
        setor1.setNome("teste1");
        
        Setor setor2 = new Setor();
        setor2.setNome("teste2");
        
        SetorDAO setorDAO = new SetorDAO();
        try {     
           setorDAO.insert(setor1);
           setorDAO.insert(setor2);
        } catch (Exception e1) {  
           System.out.println(e1.getMessage());  
        }          
    }
    
}

nathanpsouza, depois vou pesquisar sobre isso que você falou…

Agora ficou melhor?

Valeu galera.

viniciusfaleiro

MVC é bem. más bem diferente de separação em camadas… O Design pattern MVC geralmente trabalha um uma das camadas… Sua aplicação está sim separada por camadas más não usa MVC…

viniciusfaleiro

nathanpsouza:
Ta no caminho certo sim cara, MVC consiste em separar sua aplicação em camadas, e seu teste cumpriu esse requisito, veja que vc abstraiu o sql de suas regras de negócio, e não teve regras de negócio (vou assumir aquele main como view) na view, então teoricamente o padrão mvc se fechou :}

agora com relação a classe que gera conexão com o banco ser singleton, em um programa real isso vai te dar problemas caso precise de varias conexões simultaneas, mas pra testes funciona legal :D

Eu não vejo problemas na classe ser singleton… vc economiza instancias de conexões abertas… e ainda pode criar vários statements… Más é claro que o ideal seria um pool…

Zeed01

Boa tarde Galera !

viniciusfaleiro:

Pode dar mais detalhes ?
Em qual camada você diz que MVC trabalha ?

[]s

viniciusfaleiro

MVC pode trabalhar em uma ou mais camadas (Geralmente na view)… webdynpro da SAP por exemplo trabalha na view… o framework struts tbm é MVC por exemplo…

Vide esse belo artigo.

juliofsn

Sobre o insert estar ou não na classe Setor, depende de que padrão você quer seguir.
No padrão DAO, só o DAO deve ser responsável por salvar os dados da classe de negócio.
No padrão Active Record, a classe pode sim ser responsável por persistir e buscar seus próprios dados no banco.

Zeed01

Boa tarde Galera !

Pra mim fica meio confuso falar em MVC trabalhando somente na View… claro, muito provavelmente seja uma limitação e falta de conhecimento da minha parte, não entenda como critica, mas sempre imaginei que a view é a parte que interage com o usuário… onde entra ai o model e o controller ?

[]s

viniciusfaleiro

Vejamos o caso do webdynpro por exemplo… webdynpro é uma tecnologia da SAP que utiliza MVC (que inclusive trabalho) para interface gráfica com cliente (desktop, mobile)… ele faz integração com WebServices, RFCs do SAP e EJB por exemplo para executar a parte de negócio…

Na minha aplicação formada por um cliente webdynpro + webservices + EJB + banco de dados… o webdynpro seria a CAMADA de view…

Já dentro da tecnologia webdynpro nós temos o MVC… para construir uma aplicação nele vc precisa criar controllers personalizados para consumir webservices… criar formularios e tabelas para interagir com o usuario (View) e consumir seus webservices, EJB…(Model)…

Entendeu??? Temos uma camada view da minha aplicação que trabalha com desing pattern MVC…

juliofsn

Zeed01, o usuário não interage só com a view (do MVC) mas com o controller e o model também, todos os 3 são necessários para a experiência do usuário. A view não faz nada sem o controller por baixo, que é o responsável por executar os comandos do usuário, o controller precisa saber quais dados o usuário quer manipular, pra isso temos o model.

O model é responsável por ter os dados, assim, muitos frameworks acabam associando o model diretamente ao banco. E como o controller é responsável pelas ações, colocam a lógica de negócio nele.

Mas os dados do model não precisam vir diretamente do banco, e o controller pode repassar as tarefas de negócio para outra classe.

Assim você pode dividir as camadas em Apresentação (onde você usa o MVC), Negócios (onde se encaixaria EJB’s, por exemplo) e Persistência (onde você pode usar JPA e/ou Hibernate, etc.)

Espero ter esclarecido melhor essa questão.

nathanpsouza

ora não vejo uma definição melhor para o padrão MVC do que software em camadas,

@juliofsn
levei em consideração o padrao dao, visto quem ar em java eh um pouco chato de implementar :stuck_out_tongue_winking_eye:

@viniciusfaleiro
ora, como a aplicação dele esta em camadas seguindo model view e controller e não eh mvc?? o.O

viniciusfaleiro

Cara… Simples… separação em camadas não é MVC… Antes de postar essas afirmações vc tem que conhecer sobre o assunto… Eu já fiz isso que você fez agora (MVC é Camadas)… Fui praticamente “agredido” verbalmente pelo cara que criou esse artigo ai que postei… rs… hoje entendo bem o que ele quis dizer…

Simples… Separação em camadas não é MVC… tem muitos lugares bons ai pra vc entender melhor isso…

nathanpsouza

o.O

por isso que eu gosto de forums, agente sempre aprende mais :}
lendo o artigo XD

nathanpsouza

o.O

por isso que eu gosto de forums, agente sempre aprende mais :}
lendo o artigo XD

@edit
de fato, vendo pelo ponto de vista do artigo, eu sentia falta de mais “letras” no MVC da forma como aprendi isso (foi no rails - sim, vim do rails pro java uiHAUISHUIH - , la tem ateh as classes geradas com nome de model view e controller :P), entao vendo pelo artigo existe fundamento nele pois sempre falta alguma “camada X” no mvc da forma
como estou acostumado a ver :stuck_out_tongue:

juliofsn

nathanpsouza:
@juliofsn
levei em consideração o padrao dao, visto quem ar em java eh um pouco chato de implementar ;P

Beleza cara, só quis esclarecer que da forma como ele estava fazendo antes, também não estava de todo errado.

Quanto a questão de MVC e Camadas, leia o link que o vinicius passou, é um ótimo texto sobre a diferença entre os dois. Lembre primeiro que Camadas dizem respeito à arquitetura definida para a sua aplicação, enquanto MVC é um design pattern para a camada de apresentação (ou seja, vem depois de ter sua arquitetura definida).

charlesbraw

Galera,
Bacana os comentários tem assuntos que eu fico boiando rsrsrs vou chegar lá um dia rsrsrs.
Mas quanto a mudança que fiz, o que vocês acharam? da para seguir este modelo enquanto vou evoluindo o aprendizado?

Valeu.

themage

acho q isso pode ajudar:

http://www.fragmental.com.br/wiki/index.php?title=MVC_e_Camadas

Livros:

Padrões de Arquitetura de Aplicações Corporativas - Martin Fowler

Design Patterns: Elements of Reusable Object-Oriented Software - GoF

pedromuyala

Acho melhor passar por este tópico provavelmente vai esclarecer muitas dúvidas a respeito.
MVC != Camadas. Vai encontrar conteúdo sobre persistencia lá também. Espero ter colaborado. :wink:

pedromuyala

Acredito que o link acima irá ajudar!

Criado 23 de fevereiro de 2010
Ultima resposta 8 de mai. de 2010
Respostas 22
Participantes 8