Привет, коллеги-разработчики,
У меня здесь небольшая проблема, я думаю, что знаю, как решить, но я не уверен, что это лучший способ. У меня есть база данных с несколькими таблицами, хотя здесь нас беспокоит только 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);
}
}
Если у вас есть какие-либо вопросы по поводу большего количества кода, просто скажите, но проблема здесь снова, прежде всего, как создать иллюзию добавления пользователем в базу данных, но записи добавляются только ими, нажимая одну кнопку " Сохранить".
Чтобы улучшить работу пользователей, привязка данных/операции в ваших таблицах должна быть плавной и должна выполняться с минимальным количеством пользователей. Не используйте кнопку сохранения, но сохраняйте данные, как только строка теряет фокус. Для этого вам понадобится стандартный MVC-проект, в котором строка таблицы представляет собой запись представления, ячейки - это поля представления, а модель предоставляет уровень сохранения или объект для данных. Между ними контроллер управляет соединением между ними. Ключом к ее бесшовному общению является связь между этими элементами.
Используйте события Swing для захвата изменений пользовательского интерфейса и обеспечения связи. См. " Как использовать таблицы" для примеров и идей. Используя эти идеи, вы можете увидеть, как пользователь может меняться в одной таблице, запускаемой как событие, можно прослушать/поймать и использовать для обновления данных во второй таблице. Вы также можете увидеть, как "сохранить" данные в строке обратно в базу данных, когда изменяется выбор строки, или строка/таблица теряет фокус.