Iniciante + DAO

9 respostas
alomurilo

Seguinte, galera:

Desenvolvi um sistema para um projeto na faculdade. Acontece que alguém achou que seria muito divertido mencionar estruturas importantes como o DAO apenas 20 dias antes da entrega do projeto.

Resultado: tenho que quebrar a cabeça e implementar o DAO no meu sistema pronto. Confesso que meu código está uma bagunça, e eu não sei nem por onde começar. Por isso, gostaria de uma luz de vocês.

Fiz o programa no Eclipse e o banco no Access. Achei bastante material na internet, mas achei tudo meio inconsistente.

Quantas e quais classes eu vou precisar? O que cada uma vai fazer?

Por exemplo, criei o formulário de cadastro de titular em um JFrame. Vou precisar então de uma classe Titular e uma DAOTitular. Quais métodos cada classe terá que ter?

Achei bastante material na internet, mas achei tudo meio inconsistente, cada lugar faz de um jeito.

Desde já agradeço.

9 Respostas

D

Eu to fazendo um projeto e estou fazendo o seguinte. Tenho os pacotes
Modelo - Ficam as classes iniciais, como Cliente.java, aqui ficam os atributos, contrutores e os métodos getters e setters.
Visão - Ficam as Janelas do sistema.
Negócio - Aqui é onde ficam as regras de negócio.
Persistencia - Aqui é onde ficam as DAO, na minha DAO é onde os dados são inseridos no Banco de Dados.

Um exemplo de cada pacote:

package Modelo;

public class Cliente {
	private int id;
	private int telefone;
	private int celular;
	private String nome;
	private String sobrenome;
	private Endereco endereco;

	public Cliente(int telefone, int celular, String nome,
			String sobrenome, Endereco endereco) {
		this.telefone = telefone;
		this.celular = celular;
		this.nome = nome;
		this.sobrenome = sobrenome;
		this.endereco = endereco;
	}
	
	public Cliente(int id, int telefone, int celular, String nome,
			String sobrenome, Endereco endereco) {
		this.id = id;
		this.telefone = telefone;
		this.celular = celular;
		this.nome = nome;
		this.sobrenome = sobrenome;
		this.endereco = endereco;
	}
	
	public Cliente(){
		
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getTelefone() {
		return telefone;
	}
	public void setTelefone(int telefone) {
		this.telefone = telefone;
	}
	public int getCelular() {
		return this.celular;
	}
	public void setCelular(int celular) {
		this.celular = celular;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getSobrenome() {
		return sobrenome;
	}
	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	}
	public Endereco getEndereco() {
		return endereco;
	}
	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
}
package Negocio;

import java.sql.SQLException;
import Modelo.Cliente;
import Modelo.ClienteEndereco;
import Modelo.Endereco;
import Persistencia.ClienteDAO;

public class GerenciadorCliente {
	
	public void adiciona(Cliente cliente) throws ClassNotFoundException, SQLException{
		ClienteDAO clienteDAO = new ClienteDAO();
		clienteDAO.adiciona(cliente);
	}
	
	public void remove(int telefone) throws SQLException, ClassNotFoundException{
		ClienteDAO clienteDAO = new ClienteDAO();
		
		clienteDAO.remove(telefone);
	}
	
	public ClienteEndereco procura(int telefone) throws SQLException, ClassNotFoundException{
		ClienteDAO clienteDAO = new ClienteDAO();
		return clienteDAO.retornaCliente(telefone);
	}
	
	public void editar(Cliente cliente, Endereco endereco) throws ClassNotFoundException, SQLException{
		ClienteDAO clienteDAO = new ClienteDAO();
		
		clienteDAO.atualiza(cliente, endereco);
		}
	
