Inserir dados em duas tabelas no MySql buscando da interface em Java

Olá Galera, tudo bem?

Alguem poderia me ajudar, por favor. Estou com um programa onde criei umas tabelas no mysql e esta da seguinte forma?

Na minha interface java tenho o cadastro de cliente onde tenho os seguintes campos: nome; dataNasc; sexo; estadoCivil; rg;cpf; logradouro; numResidencia; complemento; bairro;cidade;cep; uf; email; telFixo; telCelular;. Eu criei as tabelas ENDERECO, CIDADE E ESTADO.
Agora minha duvida é. Como Faço para pegar os dados como o endereço do cliente e distribuir nas tabelas?

Vou adicionar as tabelas.

CREATE TABLE IF NOT EXISTS `dbfit`.`cliente` (
  `id_cliente` INT(11) NOT NULL AUTO_INCREMENT,
  `cli_nome` VARCHAR(100) NOT NULL,
  `cli_data_nasc` DATE NULL DEFAULT NULL,
  `cli_sexo` ENUM('M', 'F') NULL DEFAULT NULL,
  `cli_estado_Civil` ENUM('Solteiro', 'Casado', 'Separado', 'Divorciado', 'Viuvo', 'Uniao Estavel') NULL DEFAULT NULL,
  `cli_rg` CHAR(9) NULL DEFAULT NULL,
  `cli_cpf` CHAR(11) NULL DEFAULT NULL,
  `endereco_end_id` int(11) NOT NULL,
  `e_mail` varchar(30) NOT NULL,
  `cli_telefone_fixo` varchar(10) NOT NULL,
  `cli_telefone_movel` varchar(11) NOT NULL,
  PRIMARY KEY (`id_cliente`),
  UNIQUE KEY `endereco_end_id`(`endereco_end_id`)
  )DEFAULT CHARACTER SET = utf8; -- configuração de caracteres padrão na tabela

CREATE TABLE IF NOT EXISTS `cidade` (
  `id_cid` int(11) NOT NULL AUTO_INCREMENT,
  `cid_nome` varchar(20) DEFAULT NULL,
  `estado_est_id` int(11) NOT NULL,
  PRIMARY KEY (`id_cid`),
  UNIQUE KEY `estado_est_id` (`estado_est_id`)
) DEFAULT CHARACTER SET = utf8;

CREATE TABLE IF NOT EXISTS `endereco` (
  `id_end` int(11) NOT NULL AUTO_INCREMENT,
  `end_bairro` varchar(20) DEFAULT NULL,
  `end_numero` varchar(4) DEFAULT NULL,
  `end_rua` varchar(50) DEFAULT NULL,
  `end_complemento` varchar(50) DEFAULT NULL,
  `cidade_cid_id` int(11) NOT NULL,
  PRIMARY KEY (`id_end`),
  UNIQUE KEY `cidade_cid_id` (`cidade_cid_id`)
) DEFAULT CHARACTER SET = utf8; -- configuração de caracteres padrão na tabela

CREATE TABLE IF NOT EXISTS `estado` (
  `est_id` int(11) NOT NULL AUTO_INCREMENT,
  `est_descricao` varchar(255) DEFAULT NULL,
  `est_sigla` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`est_id`)
) DEFAULT CHARACTER SET = utf8; -- configuração de caracteres padrão na tabela

Comecei a fazer o insert, mas travei por não saber continuar.

public void Cadastrar(Cliente cliente) {
        con.Connection();
        try {

            PreparedStatement pst = con.con.prepareStatement("INSERT INTO cliente (cli_nome,cli_data_nasc,cli_sexo,cli_estado_Civil,cli_rg,cli_cpf,endereco_end_id,e_mail,cli_telefone_fixo,cli_telefone_movel) VALUES(?,?,?,?,?,?,?,?,?,?)");
            
            pst.setString(1, cliente.getNome());
            pst.setString(2, cliente.getDataNasc());
            pst.setString(3, cliente.getRg());
            pst.setString(4, cliente.getSexo());
            pst.setString(5, cliente.getCpf());
            pst.setString(6, cliente.getEstadoCivil());
            pst.setString(7, cliente.getLogradouro());
            pst.setString(8, cliente.getCidade());
            pst.setString(9, cliente.getNumResidencia());
            pst.setString(10, cliente.getUf());
            pst.setString(11, cliente.getComplemento());
            pst.setString(12, cliente.getBairro());
            pst.setString(13, cliente.getCep());         
            pst.execute();

            JOptionPane.showMessageDialog(null, " Dados Salvos com Sucesso!");

        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null, " Erro ao Salvar!\n " + ex);
        }
        con.closeConnection();
    }

