2

我正在开发一个处理商店客户管理的 java swing 应用程序。我正在尝试基于 mvc 模式构建它,但实际上我对它有点缺乏经验。

基本上,有一个带有一些用于创建客户的文本字段的视图,当然还有一个名为 Customer 的类。如果提交了表单,则会创建一个 Customer 对象并将其保存到数据库中。现在,我的问题是设置一个视图来显示 JTable 中的所有客户。实际上,问题不是视图本身,而是在添加新客户或更改客户时刷新视图。因此,我创建了一个名为“Customers”的新类,其中包含一个包含所有客户的数组列表,并且每次创建客户时,它都会添加到该数组列表中。

当我的应用程序的大型机启动时,创建了一个“客户”对象,从我的数据库中获取所有客户,并将其放入仅用于 jtable 的数组列表中。jtable 作为监听器添加到客户对象中,并实现了一个名为 CustomerListener 的接口,该接口在每次客户数组列表更改时设置一个新模型。

嗯,好吧,现在我真的很难解释我的问题是什么,但是,基本上我认为这个类“客户”是多余的,所以我只是将数组列表和东西添加到我的“普通”“客户”类中:

package v1a;

import java.sql.ResultSet;
import java.util.ArrayList;

public class Customer {

    public static final String KUNDENNUMMER = "Kundennummer";
    public static final String ANREDE = "Anrede";
    public static final String NACHNAME = "Nachname";
    public static final String VORNAME = "Vorname";
    public static final String PLZ = "PLZ";
    public static final String ORT = "Ort";
    public static final String STRASSE = "Strasse";
    public static final String LAND = "Land";
    public static final String TELEFON = "Telefon";
    public static final String MOBIL = "Mobil";
    public static final String EMAIL = "Email";

    public static final String[] CUSTOMER_FIELDS = { KUNDENNUMMER, ANREDE, NACHNAME, VORNAME, PLZ, ORT, STRASSE, LAND, TELEFON, MOBIL, EMAIL };

    private String kn, anrede, nachname, vorname, plz, ort, strasse, land, telefon, mobil = "", email = "";

    private ArrayList<Customer> customers = new ArrayList<Customer>();
    private ArrayList<ICustomerModelListener> listeners = new ArrayList<ICustomerModelListener>();

    public Customer() {
        getAllFromDatabase();
    }   

    public Customer(String[] str) {
        this.kn = str[0];
        this.anrede = str[1];
        this.nachname = str[2];
        this.vorname = str[3];
        this.plz = str[4];
        this.ort = str[5];
        this.strasse = str[6];
        this.land = str[7];
        this.telefon = str[8];
        this.mobil = str[9];
        this.email = str[10];
    }

