Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak zaktualizować zmienione dane do Bazy Danych za pomocą JTable?

To jest pytanie otwarte.

Dla mnie masz kilka opcji...

Możesz...

Aktualizuj bazę danych w czasie rzeczywistym w miarę zmiany danych w tabeli.

Wymagałoby to rozszerzenia TableModel więc masz dostęp do setValue metody, która pozwoliłaby nie tylko zaktualizować stan modelu, ale także zaktualizować stan bazy danych (zaktualizowałbym bazę danych i jak się powiedzie, zaktualizuję model, ale to ja) LUB podpiąć słuchacza do modelu i monitoruj odpowiednie TableChanged zdarzenia i odpowiednio zaktualizuj bazę danych.

Chociaż wygląda to na fajną metodę, ryzykujesz „zawieszenie” interfejsu użytkownika, gdy baza danych jest aktualizowana lub brak synchronizacji z tym, co jest w modelu i tym, co jest w bazie danych...

Możesz...

Utwórz Class reprezentujący dane z bazy danych. Kiedy wartość zostanie zmieniona w tym obiekcie, po prostu podniesiesz flagę informującą, że wiersz się zmienił.

Gdy użytkownik zakończy wprowadzanie zmian w danych tabeli, kliknie „zapisz”. Następnie przejdziesz przez wszystkie obiekty i określisz, które z nich wymagają aktualizacji, i „zapiszesz” je z powrotem w bazie danych.

Może to potencjalnie pozwolić na zapisanie „nieaktualnych” danych z powrotem do bazy danych (tj. Użytkownik A ładuje dane i zaczyna wprowadzać zmiany. Użytkownik B w międzyczasie ładuje dane, wprowadza zmiany i zapisuje je z powrotem w bazie danych. Następnie użytkownik A zapisuje swoje zmiany, nadpisując niektóre zmiany, które użytkownik B już zatwierdził)

Istnieją podejścia do rozwiązania obu, ale musisz zdecydować, które podejście najlepiej odpowiada Twojemu bieżącemu problemowi, aktualizacjom w czasie rzeczywistym lub opóźnionym...

Zaktualizowano o podstawowy przykład

Pierwszą rzeczą do zrobienia jest rozpoczęcie od stworzenia klasy, która reprezentuje dane z Twojej bazy danych. Normalnie zacząłbym od Interface i użyj jakiejś fabryki, aby wygenerować rzeczywistą implementację, ale małymi krokami...

Ma jedną bardzo ważną zmienną, hasChanged . Służy do oznaczania, że ​​obiekt wymaga aktualizacji...

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;
        }
    }
}

Następnie zbudowaliśmy model tabeli zdolny do modelowania listy obiektów...

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

Jest wiele sposobów na osiągnięcie tego samego, ale w zasadzie tutaj przedstawiłem metodę o nazwie getChangedPeople co zwróci wszystkie People które się zmieniły. Następnie wystarczy przejść przez tę listę i wywołać odpowiednią instrukcję aktualizacji bazy danych.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql:ŹRÓDŁO błąd 2?

  2. Jak sprawdzić, czy zmienna ma wartość NULL, a następnie ustawić ją za pomocą procedury składowanej MySQL?

  3. Jak wypełnić dziury w polach autoinkrementacji?

  4. Kompatybilność MySQL z MacOS Sierra

  5. budowanie aplikacji opartej na rolach