Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara memperbarui data yang diubah ke dalam Database dengan menggunakan JTable?

Ini adalah pertanyaan terbuka.

Bagi saya, Anda memiliki beberapa pilihan...

Anda Bisa...

Perbarui database secara real time saat data diubah di dalam tabel.

Ini akan mengharuskan Anda untuk memperluas TableModel jadi Anda memiliki akses ke setValue metode, yang memungkinkan Anda tidak hanya memperbarui status model, tetapi juga memperbarui status basis data (saya akan memperbarui basis data dan ketika berhasil, memperbarui model, tetapi itu saya) ATAU melampirkan pendengar ke model dan pantau TableChanged yang sesuai acara dan perbarui database yang sesuai.

Meskipun ini terlihat seperti metode yang bagus, Anda berisiko "menggantung" UI saat database diperbarui atau tidak sinkron dengan apa yang ada di model dan apa yang ada di database...

Anda Bisa...

Buat Class yang mewakili data dari database. Saat nilai diubah dalam objek ini, Anda cukup menaikkan bendera yang menyatakan bahwa baris telah berubah.

Ketika pengguna telah selesai melakukan perubahan pada data tabel, mereka akan mengklik "simpan". Anda kemudian akan menelusuri semua objek dan menentukan mana yang perlu diperbarui dan "menyimpan" kembali ke database.

Ini memiliki potensi untuk memungkinkan data "basi" ditulis kembali ke database (yaitu Pengguna A memuat data dan mulai membuat perubahan. Sementara itu, Pengguna B memuat data, membuat perubahan, dan menyimpannya kembali ke database. Pengguna A kemudian menyimpan perubahannya, menimpa beberapa perubahan yang telah dilakukan Pengguna B)

Ada pendekatan untuk menyelesaikan keduanya, tetapi Anda perlu memutuskan pendekatan mana yang paling sesuai dengan masalah Anda saat ini, pembaruan waktu nyata atau tertunda...

Diperbarui dengan contoh dasar

Hal pertama yang harus dilakukan adalah mulai dengan membuat kelas yang mewakili data dari database Anda. Biasanya, saya akan mulai dengan Interface dan menggunakan beberapa jenis pabrik untuk menghasilkan implementasi yang sebenarnya, tetapi langkah-langkah kecil...

Ini memiliki satu variabel yang sangat penting, hasChanged . Ini digunakan untuk menandai objek yang perlu diperbarui...

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

Selanjutnya kita membangun model tabel yang mampu memodelkan daftar objek...

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

Ada beberapa cara untuk mencapai hal yang sama, tetapi pada dasarnya di sini saya telah menyediakan metode yang disebut getChangedPeople yang akan mengembalikan semua People yang telah berubah. Anda kemudian cukup mengulang daftar ini dan memanggil pernyataan pembaruan basis data yang sesuai.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gunakan LIKE %..% dengan nilai bidang di MySQL

  2. MySQL:Akses ditolak untuk pengguna 'test'@'localhost' (menggunakan kata sandi:YA) kecuali pengguna root

  3. mengapa sql dengan 'ada' berjalan lebih lambat daripada 'dalam' menggunakan MySQL

  4. Mengapa saya melihat COLLATION 'xxx' tidak valid untuk CHARACTER SET 'yyy'

  5. Silakan instal adaptor mysql 'gem install activerecord-mysql-adapter'