	public ClienteEndereco todosClientes() throws SQLException, ClassNotFoundException{
		ClienteDAO clienteDAO = new ClienteDAO();
		return clienteDAO.mostraTodos();
	}
}
package Persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import Modelo.Cliente;
import Modelo.ClienteEndereco;
import Modelo.Endereco;
import Negocio.GerenciadorConexao;

public class ClienteDAO {
	private GerenciadorConexao gc = new GerenciadorConexao();
	
	public void adiciona(Cliente cliente) throws ClassNotFoundException, SQLException{
		Connection c = gc.conectaBanco();
		PreparedStatement stmt = c.prepareStatement("Insert Into Cliente (telefone, celular, primeiroNome, ultimoNome, enderecoId) values (?,?,?,?,?)");
		
		stmt.setInt(1, cliente.getTelefone());
		stmt.setInt(2, cliente.getCelular());
		stmt.setString(3, cliente.getNome());
		stmt.setString(4, cliente.getSobrenome());
		stmt.setInt(5, (retornaMaxId()));
		stmt.execute();
	}
	
	public void atualiza(Cliente cliente, Endereco endereco) throws ClassNotFoundException, SQLException{
		Connection c = gc.conectaBanco();
		int id = retornaId(cliente); //pegando o numero do enderecoId do cliente.
		
		PreparedStatement stmt = c.prepareStatement("UPDATE Cliente SET telefone = ? WHERE id = ?"+
													" UPDATE Cliente SET celular = ? WHERE id = ?"+
													" UPDATE Cliente SET primeiroNome = ? WHERE id = ?"+
													" UPDATE Cliente SET ultimoNome = ? WHERE id = ?"+
													" UPDATE Endereco SET rua = ? WHERE id = ?"+
													" UPDATE Endereco SET numero = ? WHERE id = ?"+
													" UPDATE Endereco SET bairro = ? WHERE id = ?"+
													" UPDATE Endereco SET cep = ? WHERE id = ?"+
													" UPDATE Endereco SET complemento = ? WHERE id = ?"+
													" UPDATE Endereco SET referencia = ? WHERE id = ?");
		stmt.setInt(1, cliente.getTelefone());
		stmt.setInt(2, cliente.getId());
		stmt.setInt(3, cliente.getCelular());
		stmt.setInt(4, cliente.getId());
		stmt.setString(5, cliente.getNome());
		stmt.setInt(6, cliente.getId());
		stmt.setString(7, cliente.getSobrenome());
		stmt.setInt(8, cliente.getId());
		stmt.setString(9, endereco.getRua());
		stmt.setInt(10, id);
		stmt.setInt(11, endereco.getNumero());
		stmt.setInt(12, id);
		stmt.setString(13, endereco.getBairro());
		stmt.setInt(14, id);
		stmt.setString(15, endereco.getCep());
		stmt.setInt(16, id);
		stmt.setString(17, endereco.getComplemento());
		stmt.setInt(18, id);
		stmt.setString(19, endereco.getReferencia());
		stmt.setInt(20, id);
		stmt.execute();
	}
	
	public ClienteEndereco mostraTodos() throws SQLException, ClassNotFoundException{
		Connection c = gc.conectaBanco();
		Statement stmt = c.createStatement();
        ResultSet rs = stmt.executeQuery("select * from Cliente inner join Endereco on (Cliente.enderecoId = Endereco.id)");
        Cliente cliente;
        Endereco endereco;
        Collection<Cliente> clientes = new ArrayList<Cliente>();
        Collection<Endereco> enderecos = new ArrayList<Endereco>();
        
        while(rs.next()){
        	int id = rs.getInt("id");
        	int telefone = rs.getInt("telefone");
        	int celular = rs.getInt("celular");
        	String nome = rs.getString("primeiroNome");
        	String sobrenome = rs.getString("ultimoNome");
        	
        	int id1 = rs.getInt("id");
        	String rua = rs.getString("rua");
        	int numero = rs.getInt("numero");
        	String bairro = rs.getString("bairro");
        	String cep = rs.getString("cep");
        	String complemento = rs.getString("complemento");
        	String referencia = rs.getString("referencia");
        	
        	endereco = new Endereco(id1, rua, numero, bairro, cep, complemento, referencia);
        	cliente = new Cliente(id, telefone, celular, nome, sobrenome, endereco);
        	
        	enderecos.add(endereco);
        	clientes.add(cliente);
        }
        ClienteEndereco ce = new ClienteEndereco(clientes, enderecos);
        
        return ce;
	}
	
