Iniciante + DAO

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.

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;
	}
}

[code]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();
}

}
[/code]

[code]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);
}

}[/code]

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.

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!

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());
        }
    }                                              
                                      

Muito obrigado de novo!

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

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?

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?

[quote=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?[/quote]

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.

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

Estou tendo umas dificuldades com o tratamento dos dados.

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

[code]import java.util.Collection;

public class ClienteEndereco {
private Cliente cliente;
private Endereco endereco;
private Collection clientes;
private Collection 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;
}

}[/code]