sql >> Databasteknik >  >> RDS >> Mysql

Hur uppdaterar man ändrad data till databasen med JTable?

Det här är en öppen fråga.

För mig har du några alternativ...

Du kunde...

Uppdatera databasen i realtid när data ändras i tabellen.

Detta kräver att du antingen utökar TableModel så att du har tillgång till setValue metod, som skulle tillåta dig att inte bara uppdatera modellens status, utan också uppdatera databasens tillstånd (jag skulle uppdatera databasen och när det lyckades uppdatera modellen, men det är jag) ELLER koppla en lyssnare till modellen och övervaka för lämplig TableChanged händelser och uppdatera databasen därefter.

Även om detta ser ut som en trevlig metod, riskerar du att "hänga" gränssnittet medan databasen har uppdaterats eller att bli ur synk med vad som finns i modellen och vad som finns i databasen...

Du kunde...

Skapa en Class som representerar data från databasen. När ett värde ändras inom det här objektet höjer du helt enkelt en flagga som säger att raden har ändrats.

När användaren har gjort ändringar i tabelldata klickar de på "spara". Du skulle sedan gå igenom alla objekt och bestämma vilka som behöver uppdateras och "spara" dem tillbaka till databasen.

Detta har potential att tillåta "inaktuella" data att skrivas tillbaka till databasen (dvs. Användare A laddar data och börjar göra ändringar. Användare B under tiden laddar data, gör ändringar och sparar dem tillbaka till databasen. Användare A sparar sedan sina ändringar och skriver över några av ändringarna som användare B redan har genomfört)

Det finns tillvägagångssätt för att lösa båda, men du måste bestämma dig för vilket tillvägagångssätt du bäst passar ditt nuvarande problem, realtids- eller försenade uppdateringar...

Uppdaterat med grundläggande exempel

Det första du ska göra är att börja med att skapa en klass som representerar data från din databas. Normalt skulle jag börja med ett Interface och använd någon form av fabrik för att generera själva implementeringen, men små steg...

Denna har en mycket viktig variabel, hasChanged . Detta används för att flagga att objektet måste uppdateras...

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

Därefter byggde vi en tabellmodell som kan modellera en lista med objekt...

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

Det finns hur många sätt som helst att uppnå samma sak, men här har jag i princip tillhandahållit en metod som heter getChangedPeople som kommer att returnera alla People som har förändrats. Du skulle då helt enkelt gå igenom den här listan och anropa lämplig databasuppdateringssats.




  1. Mycket enkel AVG() aggregeringsfråga på MySQL-servern tar löjligt lång tid

  2. Kan jag ställa in en filtrerad databasreplikering med stjärnmönster?

  3. Hur man skapar ett underformulär från en tabell i Access 2016

  4. Infoga MyISAM-nyckeln i en INNODB-tabell