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

6 respostas
F

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.

6 Respostas

P

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”

F

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.

T

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);
    }
}`
F

Olá thimor,

Muito obrigada, vou fazer aqui e posto o resultado.

F

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

“Fernanda2015:

Olá thimor,

Muito obrigada, vou fazer aqui e posto o resultado.

F

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.

Criado 23 de novembro de 2016
Ultima resposta 5 de dez. de 2016
Respostas 6
Participantes 3