在java中为数据库应用程序建模客户类

时间:2012-08-27 16:15:42

标签: java mysql swing model-view-controller

我正在研究一个处理商店客户管理的java swing应用程序。 我正在尝试基于mvc模式构建它,但实际上我在某种程度上没有经验。

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

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

好吧,现在我真的有问题解释我的问题但是,基本上我认为这个班级“客户”是多余的,所以我只是将arraylist和东西添加到我的“普通”“客户”类:

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模式建模这样一个类的正确方法吗? 也许我的第一种方法是“更清洁”,因为我有一个像“容器”这样的东西,其中包含所有客户和“真正的”客户类。

2 个答案:

答案 0 :(得分:4)

目前的做法会让我发疯。您有一个Customer类,其中有两个完全不同的行为:

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

简而言之,只要您在代码中遇到Customer实例,就一无所知。

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

然后他们就是将业务逻辑与数据库逻辑混合的问题。我建议将Customer类与实际数据库访问分开。你永远不会知道将来会切换数据库(或选择与数据库不同的东西)。您不想在此时重写整个应用程序,只需要data-access layer

答案 1 :(得分:3)

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

你需要重构和再细分一些。