2

こんにちはスタックオーバーフローのユーザー。

いくつか質問したいと思います。

現在、データベースからデータを取得して JTable に表示できます。さらに、JTable で変更されたデータベースのデータを更新したいのですが、その方法がわかりません。他の人がやったことの例をいくつか見つけましたが、私にはうまくいきませんでした。

だから私の質問はこれです: データベースからデータを取得して保存する方法は重要ですか?? 現在、文字列の配列を使用しています

public String getDBUnits  [][]; 

データベースからデータを保存して渡し、配列をベクターに変換して、

table.setModel(new DefaultTableModel(getDBGrades,gradeHeader));

私のJTableのために。

私はそれを行うために使用できるさまざまな方法について知っていますが、どちらが自分の状況に役立つのかわかりません。

アドバイスやチュートリアルをいただければ幸いです。

ありがとう。

ダッキー:)

PSデータベースからデータを取得するために使用するメソッドのコードが必要な場合は、喜んで投稿します。

4

1 に答える 1

4

これは自由回答形式の質問です。

私には、いくつかのオプションがあります...

あなたは出来る...

テーブル内のデータが変更されると、リアルタイムでデータベースを更新します。

TableModelこれには、メソッドにアクセスできるように拡張する必要があります。これsetValueにより、モデルの状態を更新するだけでなく、データベースの状態も更新できます (データベースを更新し、成功したら更新します)。モデル、しかしそれは私です) またはモデルにリスナーをアタッチし、適切なTableChangedイベントを監視し、それに応じてデータベースを更新します。

これは良い方法のように見えますが、データベースの更新中に UI が「ハング」したり、モデルの内容やデータベースの内容と同期しなくなったりするリスクがあります...

あなたは出来る...

Classデータベースからのデータを表す を作成します。このオブジェクト内で値が変更された場合、行が変更されたことを示すフラグを立てるだけです。

ユーザーがテーブル データの変更を終了したら、[保存] をクリックします。次に、すべてのオブジェクトを調べて、更新する必要があるオブジェクトを特定し、それらをデータベースに「保存」します。

これにより、「古い」データがデータベースに書き戻される可能性があります (つまり、ユーザー A がデータをロードして変更を開始します。その間にユーザー B がデータをロードし、変更を加えてデータベースに保存し直します)。次に、ユーザー A は変更を保存し、ユーザー B が既にコミットした変更の一部を上書きします)

両方を解決するためのアプローチがありますが、現在の問題、リアルタイムまたは遅延更新のどちらのアプローチが最も適しているかを決定する必要があります...

基本的な例で更新

最初に、データベースのデータを表すクラスを作成することから始めます。通常、私は a から始めてInterface、実際の実装を生成するためにある種のファクトリを使用しますが、小さなステップ...

これには 1 つの非常に重要な変数がありhasChangedます。これは、オブジェクトを更新する必要があることを示すために使用されます...

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

次に、オブジェクトのリストをモデル化できるテーブル モデルを構築しました...

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

同じことを達成する方法はいくつもありますが、基本的にここでは、変更されgetChangedPeopleたすべての を返すメソッドを提供しましPeopleた。次に、このリストをループして、適切なデータベース更新ステートメントを呼び出すだけです。

于 2013-05-03T04:45:19.437 に答える