gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:17:38 25 4
gpt4 key购买 nike

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

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

当我的应用程序的大型机启动时,创建了一个“Customers”对象,从我的数据库中获取所有客户,将其放入 jtable 的数组列表中。jtable 作为监听器添加到客户的对象中,并实现了一个名为 CustomerListener 的接口(interface),每当客户的数组列表发生变化时,它都会设置一个新模型。

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

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 个完全不同的行为的 Customer 类:

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

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

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

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

关于java - 在 Java 中为数据库应用程序建模客户类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12145649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com