Grundsätzliche Fragen zum Aufbau eines komplexeren Programmes

DStrohma

Bekanntes Mitglied
Hi Community,

ich arbeite gerade an einem Programm dass in naher Zukunft eine Bücherverwaltung darstellen soll. Damit ihr eine grobe Vorstellung habt wie das aussehen soll: Screenshot
Zu dem Ganzen hab ich ein paar Fragen im Bezug auf MVC und die Datenbankkommunikation aber erst mal möchte ich etwas mehr auf die Funktionsweise eingehen.

Die Daten (also Buchinformationen) sollen in einer H2 Embedded DB gespeichert werden. Das geht auch schon alles wie ihr seht, ich kann die DB auslesen - mehr aber momentan noch nicht. Die Daten sollen also ausgelesen werden und in einer JTable und in dem "Book Details"-Panel dargestellt werden.

Ich finde die Idee ganz nett dass ich dem Model meiner JTable ein ResultSet gebe und dadurch die Buchdaten darstelle. Das habe ich dann auch so ähnlich gemacht - mit Hilfe folgender Klasse:
Java:
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Vector;

import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class DBUtils {
    public static TableModel resultSetToTableModel(ResultSet rs) {
        try {

            ResultSetMetaData metaData = rs.getMetaData();
            int numberOfColumns = metaData.getColumnCount();
            Vector columnNames = new Vector();

            // Get the column names
            for (int column = 0; column < numberOfColumns; column++) {
                columnNames.addElement(metaData.getColumnLabel(column + 1));
            }

            // Get all rows
            Vector rows = new Vector();

            while (rs.next()) {
                Vector newRow = new Vector();

                for (int i = 1; i <= numberOfColumns; i++) {
                    newRow.addElement(rs.getObject(i));
                }

                rows.addElement(newRow);
            }

            return new DefaultTableModel(rows, columnNames);

        } catch (Exception e) {
            e.printStackTrace();

            return null;
        }
    }
}

In dem Panel der JTable rufe ich dann folgendes auf (Wobei mir die getBooks Methode eben ein ResultSet liefert):
Code:
        TableModel model = DBUtils.resultSetToTableModel(DB.getBooks());

        table = new JTable(model);

Jetzt stellt sich mir die Frage wie ich bei einer Änderung der Buchdaten (soll nur in dem Book-Details-Panel gehen, die Tabelle ist nur für die Darstellung) die Änderungen in die DB schreibe und wie ich dann wieder die Tabelle aktualisiere. Versteht mich bitte nicht falsch, ich weiß im allgemeinen wie ich die Daten in die DB schreiben kann aber wie baue ich mir eine schöne MVC Struktur damit das alles wirklich Sinn ergibt und reibungslos funktioniert? Da habe ich gerade keine Vorstellung 😳

Die JTable ist in einem JPanel, genau so wie die Book-Details und das sollten eigentlich meine Views sein und die DB eigentlich mein Model aber was ist dann eigentlich mein JTable Model? Und wie bekomme ich das Zusammenspiel so hin dass bei einer Änderung alle schön benachrichtigt werden?

Grüße und danke im Voraus,
DS
 

Anhänge

  • pleroma.png
    pleroma.png
    17,1 KB · Aufrufe: 85
Zuletzt bearbeitet:
Die JTable ist in einem JPanel, genau so wie die Book-Details und das sollten eigentlich meine Views sein und die DB eigentlich mein Model aber was ist dann eigentlich mein JTable Model? Und wie bekomme ich das Zusammenspiel so hin dass bei einer Änderung alle schön benachrichtigt werden?
Wenn Du Dich am MCV orientierst, würde ich die DB nicht als Model ansehen. Die Datenbank ist ein Ort zur persitenten Speicherung der Daten. Als Model kannst Du ein TableModel nutzen, dass Du aufgrund der zwei Views u.U. erweitern musst. Oder Definierst eine eigene Modelklasse aus der Du dann ein TableModel und ein Model für die Detailansicht ausleitest.
Das Lesen und Speichern in die Datenbank sollte im oder über den Controller laufen. Also entweder direkt dort Implementieren oder in einer zweiten Klasse auslagern.
 
Danke! Hat mir auf jeden Fall geholfen. Aber eine Frage hätte ich noch: Reicht mir dann eigentlich ein einziges Model? Ich hätte jetzt für die Book-Details ein Model erstellt und für die Library (also das Panel mit der JTable) auch eins.

Und wenn ich das Ganze am Anfang initialisiere, dann rufe ich (nachdem das ganze Setup von MVC vorbei ist) den controller auf mit irgendwas derartigem? "controller.initLibrary" um Daten aus der Datenbank auszulesen und an das Model zu schicken? Ist das ansatzweise richtig?

Grüße,
DS
 
Zuletzt bearbeitet:
Weiss jetzt nicht wie weit sich Library und Detail überschneiden, aber vermutlich sind zwei Models besser. Ist auf jeden Fall nicht verkehrt.

Zur Initialisierung: Der Controller benötigt auf jeden Fall eine Methode um das/die Model(s) mit Werten zu befüllen. Wenn die Models von Anfang an gefüllt sein sollen, muss diese natürlich aufgerufen werden. Bei folgendem ist mir nicht ganz klar was gemeint ist :"nachdem das ganze Setup von MVC vorbei ist".

Die Methode würde ich dann allerdings nicht init... nennen, da es ja eine "set", "fill", "refresh" oder "actualize", usw. Methode ist.
 
Ok, soweit alles klar. Was ich mit MVC Setup meinte, ist:
Code:
		controller = new LibraryController();

		viewLibrary = new LibraryView(controller);
		viewDetails = new DetailsView(controller);

		modelLibrary = new LibraryModel();
		modelDetails = new DetailsModel();

		controller.addView(viewLibrary);
		controller.addView(viewDetails);
		controller.addModel(modelLibrary);
		controller.addModel(modelDetails);

Und danach müsste eben noch etwas aufgerufen werden um die (in meinem Fall) JTable zu füllen.
 
Noch eine Frage zum Verständnis: Wenn die ganze Arbeit im Controller gemacht wird - also z.B. die Abfrage der Daten aus der Datenbank und dann das senden an das Model - wozu genau ist dann noch das Model da? Um die Werte zu speichern? Irgendwie leuchtet mir das noch nicht so richtig ein.

Wenn ich von einem Fall ausgehe in dem keine DB verwendet wird, dann kann ich mir das besser vorstellen, weil ich dann weiß dass die Daten nur im Model existieren und eben aus der Model Klasse geholt werden wenn ich sie brauche aber bei einer DB...
 
Ja das modell gibt an, welche Werte gespeichertwerden und wie diese mit anderen in Beziehung stehen.
 
Du hast ja bereits zwei Modelle und angenommen es kommen noch weitere Funktionalitäten und Daten dazu, z.B. ein Ausleihsystem. Dann hast Du mehrere Modelle, die einen direkten Durchgriff auf die Datenbank. Wenn Du jetzt die Datenanbindung/struktur änderst/erweiterst, müsstest Du sämtliche Modelle anpassen. Wenn Du das Datenbankhandling in eine separate Instanz auslagerst hättest Du eine viel losere Kopplung und höhere Flexibilität (was ja die Intention des MVC ist).
 

Neue Themen


Zurück
Oben