MVC Datenbankabfrage

pappender

Aktives Mitglied
Hallo,

ich habe mal eine Frage zu SQL und MVC.
Wäre es sinnvoll die SQL Statements in das Model auszulagern und mit beispielsweise getStatement() wiederzuholen? Oder gleich auch die Connection?

Java:
        final String hostname = "xxx";
        final String port = "xxx";
        final String dbname = "xxx";
        final String user = "xxx";
        final String password = "xxx";
      
        conn = null;
      
        try {
          
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            String url = "jdbc:mysql://"+hostname+":"+port+"/"+dbname;
            conn = DriverManager.getConnection(url, user, password);
            stmt = conn.createStatement();
          
            String sqlEplan = new String();
            sqlEplan = "" +
            "SELECT ....";
          
            //System.out.println(sqlEplan);
            ResultSet rs = stmt.executeQuery(sqlEplan);
 

Thallius

Top Contributor
Das Model enthält normalerweise keine Programmlogik sondern ist ein reiner Datenträger. Das Laden der Daten sollte der Controller machen. Ich mache mir für Datenbankmodelle meist einen extra Controller den ich dann z.B. PersonLoader nenne und mache dort alle DB Anfragen.

Gruß

Claus
 

byron1778

Aktives Mitglied
Das Model soll nur die Daten enthalten, damit auch gewährleistet ist, dass das MVC Konzept eingehalten wird. Du kannst die SQL Statements in den Controller auslagern oder was noch ginge: baue Dir ein Interface, schreibe dort deine leeren SQL Methoden, die eine Liste oder sonstwas zurückgeben und implementiere sie dann in deinen Controller.
 

JStein52

Top Contributor
Das Model enthält normalerweise keine Programmlogik sondern ist ein reiner Datenträger
Die Ewige Diskussion, ist die Datenbank Teil des Models, d.h. Datenhaltung oder ist sie Teil der Programmlogik ? Das ist nicht so genau festzulegen.Wird die Datenbank z.B. nur benutzt um Daten zu laden und zu speichern könnte man auch argumentieren das gehört zum Model. Ist dagegen ein wesentlicher Teil der Programmlogik auf (komplexen) SQL-Statements aufgebaut würde man wohl sagen das gehört zum Controller.
Es gab auch hier im Forum schon Diskussionen wo durchaus verschiedene Meinungen vertreten wurden, z.B. diese: http://www.java-forum.org/thema/datenbankabfragen-mvc-pattern.170345/
 

Thallius

Top Contributor
Ich wüsste nicht wo die DB queries in das Modell gehören sollten. Das laden und speichern ist auch etwas das der controller macht. Also gehört auch das in den Controller. Wie ich bereits erwähnte mache ich mir dafür eine zwischenschicht aber in dem Moment wo ich die Datenbeschadfung (laden) in das Model Strecke bin ich an die DB gebunden und gerade das will ich ja nicht. Ich möchte ja gerade das Model deshalb trennen, damit ich ohne Probleme meine Datenbank ändern kann, wenn ich zum Beispiel feststelle, dass Sqlite nun doch nicht mehr reicht und ich auf MySQL umsteigen will.

Gruß

Claus
 

Thallius

Top Contributor
Ok, dann änderst du die Datenbank von MySQL zu einer Oracle DB. Da kannste keinen einzigen query übernehmen. Dann ist es vorbei mit deinem Konfig- Datei. Oder die IT entschiedet sich das die DB nicht mehr direkt angesprochen werden darf und du musst dir die Daten jetzt über einen REST Service holen. Oder oder oder.

Das würde in meiner Software keinerlei strukturelle benötigen, nur eine neue Loader Klasse für das Model.

Gruß

Claus
 

pappender

Aktives Mitglied
Das Problem ist nämlich folgendes:

Ich habe eine HauptView, die das Grundfenster aufbaut.
Mit einer Menubar lasse ich dynamisch JPanels austauschen, die jeweils eine eigene UnterView darstellen und das Fenster weiter aufbauen:
Java:
    public void updateMenu(Model model) {
      
        try {
          
            mainFrame.remove(mainPanel);
          
            Class<?> subView = Class.forName(model.getClassName());
            Object o = subView.newInstance();
            Method getMethodIni = subView.getMethod("initialize");
            getMethodIni.invoke(o);
          
            Method getMethodPanel = subView.getMethod("getPanel");
            mainFrame.add((Component) getMethodPanel.invoke(o), BorderLayout.CENTER);
          
            mainFrame.validate();
          
        } catch (ClassNotFoundException | ClassCastException | IllegalAccessException | IllegalArgumentException | SecurityException | InstantiationException | NoSuchMethodException | InvocationTargetException e) {
            JOptionPane.showMessageDialog(null, e, "IDS - Fehler", JOptionPane.ERROR_MESSAGE);
          
        }
      
    }

Die Konstruktoren müssten ja so gestaltet werden: public View(Controller controller) {.

Aber wie kann ich das dann hier im dynamischen Klassenaufruf mit einbauen/getMethod("initialize")?
Java:
            Class<?> subView = Class.forName(model.getClassName());
            Object o = subView.newInstance();
            Method getMethodIni = subView.getMethod("initialize");
            getMethodIni.invoke(o);
 

Thallius

Top Contributor
Naja jeder View hat ja seinen Controller. Und der Controller bestimmt welches View er gerne hätte. Also ist es doch viel logischer den Controller dynamisch aufzubauen und nicht den View.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Datenbankabfrage oder Filesystem Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben