Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để cập nhật dữ liệu đã thay đổi vào Cơ sở dữ liệu bằng cách sử dụng JTable?

Đây là một câu hỏi kết thúc mở.

Đối với tôi, bạn có một vài lựa chọn ...

Bạn có thể ...

Cập nhật cơ sở dữ liệu theo thời gian thực khi dữ liệu được thay đổi trong bảng.

Điều này sẽ yêu cầu bạn mở rộng TableModel vì vậy bạn có quyền truy cập vào setValue phương thức này cho phép bạn không chỉ cập nhật trạng thái của mô hình mà còn cập nhật trạng thái của cơ sở dữ liệu (tôi sẽ cập nhật cơ sở dữ liệu và khi thành công, hãy cập nhật mô hình, nhưng đó là tôi) HOẶC đính kèm một trình nghe vào mô hình và giám sát TableChanged phê duyệt sự kiện và cập nhật cơ sở dữ liệu cho phù hợp.

Mặc dù đây có vẻ là một phương pháp hay, nhưng bạn có nguy cơ "treo" giao diện người dùng trong khi cơ sở dữ liệu được cập nhật hoặc không đồng bộ với những gì trong mô hình và những gì trong cơ sở dữ liệu ...

Bạn có thể ...

Tạo một Class đại diện cho dữ liệu từ cơ sở dữ liệu. Khi một giá trị được thay đổi trong đối tượng này, bạn chỉ cần giơ cờ cho biết rằng hàng đã thay đổi.

Khi người dùng thực hiện xong các thay đổi đối với dữ liệu bảng, họ sẽ nhấp vào "lưu". Sau đó, bạn sẽ xem qua tất cả các đối tượng và xác định đối tượng nào cần được cập nhật và "lưu" chúng trở lại cơ sở dữ liệu.

Điều này có khả năng cho phép dữ liệu "cũ" được ghi trở lại cơ sở dữ liệu (tức là Người dùng A tải dữ liệu và bắt đầu thực hiện thay đổi. Người dùng B trong thời gian chờ đợi sẽ tải dữ liệu, thực hiện thay đổi và lưu dữ liệu trở lại cơ sở dữ liệu. Sau đó, Người dùng A lưu các thay đổi của họ, ghi đè một số thay đổi Người dùng B đã cam kết)

Có những cách tiếp cận để giải quyết cả hai, nhưng bạn cần phải quyết định cách tiếp cận nào phù hợp nhất với vấn đề hiện tại của bạn, cập nhật theo thời gian thực hoặc bị trì hoãn ...

Đã cập nhật với ví dụ cơ bản

Điều đầu tiên cần làm là bắt đầu bằng cách tạo một lớp đại diện cho dữ liệu từ cơ sở dữ liệu của bạn. Thông thường, tôi sẽ bắt đầu với Interface và sử dụng một số loại nhà máy để tạo ra triển khai thực tế, nhưng các bước nhỏ ...

Điều này có một biến rất quan trọng, hasChanged . Điều này được sử dụng để gắn cờ đối tượng cần được cập nhật ...

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

Tiếp theo, chúng tôi xây dựng một mô hình bảng có khả năng mô hình hóa danh sách các đối tượng ...

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

Có bất kỳ cách nào để đạt được điều tương tự, nhưng về cơ bản ở đây tôi đã cung cấp phương pháp có tên là getChangedPeople sẽ trả về tất cả People điều đó đã thay đổi. Sau đó, bạn chỉ cần lặp qua danh sách này và gọi câu lệnh cập nhật cơ sở dữ liệu thích hợp.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lỗi với PreparedStatement

  2. SELECT / GROUP BY - chuỗi giá trị

  3. Mảng PHP / MySQL cần trợ giúp

  4. Công cụ tốt để trực quan hóa lược đồ cơ sở dữ liệu?

  5. Đếm xem người dùng đã đạt đến giới hạn borrwing hay chưa