	public ClienteEndereco retornaCliente(int telefone1) throws SQLException, ClassNotFoundException{
		Connection c = gc.conectaBanco();
		Statement stmt = c.createStatement();
        ResultSet rs = stmt.executeQuery("select * from Cliente inner join Endereco on (Cliente.enderecoId = Endereco.id)" +
        									"where Cliente.telefone = "+ telefone1);
        
        while(rs.next()){
        	int id = rs.getInt("id");
        	int telefone = rs.getInt("telefone");
        	int celular = rs.getInt("celular");
        	String nome = rs.getString("primeiroNome");
        	String sobrenome = rs.getString("ultimoNome");
        	
        	int id1 = rs.getInt("id");
        	String rua = rs.getString("rua");
        	int numero = rs.getInt("numero");
        	String bairro = rs.getString("bairro");
        	String cep = rs.getString("cep");
        	String complemento = rs.getString("complemento");
        	String referencia = rs.getString("referencia");
        	
        	Endereco endereco = new Endereco(id1, rua, numero, bairro, cep, complemento, referencia);
        	Cliente cliente = new Cliente(id, telefone, celular, nome, sobrenome, endereco);
        	
        	ClienteEndereco ce = new ClienteEndereco(cliente, endereco);
        	return ce;
        }
        
        return null;
       
	}
	
	public void remove(int telefone) throws SQLException, ClassNotFoundException{
		
			Connection c = gc.conectaBanco();
			
			PreparedStatement stmt;
			stmt = c.prepareStatement("DELETE FROM Endereco WHERE (Select enderecoId FROM Cliente WHERE ? = Cliente.telefone) = Endereco.id");
			stmt.setInt(1, telefone);
			stmt.execute();
			
			stmt = c.prepareStatement("DELETE FROM Cliente WHERE Cliente.telefone = ?");
			stmt.setInt(1, telefone);
			stmt.execute();		
	}
	
	public int retornaMaxId() throws SQLException, ClassNotFoundException{
		EnderecoDAO enderecoDAO = new EnderecoDAO();
		return enderecoDAO.retornaMaxId();
	}
	
