需要一些建议:我想使用jTable在ArrayList中添加和显示对象,然后将这些记录添加到SQL数据库

时间:2017-12-12 13:46:39

标签: java mysql arraylist jtable

你好开发人员,

我在这里有一个小问题,我想我知道如何解决,但我不确定这是否是最好的解决方法。 我有一个包含几个表的数据库,尽管我们只关注这里的2个表。一张桌子是"候选人"桌子和另一个是"考试"表。现在,每当我想在数据库中添加候选者时,我需要填写他的详细信息。考试表与之相关联,每位考生都在不同时间参加了不同的考试。但是,只要我点击" Save"就会在两个数据库中创建记录。按钮,但由于考试表位于每个候选人资料中,每当用户为特定学生添加考试条目时,它都不会显示。

现在我的解决方案是将任何考试记录添加到ArrayList中,然后在jTable中显示结果,然后在" Save"单击,所有这些记录将添加到数据库中。我不知道这是否是完美的方式,但我愿意接受如何做到这一点的建议。请注意,对于考试表,我必须有Candidate_id,如果没有通过按" Save"创建记录,则该Candidate_id将不存在。所以在这种情况下,我会创建学生记录,然后将他在ArrayList中的所有考试添加到数据库中(因为我现在有一个Candidate_id,这是我的外键)。

好的就是这个" Save"按钮功能:

private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {
    mrdb.addCandidatesRecord ("Candidates",txtFName.getText(), 
    txtMName.getText(),
    txtLName.getText(),Integer.parseInt(txtAge.getText(),10), 
    Integer.parseInt(txtGrade.getText(), 10));
    mrdb.addExamRecord("Exams", txtExam.getText(), 
    Integer.parseInt(ExamNumber.getText(),10), txtDateTime.getText());
}

无论如何,你可以看到我有一个" mrdb"的对象。这是我用来管理与mySQL数据库有关的所有内容的类,但我的问题不是数据库,而是前端"。所以这对我来说是令人困惑的。如何仅使用ArrayList并在jTable中显示记录?所以我已经开始编写这段代码,而这正是我上面显示的代码块下面的GUI类中的代码。

private class examinations{
    private int id;
    private int candidate_id;
    private String date;
    private String exam;
    private String examNumber;

    public examinations(int id, int student_id, String date, String exam, String examNumber) {
        this.id = id;
        this.student_id = student_id;
        this.date = date;
        this.exam= exam;
        this.examNumber= examNumber;
    }

    public ArrayList ListExams(){
        ArrayList<exams> list = new ArrayList<exams>();

        return list;
    }

    public void addRollToTable(){
        DefaultTableModel model = (DefaultTableModel)tableExams.getModel();
        ArrayList<exams> list = ListExams();
        Object rowData[] = new Object[5];
        for(int i = 0; i < list.size(); i++) {
            rowData[0] = list.get(i).id;
            rowData[1] = list.get(i).student_id;
            rowData[2] = list.get(i).date;
            rowData[3] = list.get(i).exam;
            rowData[4] = list.get(i).examNumber;

            model.addRow(rowData);
        }
    }
}

不幸的是,正如您所看到的,此处的数组并非真正动态。它是一系列的对象,但我只能提供有限的数量(所以我必须假设每个候选人,学校应该能够增加x个考试(即所有考试),以及处理开销。还有另一种方法可以更动态地执行此操作吗? 我想,一旦添加了这些,那么我所要做的就是将所有这些对象从数组中拉出来,并使用PrepairedStatement并在数据库中将它们添加到&#34; Save&#34;单击按钮,正确吗?这是我之前用mrdb对象调用的方法。

public void addExamRecord(String tableName,String exam,
    String examNumber, String date){
    String sql = "INSERT INTO " + tableName + "(candidate_id, date,"+
                "exam, number_Exam) "+
                "VALUES(?,?,?,?)";
    try{ 
        prepSTMT= conn.prepareStatement(sql);
        prepSTMT.setInt(1, getCandidate_id()); // create the candidate record, in order to get the candidate_id
        prepSTMT.setString(2, exam);
        prepSTMT.setString(3, examNumber);
        prepSTMT.setDate(4, java.sql.Date.valueOf(date));
        prepSTMT.executeUpdate();
    }catch(SQLException e){
        JOptionPane.showMessageDialog(null, e);
    }   
}

如果您对更多代码有任何疑问,请说明,但这里的问题又是,最重要的是,我如何创建用户向数据库添加内容的错觉,但仅通过单击添加记录一键&#34;保存&#34;。

1 个答案:

答案 0 :(得分:0)

为了改善用户体验,表中的数据绑定/操作需要是无缝的,并且应该尽可能少地输入用户。考虑不使用保存按钮,但只要行失去焦点就保存数据。为此,您需要一个标准MVC design,其中表行表示视图记录,单元格是视图字段,模型提供数据的持久层或对象。在两者之间,控制器管理两者之间的连接。使其无缝化的关键是这些元素之间的通信。

使用Swing事件捕获UI更改并提供通信。有关示例和提示,请参阅How To Use Tables。使用这些想法,您可以看到用户如何更改一个表,作为事件触发,可以被侦听/捕获并用于更新第二个表中的数据。您还可以看到当行选择更改或行/表失去焦点时,如何将行中的数据“保存”回数据库。