Ola a todos,
estou tentando fazer meu primeiro programa em jsp e estou com dificuldade no relacionamento entre as tabelas.
Tenho uma tabela de cliente que tem um relacionamemto com uma tabela Uf(estados).E não sei como fazer o Dao dessa chave estrangeira
Esta é a classe uf
public class Uf {
private long id;
private String estado;
getter e setters
essa é a clientes
public class Cliente {
private long id;
private String nome;
private String logradouro;
private String complemento;
private String bairro;
private String telefone;
private String celular;
private String cep;
private Uf iduf;
getters e setters
e aqui o dao onde é a minha duvida
public void adiciona(Cliente cliente) {
String sql = "insert into cliente(nome,logradouro,complemento,bairro,telefone,celular,cep,uf_id) values (?,?,?,?,?,?,?,?)";
try {
// prepared statement para inserção
PreparedStatement stmt = connection.prepareStatement(sql);
// seta os valores
stmt.setString(1,cliente.getNome());
stmt.setString(2,cliente.getLogradouro());
stmt.setString(3,cliente.getComplemento());
stmt.setString(4,cliente.getBairro());
stmt.setString(5,cliente.getTelefone());
stmt.setString(6,cliente.getCelular());
stmt.setString(7,cliente.getCep());
// executa
stmt.execute();
stmt.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
como faria a o stmt para o id da uf? ou isso é errado?
minha ideia é cadastrar os estados nessa tabela para ser escolhido na hora do cadastro.
Estou começando agora e tenho algumas duvidas essa é uma delas.
Obrigado.
Como você ta usando JDBC direto, vai ter que ser tudo no braço…
Ao meu ver você deveria fazer assim:
1- Instancie a classe Cliente;
2 - Pela simplicidade da Classe Uf, você poderia carrega-la em um Map<String, Integer> listaUF, que vai guardar a UF e o ID dos estados, provavelmente você vai precisar ordernar essa lista pela UF, talvez seria bom você usar um TreeMap (tem tópicos aqui como ordenar listas e Collections), esta lista servira tambem para alimentar um combo onde será armazenado o estado escolhido;
3 - Puxe desse Map o ID do UF quando for gravar na tabela de Clientes, Ex: stmt.setString(8, listaUF.get(“string da UF que estará no combo”);
Você pode fazer o relacionamento de várias maneiras.
A primeira solução é criar uma consulta sql com todos os campos que você precisa e preencher os objetos. Exemplo:
public List loadClientes(){
//Consulta sql e statements
while(rs.next()){
Cliente cliente = new Cliente();
Uf uf = new Uf();
cliente.setId(rs.getInt("id"));
//preencher outros atributos do cliente com o resultset
uf.setId(rs.getInt("uf_id"));
uf.setEstado(rs.getString("uf_estado"));
cliente.setUf(uf);
clientes.add(cliente);
}
return clientes;
}
A outra solução é criar uma consulta somente para as Ufs. Por exemplo:
public List loadClientes(){
//Consulta sql e statements
while(rs.next()){
Cliente cliente = new Cliente();
cliente.setId(rs.getInt("id"));
//preencher outros atributos do cliente com o resultset
cliente.setUf(loadUf(rs.getInt("uf_id"))));
clientes.add(cliente);
}
return clientes;
}
public Uf loadUf(int id){
Uf uf = new Uf();
//Consulta sql e statements usando o parametro
while(rs.next()){
uf.setId(rs.getInt("id"));
uf.setEstado(rs.getString("estado"));
}
return uf;
}
Mas a melhor solução para esse caso é criar o campo uf com dois caracteres na tabela cliente, salvar a sigla da UF neste campo e criar um Enum Estado com UF e Nome.
[quote=wendel2s]Você pode fazer o relacionamento de várias maneiras.
A primeira solução é criar uma consulta sql com todos os campos que você precisa e preencher os objetos. Exemplo:
public List loadClientes(){
//Consulta sql e statements
while(rs.next()){
Cliente cliente = new Cliente();
Uf uf = new Uf();
cliente.setId(rs.getInt("id"));
//preencher outros atributos do cliente com o resultset
uf.setId(rs.getInt("uf_id"));
uf.setEstado(rs.getString("uf_estado"));
cliente.setUf(uf);
clientes.add(cliente);
}
return clientes;
}
A outra solução é criar uma consulta somente para as Ufs. Por exemplo:
public List loadClientes(){
//Consulta sql e statements
while(rs.next()){
Cliente cliente = new Cliente();
cliente.setId(rs.getInt("id"));
//preencher outros atributos do cliente com o resultset
cliente.setUf(loadUf(rs.getInt("uf_id"))));
clientes.add(cliente);
}
return clientes;
}
public Uf loadUf(int id){
Uf uf = new Uf();
//Consulta sql e statements usando o parametro
while(rs.next()){
uf.setId(rs.getInt("id"));
uf.setEstado(rs.getString("estado"));
}
return uf;
}
Mas a melhor solução para esse caso é criar o campo uf com dois caracteres na tabela cliente, salvar a sigla da UF neste campo e criar um Enum Estado com UF e Nome.[/quote]
seria mais ou menos isso?
Gostei da solução com enum parece bem legal, mas peguei esse exemplo bem simples da UF para aprender esses relacionamentos entre tabelas(ta feia a coisa).
Agora ainda não sei como fazer com o ClientesDao, a minha ideia é criar uma lista na pagina já com os campos da uf relativos ao da tabela UF
desculpa a pertubação, mas estou começando agora.