Java 如何在遵循MVC的JTable中显示SQL数据库中的数据?
因此,我试图用数据库中的数据填充JTable。网上有很多关于这方面的信息,包括youtube和这里等等。然而,我的问题是,我能找到的所有解决方案都是在视图类(swing应用程序)中编写所有代码,这是我不允许做的事情(学校作业) 我的问题是,我不能按照MVC划分代码,并且仍然拥有它的功能。我从数据库中获取特定学生的方法如下:Java 如何在遵循MVC的JTable中显示SQL数据库中的数据?,java,swing,jtable,Java,Swing,Jtable,因此,我试图用数据库中的数据填充JTable。网上有很多关于这方面的信息,包括youtube和这里等等。然而,我的问题是,我能找到的所有解决方案都是在视图类(swing应用程序)中编写所有代码,这是我不允许做的事情(学校作业) 我的问题是,我不能按照MVC划分代码,并且仍然拥有它的功能。我从数据库中获取特定学生的方法如下: public Student getOneSpecificStudent(int studentID) throws SQLException { Connecti
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(以一种迂回的方式),那么您应该从一个开始,将现有的数据打包到其中 数据库中的数据已经在
Student
类中建模,这是一个很好的起点,您现在只需构建一个围绕它的TableModel
。你应该先看看
从学生的基本概念开始
public interface Student {
public int getID();
public String getSSN();
public String getName();
public String getAddress();
public String getPhoneNumber();
}
然后我们可以设计一个表格模型
,用于支持它
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();
}
}
}
然后为学生创建一个模型
List<Student> students = new ArrayList<>();
students.add(student);
TableModel model = StudentTableModel(students);
现在。如果需要,您可以让控制器返回
StudentTableModel
,但我个人认为这超出了控制器的范围,因为它不应该向视图口述显示术语,这不是它的责任。我还建议您研究一种更好的数据库资源管理方法。请参阅一个关于如何为给定对象创建自定义TableModel的分步示例。谢谢您的回答,它很有帮助。但是,当我尝试为学生创建模型时,确切地说“TableModel model=StudentTableModel(students):“我得到”类型new ActionListener()的方法StudentTableModel(List)是未定义的({}”为什么?听起来好像你想把ActionListener
的实例传递给StudentTableModel
而不是List
List<Student> students = new ArrayList<>();
students.add(student);
TableModel model = StudentTableModel(students);
someInstanceOfJTable.setModel(model);