	public int retornaId(Cliente cliente) throws ClassNotFoundException, SQLException{
		EnderecoDAO enderecoDAO = new EnderecoDAO();
		return enderecoDAO.retornaId(cliente);
	}
}

Não vou colocar a Visão pois ficou muito grande. O código começa na Visão, passa pelo negócio e depois vai pra Persistência onde ficam as DAOs. Creio que isso já te ajuda um pouco.

alomurilo

Muito obrigado, douglastc. Ajudou bastante.

Mas, na verdade, a parte em que eu tenho mais dúvidas é na Visão mesmo.

Pode mostrar como ficaria só a parte de adicionar cliente?

Obrigado!

D

O Endereço é outra tabela, tem uma DAO só para o Endereço, é igual essa do Cliente, mas é com os dados do Endereço.

private void botaoAdicionarActionPerformed(java.awt.event.ActionEvent evt) {                                               
    	mostraMensagem.setText("");
    	DefaultTableModel modelo = (DefaultTableModel) TabelaCliente.getModel(); 
 		modelo.setNumRows(0);
    	
 		try{
        	GerenciadorCliente gc = new GerenciadorCliente();
        	GerenciadorEndereco ge = new GerenciadorEndereco();
        	mostraMensagem.setText("");
        	//Variaveis do endereco
        	String rua = digitaRua.getText();
        	int numero = Integer.parseInt(digitaNumero.getText());
        	String bairro = digitaBairro.getText();
        	String cep = digitaCep.getText();
        	String complemento = digitaComplemento.getText();
        	String referencia = digitaReferencia.getText();
    	
        	//Variaveis do Cliente
        	int telefone = Integer.parseInt(digitaTelefone.getText());
        	int celular = Integer.parseInt(digitaCelular.getText());
        	String nome = digitaNome.getText();
        	String sobrenome = digitaSobrenome.getText();
        	
        	Endereco endereco = new Endereco(rua, numero, bairro, cep, complemento, referencia);
        	Cliente cliente = new Cliente(telefone, celular, nome, sobrenome, endereco);
    	
        	ge.adiciona(endereco);
        	gc.adiciona(cliente);
    	
        	mostraMensagem.setText("Cliente Adicionado com Sucesso!");
    	
        	digitaBairro.setText("");
        	digitaCep.setText("");
        	digitaComplemento.setText("");
        	digitaId.setText("");
        	digitaNome.setText("");
        	digitaNumero.setText("");
        	digitaReferencia.setText("");
        	digitaRua.setText("");
        	digitaSobrenome.setText("");
        	digitaTelefone.setText("");
        	digitaCelular.setText("");
        }
        catch(Exception e){
        	mostraMensagem.setText(e.getMessage());
        }
    }
alomurilo

Muito obrigado de novo!

Me ajudou bastante, você não tem noção de como eu estava perdido nesse assunto. :smiley:

alomurilo

Estou tendo problemas para adicionar valores numéricos longos.

Coloquei RG, CPF e CNH como int e adicionei poucos caracteres para testar, quando salvei, ele adicionou no banco normalmente. Mas com os caracteres que eu preciso mesmo (11 para cada), o int aparentemente não comporta.

Mudei para long e fiz todas as alterações no resto do programa, mas ele não aceita nenhum valor e dá o erro “[Driver ODBC para Microsoft Access]Recurso opcional não implementado”.

O que estou fazendo errado?

D

Eu te indico trabalhar com String nesses casos, assim quando vc precisar vc converte pra número.
No caso do seu erro, vc também mudou o tipo no Bando de Dados?

alomurilo

douglastc:
Eu te indico trabalhar com String nesses casos, assim quando vc precisar vc converte pra número.
No caso do seu erro, vc também mudou o tipo no Bando de Dados?

Sim, no banco está como Decimal. Foi o único que encontrei que suporta esses tamanhos.

Vou mudar para Strings então. Antes de implementar o DOA estava assim e funcionava perfeitamente.

eidt: funcionou. :smiley:

Obrigado.

alomurilo

Amigo, não querendo abusar, mas você pode postar os construtores da sua classe ClienteEndereco?

Estou tendo umas dificuldades com o tratamento dos dados.

D

Eu criei dois contrutores, aí dependendo vc só precisará do que tem a Collection como argumento.

import java.util.Collection;

public class ClienteEndereco {
	private Cliente cliente;
	private Endereco endereco;
	private Collection<Cliente> clientes;
	private Collection<Endereco> enderecos;
	
	public ClienteEndereco(Cliente cliente, Endereco endereco) {
		this.cliente = cliente;
		this.endereco = endereco;
	}
	
	public ClienteEndereco(Collection<Cliente> clientes, Collection<Endereco> enderecos){
		this.clientes = clientes;
		this.enderecos = enderecos;
	}
	
	public Collection<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(Collection<Cliente> clientes) {
		this.clientes = clientes;
	}

	public Collection<Endereco> getEnderecos() {
		return enderecos;
	}

	public void setEnderecos(Collection<Endereco> enderecos) {
		this.enderecos = enderecos;
	}

	public Cliente getCliente() {
		return cliente;
	}
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	public Endereco getEndereco() {
		return endereco;
	}
	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}
}
Criado 25 de outubro de 2010
Ultima resposta 27 de out. de 2010
Respostas 9
Participantes 2