如何在符合 MVC 的 JTable 中显示来自 SQL 数据库的数据?



所以,我正在尝试用数据库中的数据填充JTable。网络上有很多关于这方面的信息,无论是在YouTube上还是在SO上。然而,我的问题是我能找到的所有解决方案都在视图类(swing 应用程序(中编写所有代码,这是我不允许做的事情(学校作业(。

我的问题是我无法根据 MVC 划分代码并且仍然具有它的功能。 我从数据库中获取特定学生的方法是:

public Student getOneSpecificStudent(int studentID) throws SQLException {
Connection con = null;
PreparedStatement stm = null;
try {
con = DatabaseConnection.getConnection();
stm = con.prepareStatement("SELECT * FROM Student WHERE studentID = 
?");
stm.setInt(1, studentID);
ResultSet rs = stm.executeQuery();
Student student = null;
while (rs.next()) {
student = new Student(rs.getInt("studentID"), 
rs.getString("studentSSN"), rs.getString("studentName"), 
rs.getString("studentAddress"), rs.getString("studentPhoneNumber"));
}
return student;
} finally {
DbUtils.close(con);
DbUtils.close(stm);
}
}

我的控制器方法是这样的:

public Student getOneSpecificStudent(int studentID) throws SQLException {
Student student = tmpDAL.getOneSpecificStudent(studentID);
return student;
}

但是我怎么知道在 Jtable 中显示它呢?我以前使用过已经填写过数据的对象 [],但这让我感到困惑。有什么想法吗?

由于 Swing 已经支持 MVC(以迂回的方式(,您应该从TableModel开始包装现有数据。

数据库中的数据已经在Student类中建模,这是一个很好的起点,您现在只需要构建一个环绕它的TableModel。 您应该从查看如何使用表开始

Student的基本概念开始

public interface Student {
public int getID();
public String getSSN();
public String getName();
public String getAddress();
public String getPhoneNumber();
}

然后,我们可以设计一个可用于支持它的TableModel......

public class StudentTableModel extends AbstractTableModel {
protected static final String COLUMN_NAMES[] = {
"ID", "Number", "Name", "Address", "Phone Number"
};
private List<Student> students;
public StudentTableModel(List<Student> students) {
// Prevent possible external mutation
this.students = new ArrayList<>(students);
}
@Override
public int getRowCount() {
return students.size();
}
@Override
public int getColumnCount() {
return COLUMN_NAMES.length;
}
@Override
public String getColumnName(int column) {
return COLUMN_NAMES[column];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
switch (columnIndex) {
case 0: return Integer.class;
default: return String.class;
}
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Student student = students.get(rowIndex);
switch (columnIndex) {
case 0: return student.getID();
case 1: return student.getSSN();
case 2: return student.getName();
case 3: return student.getAddress();
case 4: return student.getPhoneNumber();
}
}
}

这是一个不可变的模型,我将让您弄清楚如何添加可变功能。

因此,在您看来,您将使用控制器来获取一个或多个Student...

Student student = controller.getOneSpecificStudent(1);

然后,您将为学生创建一个模型...

List<Student> students = new ArrayList<>();
students.add(student);
TableModel model = StudentTableModel(students);

然后将其应用于您的视图...

someInstanceOfJTable.setModel(model);

现在。 如果需要,您可以让控制器返回一个StudentTableModel,但我个人认为这超出了控制器的范围,因为它不应该向视图指示显示术语,这不是它的责任。

最新更新