Desde de já agradeço pela atenção e ajuda de todos.

vc abre uma transaction

salva na primeira tabela

salva na segunda tabela

deu tudo certo? manda um commit

deu algo errado? rollback e manda uma mensagem de erro “deu ruim, tenta de novo”

1 curtida

Olá peczenyj, muito obriga.

Não manjo de banco e por isso estou aqui pesquisando, poderia por gentileza mandar um exemplo?
Não estou entendendo como pego esse campo endereco_end_id que esta na tabela de cliente.

obrigada.

vc já recebe o objeto cliente todo populado. faz o insert do cliente, pega o id gerado, em seguida faz o insert do endereço. tem um exemplo similar aqui. esta básico sem controle de transação. o ideal seria corrigir como o colega ai falou. se houver também soluções que melhorem esse código, eu agradeço as criticas para melhorar.

`
public void salvar(Leilao leilao, List itens) {
Connection conn = Database.getInstance().getConnection();
try {
PreparedStatement psmt = conn.prepareStatement(SQL_INSERT, PreparedStatement.RETURN_GENERATED_KEYS);
psmt.setInt(1, leilao.getLoja().getId());
psmt.setDate(2, new Date(leilao.getDataInicial().getTime()));
psmt.setDate(3, new Date(leilao.getDataFinal().getTime()));
psmt.setString(4, leilao.getSituacao());
psmt.setString(5, leilao.getDescricao());
psmt.execute();
ResultSet rs = psmt.getGeneratedKeys();
while (rs.next()) {
leilao.setId(rs.getInt(1));
}
rs.close();
psmt.close();
conn.close();
salvarItensLeilao(leilao, itens);
} catch (SQLException ex) {
ex.printStackTrace();
}
}

private void salvarItensLeilao(Leilao leilao, List<LeilaoItens> itens) {
    Connection conn = Database.getInstance().getConnection();
    try {
        conn.setAutoCommit(false);
        PreparedStatement psmt = conn.prepareStatement(SQL_INSERT_ITENS);
        for (LeilaoItens item : itens) {
            if (item.getQuantidade().doubleValue() > 0) {
                psmt.setInt(1, leilao.getId());
                psmt.setInt(2, item.getProduto().getId());
                psmt.setBigDecimal(3, item.getQuantidade());
                psmt.setString(4, item.getProduto().getUnidade());
                psmt.setBigDecimal(5, BigDecimal.ONE);
                System.out.println("SALVANDO...\t" + leilao.getId() + "\t"
                        + "ITEM:\t" + item.getProduto().getDescricao()
                        + "QUANTIDADE:\t" + item.getQuantidade());
                psmt.addBatch();
            }
        }
        psmt.executeBatch();
        conn.commit();
        psmt.close();
        conn.close();
    } catch (SQLException ex) {
        ex.printStackTrace();
        Logger.getLogger(LeilaoDao.class.getName()).log(Level.SEVERE, null, ex);
    }
}`
1 curtida

Olá thimor,

Muito obrigada, vou fazer aqui e posto o resultado.

Olá Galera,

Consegui avançar com as dicas acima, porem agora estou com problema na data de nascimento.
Tenho essa variável do tipo string e o campo criado no meu banco foi do tipo Date.
String dataNasc;

segue o erro.
Data Truncation: Data Truncation Incorrect date value 19/07/1985 for column cli_data_nasc at row 1[quote=“Fernanda2015, post:5, topic:339341, full:true”]
Olá thimor,

Muito obrigada, vou fazer aqui e posto o resultado.
[/quote]

Olá Galerinha,

Já estou em uma fase final do meu pequeno projeto, graças a ajuda de vocês.
Agora preciso fazer um relatório para buscar a venda em um determinado mês. O que fiz esta pegando apenas a data de um único dia, que é informado pelo usuário. Como faço para ele calcular mais 30 ou pegar um período. EX: 01/12/2016 ate 31/12/2016?
Vejam minha busca.
preencherTabelaRelatorioVenda("select * from produto_has_venda phv inner join produtos p on" + " phv.produto_id_produto = p.id_prod inner join venda v on phv.venda_id_ven = " + "v.id_ven inner join cliente c on v.cliente_id_cliente = c.id_cliente where data_venda" + " ='"+txtInicio.getText()+"'" );

desde de já agradeço a todos.