我正在研究一个处理商店客户管理的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模式建模这样一个类的正确方法吗? 也许我的第一种方法是“更清洁”,因为我有一个像“容器”这样的东西,其中包含所有客户和“真正的”客户类。
答案 0 :(得分:4)
目前的做法会让我发疯。您有一个Customer
类,其中有两个完全不同的行为:
Customer
实例实际上代表了整个客户列表Customer
对象现在代表一个Customer
简而言之,只要您在代码中遇到Customer
实例,就一无所知。
此外,将整个数据库存储在内存中可能有点过分(尽管可能对有限数量的客户有用)。但是,如果您将此方法用于更多表,则会很快耗尽内存。考虑仅检索您实际需要的数据(例如,在JTable
中,只有一定数量的客户同时可见,因此无需全部获取这些数据。)
然后他们就是将业务逻辑与数据库逻辑混合的问题。我建议将Customer
类与实际数据库访问分开。你永远不会知道将来会切换数据库(或选择与数据库不同的东西)。您不想在此时重写整个应用程序,只需要data-access layer
答案 1 :(得分:3)
不,客户应该没有数据库代码,不应该有ArrayList<Customer>
,因为这些应由其他类处理。它需要是纯粹的,需要简单地封装客户的本质,就是这样。
你需要重构和再细分一些。