sql >> Database teknologi >  >> RDS >> Mysql

Hvordan opdaterer man ændrede data til databasen ved hjælp af JTable?

Dette er et åbent spørgsmål.

For mig har du et par muligheder...

Du kunne...

Opdater databasen i realtid, efterhånden som dataene ændres i tabellen.

Dette kræver, at du enten udvider TableModel så du har adgang til setValue metode, som giver dig mulighed for ikke kun at opdatere modellens tilstand, men også opdatere databasens tilstand (jeg ville opdatere databasen, og når det lykkedes, opdatere modellen, men det er mig) ELLER knytte en lytter til modellen og overvåg for passende TableChanged begivenheder og opdatere databasen i overensstemmelse hermed.

Selvom dette ligner en god metode, risikerer du at "hænge" brugergrænsefladen, mens databasen er blevet opdateret eller at komme ud af sync med, hvad der er i modellen og hvad der er i databasen...

Du kunne...

Opret en Class der repræsenterer data fra databasen. Når en værdi er ændret i dette objekt, vil du blot hæve et flag, der angiver, at rækken er ændret.

Når brugeren er færdig med at foretage ændringer i tabeldataene, klikker de på "gem". Du vil derefter gå gennem alle objekterne og bestemme, hvilke der skal opdateres og "gemme" dem tilbage til databasen.

Dette har potentialet til at tillade "gamle" data at blive skrevet tilbage til databasen (dvs. Bruger A indlæser dataene og begynder at foretage ændringer. Bruger B indlæser i mellemtiden dataene, foretager ændringer og gemmer dem tilbage til databasen. Bruger A gemmer derefter deres ændringer og overskriver nogle af de ændringer, som bruger B allerede har foretaget)

Der er tilgange til at løse begge dele, men du skal beslutte, hvilken tilgang du bedst passer til dit nuværende problem, realtids- eller forsinkede opdateringer...

Opdateret med grundlæggende eksempel

Den første ting at gøre er at starte med at oprette en klasse, der repræsenterer dataene fra din database. Normalt ville jeg starte med en Interface og brug en form for fabrik til at generere den faktiske implementering, men små trin...

Dette har en meget vigtig variabel, hasChanged . Dette bruges til at markere, at objektet skal opdateres...

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

Dernæst byggede vi en tabelmodel, der er i stand til at modellere en liste over objekter...

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

Der er et vilkårligt antal måder at opnå det samme på, men grundlæggende her har jeg givet en metode kaldet getChangedPeople som vil returnere alle People der har ændret sig. Du vil derefter blot gå gennem denne liste og kalde den relevante databaseopdateringserklæring.




  1. Alternativ til lead lag-funktion i SQL Server 2008

  2. Django - Operational Error:(1054, ukendt kolonne 'xx' i 'feltliste')

  3. Woocommerce:Brugere kan kun købe et produkt én gang

  4. Ydervalgt kolonneværdi i tilsluttet underforespørgsel?