Boa tarde Srs.
Estou com dúvidas em como melhorar um pouco meu código, para efeito de estudos!
Estou fazendo um CRUD que para os experientes pode parecer simples, mas estou penando um pouco.
Tenho uma tabela no BD chamada tbl_endereco. Nesta tabela existem FK de logradouro, país, estado e cidade que estão em tabelas separadas. Segue tabela endereço:
CREATE TABLE public.tbl_endereco
(
id character varying(20) COLLATE pg_catalog."default" NOT NULL,
fk_logradouro integer,
endereco character varying(100) COLLATE pg_catalog."default",
numero character varying(10) COLLATE pg_catalog."default",
complemento character varying(100) COLLATE pg_catalog."default",
bairro character varying(100) COLLATE pg_catalog."default",
cep character varying(10) COLLATE pg_catalog."default",
fk_pais integer,
fk_estado integer,
fk_cidade character varying(8) COLLATE pg_catalog."default",
CONSTRAINT tbl_endereco_pkey PRIMARY KEY (indexador)
)
Obs: a cidade está como Char pq eu coloquei o código do IBGE da cidade como PK. As outras tabelas estão ok, foram citadas para efeito de facilitar a ideia que eu quero chegar.
Segue meu modelo de Endereço:
public class ModeloEndereco {
private int id;
private ModeloLogradouro fk_logradouro; //Instancia de Logradouro
private String endereco;
private String numero;
private String complemento;
private String cep;
private String bairro;
private ModeloPais fk_pais;
private ModeloEstado fk_estado;
private ModeloCidade fk_cidade;
Ao criar o meu ModeloEndereco, ao invés de passar apenas um int como parametro para as chaves estrangeiras eu passei os outros modelos, assim eu posso acessar seus atributos setId() e getId() que são int, no DAO. conforme abaixo:
public void inserirRegistro(ModeloEndereco mod){
String colunas , valores , sql;
colunas = "id , "
+ "logradouro , "
+ "endereco , "
+ "numero , "
+ "complemento , "
+ "bairro , "
+ "cep , "
+ "fk_pais , "
+ "fk_estado , "
+ "cidade";
valores = "?,?,?,?,?,?,?,?,?,?";
sql = "INSERT INTO tbl_endereco ("+colunas+") ""VALUES ("+valores+")";
try{
con.conectar();
PreparedStatement ps = con.connection.prepareStatement(sql);
ps.setInt ( 1 , mod.getId());
ps.setInt ( 2 , mod.getFk_logradouro().getId()); //Pegando o Id do ModeloLogradouro
ps.setString( 3 , mod.getEndereco());
ps.setString( 4 , mod.getNumero());
ps.setString( 5 , mod.getComplemento());
ps.setString( 6 , mod.getBairro());
ps.setString( 7 , mod.getCep());
ps.setInt ( 8 , mod.getFk_pais().getId()); //Pegando o ID do ModeloPais
ps.setInt ( 9 , mod.getFk_estado().getId()); // Pegando o ID do ModeloEstado
ps.setString(10 , mod.getCidade().getId()); //Pegando o ID do ModeloCidade
ps.execute();
ps.close();
con.desconectar();
JOptionPane.showMessageDialog(null , "Endereço cadastrado com sucesso!");
}catch(SQLException e){
con.desconectar();
JOptionPane.showMessageDialog(null , "Erro ao cadastrar Endereço: " + e);
}
}
Agora vem o problema… Essas informações de Logradouro, País, Estado e Cidade vêm de ComboBox, carregadas normalmente através de listas. Porém preciso pegar o ID delas para passar como FK para o DAO. Vamos pegar o logradouro:
-
Fiz a consulta direto no Controller, na ação do botão (que não acho que seja o correto) para pegar o id e setar no setId() do ModeloLogradouro. Fiz direto no Controller pq preciso do valor da ComboBox como paramentro de comparação conforme abaixo:
public void salvarRegistro(){ ModeloEndereco modEndereco = new ModeloEndereco(); modEndereco.setId(Integer.parseInt(txtId.getText())); modEndereco.setEndereco(txtEndereco.getText()); modEndereco.setNumero(txtNumero.getText()); modEndereco.setComplemento(txtComplemento.getText()); modEndereco.setBairro(txtBairro.getText()); modEndereco.setCep(txtCep.getText()); try{ con.conectar(); con.executaSQL("SELECT id , logradouro" + "FROM tbl_endereco_logradouro " + "WHERE logradouro = '"+cbLogradouro.getSelectionModel().getSelectedItem().toString()+"'"); con.resultSet.first(); ModeloLogradouro modLogradouro = new ModeloLogradouro(); modLogradouro.setId(con.resultSet.getInt("indexador"));//seta o resultado no setId() do ModeloLogradouro modEndereco.setFk_logradouro(modLogradouro);// Passa o resultado para o ModeloEndereco con.desconectar(); }catch(SQLException e){ con.desconectar(); JOptionPane.showMessageDialog(null, e ); } daoEndereco.inserirRegistro(modEndereco); }
Primeira dúvida - Como fazer essa consulta para pegar o int da Combobox direto no DAO pegando o valor da ComboBox no Controller como parametro WHERE para consulta?
Segunda dúvida - Essa passagem de valores do setId() do ModeloLogradouro para o setFk_logradouro() do ModeloEndereco está correta?
Espero ter me expressado corretamente e feito entender minhas dúvidas.
Desde já agradeço a todos que opinarem