Como salvar dados em duas tabelas em uma mesma tela. (JAVA)

Olá pessoal, desde já agradeço a atenção de todos.

Estou desenvolvendo uma aplicação em JAVA e no cadastro de um cliente preciso salvar o cliente e o endereço, em uma mesma view.

Minhas tabelas estão construidas desta forma:

TBENDEREÇO

create table TBENDERECO(
endereco_id int primary key auto_increment,
cep varchar(20) not null,
bairro varchar(80) not null,
rua varchar(80) not null,
uf varchar(80) not null,
cidade varchar(80) not null,
complemento varchar(180) not null
);

TBCLIENTE

create table TBCLIENTE(
cliente_id int primary key auto_increment,
nomeCli varchar(50) not null,
telCli varchar(50) not null,
emailCli varchar(50),
endereco_id int not null,

foreign key(endereco_id) references TBENDERECO(endereco_id),
dataCriacao timestamp default current_timestamp
);

Gostaria de saber como posso fazer um insert que atenda as duas tabelas em uma única tela.

Meus inserts estão construidos das seguintes maneiras:

ENDERECO DAO

public boolean addEnd(EnderecoModel em) throws SQLException {
    String SQL = "INSERT INTO TBUSUARIO(CEP, BAIRRO, RUA, UF, CIDADE, COMPLEMENTO) VALUES(?, ?, ?, ?, ?, ?)";

    try {
        ps = connection.prepareStatement(SQL);
        ps.setString(1, em.getCep());
        ps.setString(2, em.getBairro());
        ps.setString(3, em.getRua());
        ps.setString(4, em.getUf());
        ps.setString(5, em.getCidade());
        ps.setString(6, em.getComplemento());

        ps.execute();
        System.out.println("Endereço Salvo Com Sucesso!!!");
        return true;
    } catch (SQLException error) {
        System.out.println("Erro ao inserir: " + error.getMessage());
        return false;
    } finally {
        connection.close();
    }
}

CLIENTE DAO

 public boolean addCli(ClientModel cm) throws SQLException {
    String SQL = "INSERT INTO TBUSUARIO(NOMECLI, TELCLI, EMAILCLI, ENDERECO) VALUES(?, ?, ?, ?)";

    try {
        ps = connection.prepareStatement(SQL);
        ps.setString(1, cm.getNomeCli());
        ps.setString(2, cm.getTelCli());
        ps.setString(3, cm.getEmailCli());
        ps.setInt(4, cm.getEndereco().getEndereco_id());

        ps.execute();
        System.out.println("Cliente Cadastrado Com Sucesso!!!");
        return true;
    } catch (SQLException error) {
        System.out.println("Erro ao Cadastradar: " + error.getMessage());
        return false;
    } finally {
        connection.close();
    }
}

VIEW

FINAL
Qual melhor forma de criar um método que faça o que preciso ? Como criar o mesmo ?

Numa única função, ao clicar no botão, seu método pode dar dois inserts. Faz um, fecha, e faz o outro em sequência.

1 curtida

Olá Fefo80, obrigado pela atenção. Mas como eu poderia capturar o ID do endereço para realizar o cadastro do cliente logo em seguida ?

Sem ORM, com PreparedStatement, fiz como Fefo80 disse. No DAO, primeiro insiro os dados exclusivos da primeira entidade (cliente). Logo após o executeUpdade() resgato o último id gerado e insiro os dados da segunda entidade (endereço). Usando HSQLDB, para resgatar o último Id, que é uma identity (autogen) no meu caso, uso a String:

Sql = “SELECT * FROM TABLE_NAME WHERE ID=(SELECT max(“ID”) FROM TABLE_NAME)”;

1 curtida

Olá @enderson obrigado pela ajuda, poderia postar o seu código para seguir seu exemplo ? se possível, desde já sou grato pela ajuda!!!

Com jdbc, logo após um insert, vc consegue recuperar os ids gerados com statement.getGeneratedKeys():

long id = -1L;

PreparedStatement preparedStatement = connection.prepareStatement(YOUR_SQL_HERE, PreparedStatement.RETURN_GENERATED_KEYS);
preparedStatement.setXXX(index, VALUE);
preparedStatement.executeUpdate();

ResultSet rs = preparedStatement.getGeneratedKeys();

if (rs.next()) {
    id = rs.getLong(1);
}

FONTE: Statement.getGeneratedKeys()

1 curtida

Muito obrigado @Lucas_Camara desta forma funcionou perfeitamente. E aos demais que me ajudaram nessa dúvida, sou grato a o tempo que tiraram para me ajudar. Forte abraço desejo tudo de bom !!!

1 curtida