Нам понадобится несколько советов: я хочу добавить и отобразить объекты в ArrayList с помощью jTable, а затем добавить эти записи в базу данных SQL

0

Привет, коллеги-разработчики,

У меня здесь небольшая проблема, я думаю, что знаю, как решить, но я не уверен, что это лучший способ. У меня есть база данных с несколькими таблицами, хотя здесь нас беспокоит только 2 таблицы. Одна таблица - таблица "Кандидат", а другая - таблица "Экзамены". Теперь, когда я хочу добавить кандидата в базу данных, мне нужно заполнить его данные. Стол экзаменов связан с этим, и каждый кандидат сдавал различные экзамены в разное время. Однако запись создается в обеих базах данных всякий раз, когда я нажимаю кнопку "Сохранить", но поскольку таблица "Экзамены" находится в каждом профиле кандидата, всякий раз, когда пользователь добавляет запись экзамена для конкретного ученика, он не отображается.

Теперь мое решение состоит в том, чтобы добавить любые записи экзамена в ArrayList, а затем показать результаты в jTable, и после нажатия "Сохранить" все эти записи будут добавлены в базу данных. Я не знаю, является ли это идеальным способом сделать это, но я открыт для предложений о том, как еще я могу это сделать. Обратите внимание, что для таблицы экзаменов я ДОЛЖЕН иметь Candidate_id, который не будет существовать, если запись не создана, нажав "Сохранить". Поэтому в этом случае я бы создал запись студента, а затем добавил все его экзамены из ArrayList в базу данных (так как теперь у меня есть Candidate_id, который является моим внешним ключом).

Хорошо, вот эта функциональность кнопки "Сохранить":

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 и добавить их в базу данных после "Сохранить "нажата кнопка" Правильно? "Вот метод, который я вызывал ранее с моим объектом 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);
    }   
}

Если у вас есть какие-либо вопросы по поводу большего количества кода, просто скажите, но проблема здесь снова, прежде всего, как создать иллюзию добавления пользователем в базу данных, но записи добавляются только ими, нажимая одну кнопку " Сохранить".

Теги:
arraylist
jtable

1 ответ

0

Чтобы улучшить работу пользователей, привязка данных/операции в ваших таблицах должна быть плавной и должна выполняться с минимальным количеством пользователей. Не используйте кнопку сохранения, но сохраняйте данные, как только строка теряет фокус. Для этого вам понадобится стандартный MVC-проект, в котором строка таблицы представляет собой запись представления, ячейки - это поля представления, а модель предоставляет уровень сохранения или объект для данных. Между ними контроллер управляет соединением между ними. Ключом к ее бесшовному общению является связь между этими элементами.

Используйте события Swing для захвата изменений пользовательского интерфейса и обеспечения связи. См. " Как использовать таблицы" для примеров и идей. Используя эти идеи, вы можете увидеть, как пользователь может меняться в одной таблице, запускаемой как событие, можно прослушать/поймать и использовать для обновления данных во второй таблице. Вы также можете увидеть, как "сохранить" данные в строке обратно в базу данных, когда изменяется выбор строки, или строка/таблица теряет фокус.

  • 0
    У меня есть проблема с кодом, и я хочу убедиться, что мой проект работает, прежде чем он станет постоянным. Строки не отображаются в таблице (я добавил объект в LIST, затем сделал System.out.print и работал). Список возвращается, и он печатает объекты, когда я проверяю его в цикле FOR в addRolltoTable (), поэтому я предполагаю, что в этом методе есть какая-то проблема. Возможно, я что-то упустил.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню