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

时间:2018-10-01 22:20:05

标签: java swing jtable

因此,我试图用数据库中的数据填充JTable。 youtube和SO上都有很多关于此的信息。但是我的问题是,我能找到的所有解决方案都在View Class(s​​wing应用程序)视图中编写所有代码,这是我不允许做的事情(学校作业)。

我的问题是我无法根据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);
    }
}

和我的Controller方法是这样的:

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

}

但是我怎么知道在Jtable中显示呢?我之前使用的Object []已经填充了数据,但是这让我很困惑。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

由于Swing已经支持MVC(以一种绕行方式),因此您应该以TableModel开头来包装现有数据。

来自数据库的数据已经在Student类中建模了,这是一个很好的起点,您现在只需要构建一个TableModel并将其包装即可。您应该先查看How to Use Tables

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,但是我个人认为这超出了控制器的范围,因为它不应该为视图指定显示术语,这不是责任。