Java 如何在遵循MVC的JTable中显示SQL数据库中的数据?

Java 如何在遵循MVC的JTable中显示SQL数据库中的数据?,java,swing,jtable,Java,Swing,Jtable,因此,我试图用数据库中的数据填充JTable。网上有很多关于这方面的信息,包括youtube和这里等等。然而,我的问题是,我能找到的所有解决方案都是在视图类(swing应用程序)中编写所有代码,这是我不允许做的事情(学校作业) 我的问题是,我不能按照MVC划分代码,并且仍然拥有它的功能。我从数据库中获取特定学生的方法如下: public Student getOneSpecificStudent(int studentID) throws SQLException { Connecti

因此,我试图用数据库中的数据填充JTable。网上有很多关于这方面的信息,包括youtube和这里等等。然而,我的问题是,我能找到的所有解决方案都是在视图类(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(以一种迂回的方式),那么您应该从一个开始,将现有的数据打包到其中

数据库中的数据已经在
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);