    public void getAllFromDatabase(){
        SQL.getInstance();
        ArrayList<Customer> arrlist = new ArrayList<Customer>();    
        ResultSet rs = SQL.select("SELECT kundennummer, anrede, name, vorname, strasse, plz, ort, land, telefon, mobil, email FROM kunden");
        try {
            while(rs.next()){
                String[] values = new String[Customer.CUSTOMER_FIELDS.length];
                values[0] = String.valueOf(rs.getInt("kundennummer"));
                values[1] = rs.getString("anrede");
                values[2] = rs.getString("name");
                values[3] = rs.getString("vorname");
                values[4] = rs.getString("strasse");
                values[5] = String.valueOf(rs.getInt("plz"));
                values[6] = rs.getString("ort");
                values[7] = rs.getString("land");
                values[8] = rs.getString("telefon");
                values[9] = rs.getString("mobil");
                values[10] = rs.getString("email");
                Customer c = new Customer(values);
                arrlist.add(c);
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }  
        SQL.cleanup();
        this.customers = arrlist;
        for(ICustomerModelListener l : listeners){
            l.CustomerChanged();
        }
    }

    public ArrayList<Customer> getAll(){
        return customers;
    }

    public void addCustomer(Customer customer){
        customers.add(customer);
        for(ICustomerModelListener l : listeners){
            l.CustomerChanged();
        }
    }

    public void addListener(ICustomerModelListener listener){
        listeners.add(listener);
    }

    public static boolean knExists(int kn){
        boolean bool = false;
        SQL.getInstance();
        ResultSet rs = SQL.select("SELECT kundennummer FROM kunden WHERE kundennummer = "+kn);
        try {
            while(rs.next()){
                bool = true;
            }
        } catch (Exception e){
            System.out.println(e.getMessage());
        }
        SQL.cleanup();
        return bool;
    }

    public static int getFreeKn(){
        SQL.getInstance();
        ResultSet rs = SQL.select("SELECT kundennummer FROM kunden ORDER BY kundennummer DESC LIMIT 1");
        int kn = 0;
        try {
            while(rs.next()){
                kn = rs.getInt("kundennummer");
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }  
        kn++;
        SQL.cleanup();
        return kn;
    }

     public static Customer getByKn(int kn){
        if(knExists(kn)){
            SQL.getInstance();
            ResultSet rs = SQL.select("SELECT * FROM kunden WHERE kundennummer = "+kn);

            String[] values = new String[CUSTOMER_FIELDS.length];
            try {
                while(rs.next()){
                    values[0] = String.valueOf(rs.getInt("kundennummer"));
                    values[1] = rs.getString("anrede");
                    values[2] = rs.getString("name");
                    values[3] = rs.getString("vorname");
                    values[4] = String.valueOf(rs.getInt("plz"));
                    values[5] = rs.getString("ort");
                    values[6] = rs.getString("strasse");
                    values[7] = rs.getString("land");
                    values[8] = rs.getString("telefon");
                    values[9] = rs.getString("mobil");
                    values[10] = rs.getString("email");
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }  
            Customer customer = new Customer(values);
            SQL.cleanup();
            return customer;
        } else {
            return null;
        }
    }

     public boolean save() {
        SQL.getInstance();
        boolean bool = SQL.saveUser(this.kn, this.anrede, this.nachname, this.vorname, this.plz, this.ort, this.strasse, this.land, this.telefon, this.mobil, this.email);
        SQL.cleanup();
        return bool;
    }

     public String getValue(String s){
        switch (s){
        case KUNDENNUMMER:
            return this.kn;
        case ANREDE:
            return this.anrede;
        case NACHNAME:
            return this.nachname;
        case VORNAME:
            return this.vorname;
        case PLZ:
            return this.plz;
        case ORT:
            return this.ort;
        case STRASSE:
            return this.strasse;
        case LAND:
            return this.land;
        case TELEFON:
            return this.telefon;
        case MOBIL:
            return this.mobil;
        case EMAIL:
            return this.email;
        default :
            return "";
        }
    }
}

现在我的问题是:这是对有关 mvc 模式的此类进行建模的正确方法吗?也许我的第一个方法是“更清洁”,因为我有一个类似“容器”的东西,里面有所有客户和“真正的”客户类别。

4

2 回答 2

4

目前的方法会让我发疯。您有一个Customer具有 2 个完全不同的行为的类:

  • 使用默认构造函数时,您实际上是将整个数据库的内容存储在内存中(嗯,至少是客户表的内容)。所以在这种情况下,一个Customer实例实际上代表了整个客户列表
  • 当使用带参数的构造函数时,一个Customer对象现在代表一个Customer

简而言之,每当您Customer在代码中遇到实例时,您一无所知。

此外,将整个数据库存储在内存中可能有点矫枉过正(尽管对于有限数量的客户可能可行)。但是,如果您将这种方法用于更多表,您将很快耗尽内存。考虑只检索您实际需要的数据(例如,JTable在同一时间只能看到一定数量的客户,因此无需全部获取)。

然后是业务逻辑与数据库逻辑混合的问题。我建议将您的Customer课程与实际的数据库访问明确分开。您永远不知道将来会切换数据库(或选择与数据库不同的东西)。那时您不想重写整个应用程序,只需要重写数据访问层

于 2012-08-27T16:23:33.277 回答
3

不,客户中不应该有数据库代码,也不应该有,ArrayList<Customer>因为这些应该由其他类处理。它需要是纯粹的,需要简单地封装客户的本质,仅此而已。

你需要重构和细分一些。

于 2012-08-27T16:20:53.037 回答