Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como atualizar dados alterados no banco de dados usando JTable?


Esta é uma pergunta aberta.

Para mim, você tem algumas opções...

Você poderia...


Atualize o banco de dados em tempo real à medida que os dados são alterados na tabela.

Isso exigiria que você estendesse o TableModel então você tem acesso ao setValue método, que permitiria não apenas atualizar o estado do modelo, mas também atualizar o estado do banco de dados (eu atualizaria o banco de dados e, quando bem-sucedido, atualizaria o modelo, mas sou eu) OU anexar um ouvinte ao modelo e monitore para TableChanged apropriado eventos e atualize o banco de dados de acordo.

Embora isso pareça um bom método, você corre o risco de "pendurar" a interface do usuário enquanto o banco de dados é atualizado ou ficar fora de sincronia com o que está no modelo e o que está no banco de dados...

Você poderia...


Crie uma Class que representa os dados do banco de dados. Quando um valor é alterado dentro desse objeto, você simplesmente levanta um sinalizador informando que a linha foi alterada.

Quando o usuário terminar de fazer as alterações nos dados da tabela, ele clicará em "salvar". Você então percorreria todos os objetos e determinaria quais precisam ser atualizados e os "salvaria" de volta ao banco de dados.

Isso tem o potencial de permitir que dados "antigos" sejam gravados de volta no banco de dados (ou seja, o usuário A carrega os dados e começa a fazer alterações. O usuário B, enquanto isso, carrega os dados, faz alterações e os salva de volta no banco de dados. O usuário A salva suas alterações, substituindo algumas das alterações que o usuário B já confirmou)

Existem abordagens para resolver ambos, mas você precisa decidir qual abordagem melhor se adapta ao seu problema atual, atualizações em tempo real ou atrasadas...

Atualizado com exemplo básico

A primeira coisa a fazer é começar criando uma classe que representa os dados do seu banco de dados. Normalmente, eu começaria com uma Interface e usar algum tipo de fábrica para gerar a implementação real, mas pequenos passos...

Isso tem uma variável muito importante, hasChanged . Isso é usado para sinalizar que o objeto precisa ser atualizado ...
public class Person {

    private boolean hasChanged = false;

    private String firstName;
    private String lastName;

    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public boolean hasChanged() {
        return hasChanged;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setFirstName(String value) {
        if (value == null ? firstName != null : !value.equals(firstName)) {
            firstName = value;
            hasChanged = true;
        }
    }

    public void setLastName(String value) {
        if (value == null ? lastName != null : !value.equals(lastName)) {
            lastName = value;
            hasChanged = true;
        }
    }
}

Em seguida, construímos um modelo de tabela capaz de modelar uma lista de objetos...
public class PeopleTableModel extends AbstractTableModel {

    private List<Person> people;

    public PeopleTableModel() {
        people = new ArrayList<>(20);
    }

    public void addPerson(Person person) {
        people.add(person);
        fireTableRowsInserted(people.size() - 1, people.size() - 1);
    }

    public Person getPersonAt(int row) {
        return people.get(row);
    }

    public List<Person> getChangedPeople() {
        List<Person> changed = new ArrayList<>(people.size());

        for (Person p : people) {
            if (p.hasChanged()) {
                changed.add(p);
            }
        }

        return changed;    
    }

    @Override
    public int getRowCount() {
        return people.size();
    }

    @Override
    public String getColumnName(int column) {
        String name = null;
        switch (column) {
            case 0:
                name = "First name";
                break;
            case 1:
                name = "First name";
                break;
        }
        return name;
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Person p = people.get(rowIndex);
        Object value = null;
        switch (columnIndex) {
            case 0:
                value = p.getFirstName();
                break;
            case 1:
                value = p.getLastName();
                break;
        }
        return value;
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        if (aValue instanceof String) {
            Person p = people.get(rowIndex);
            switch (columnIndex) {
                case 0:
                    p.setFirstName(aValue.toString());
                    break;
                case 1:
                    p.setLastName(aValue.toString());
                    break;
            }
            fireTableRowsUpdated(rowIndex, rowIndex);
        }
    }
}

Existem várias maneiras de conseguir a mesma coisa, mas basicamente aqui eu forneci o método chamado getChangedPeople que retornará todas as People que mudaram. Em seguida, você simplesmente percorreria essa lista e chamaria a instrução de atualização de banco de dados apropriada.