Boa Tarde Pessoal, estou com uma dúvida pra imprimir todos os clientes, acho que é uma coisa básica mas to quebrando a cabeça.
Eu tenho uma tabela de clientes e uma tabela de enderecos, eu queria imprimir todos os clientes com os enderecos mas não sei como faço isso, essa minha classe fica em outro pacote, ou seja, tenho que passar os clientes e os enderecos para o outro pacote que eu to usando para imprimir os clientes. Eu já tenho todos os dados com o SELECT no banco, mas só consegui passar os dados dos clientes. O código que eu já fiz segue abaixo.
[code]public Collection 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 clientes = new ArrayList();
while(rs.next()){ //PEGANDO OS DADOS DO BANCO E ADICIONANDO NA LISTA
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");
//PEGANDO OS DADOS DO ENDERECO
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);
clientes.add(cliente);
}
return clientes;
}[/code]
Olá, douglastc!
Beleza?
Vamos lá:
Bom, o relacionamento das suas entidades Cliente e Endereço é de 1-N. Um cliente “possui” vários endereços, e um endereço pertence a um cliente específico. Na regra de navegabilidade do diagrama de classes, a classe Cliente possuirá uma Collection de endereços. Até aí tudo bem?
public class Cliente {
private int codigo;
private String nome;
private List<Endereco> enderecos;
}
public class Endereco {
private int codigo;
private String descricao;
}
Na hora de você fazer sua pesquisa na base de Dados, ficaria algo assim:
public class ClienteDAO {
public static List<Cliente> pesquisarClientes(Connection conn) throws Excpetion {
String query = "Select * From Cliente";
PreparedStatement pstm = conn.prepareStatement(query);
ResultSet rs = pstm.executeQuery();
List<Cliente> clientes = null;
if ( rs != null ) {
clientes = new ArrayList<Cliente>();
while ( rs.next() ) {
Cliente cliente = new Cliente();
cliente.setCodigo(rs.getInt("Codigo"));
cliente.setNome(rs.getString("Nome"));
cliente.setEnderecos( EnderecoDAO.pesquisarEnderecosCliente(cliente.getCodigo(), conn) );
clientes.add(cliente);
}
}
rs.close();
return clientes;
}
}
public class EnderecoDAO {
public static List<Endereco> pesquisarEnderecosCliente( int cliente, Connection conn ) throws Exception {
Object params[] = { cliente };
String query = String.format("Select * From Endereco Where Cliente = %s", params);
PreparedStatement pstm = conn.prepareStatement(query);
ResultSet rs = pstm.executeQuery();
List<Endereco> enderecos = null;
if ( rs != null ) {
enderecos = new ArrayList<Endereco>();
while ( rs.next() ) {
Endereco endereco = new Endereco();
endereco.setCodigo(rs.getInt("Codigo"));
endereco.setDescricao(rs.getString("Descricao"));
enderecos.add(endereco);
}
}
rs.close();
return enderecos;
}
}
Vamos entender o que foi feito…
Primeiro, no meu ClienteDAO, eu tenho o método de pesquisa. Ele pesquisa todos os clientes. Para cada cliente, eu tenho uma série de endereços, representada pela minha coleção. No EnderecoDAO, tenho um método que pesquisa quais são os endereços de determinado cliente. Daí, para cada cliente, eu busco seus endereços específicos e voilà!!
Deu pra entender mais ou menos?
OBS: Eu passo a conexão por parâmetro para fazer pool de conexão, caso necessite fazer várias consultas simultâneas, como foi o caso!
Espero ter ajudado!
Abraço!