diff --git a/README.md b/README.md
index 25c7475..e3f4445 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,2 @@
# JavaProjects
-For Java projects 3rd course
+Табала Матвій, третій курс, друга група "Комп'ютерна математика 2"
diff --git a/SepJavProj.rar b/SepJavProj.rar
new file mode 100644
index 0000000..105eb3a
Binary files /dev/null and b/SepJavProj.rar differ
diff --git a/lib/sqlite-jdbc-3.47.0.0.jar b/lib/sqlite-jdbc-3.47.0.0.jar
new file mode 100644
index 0000000..ab27f70
Binary files /dev/null and b/lib/sqlite-jdbc-3.47.0.0.jar differ
diff --git a/resources/2mid_completedb.db b/resources/2mid_completedb.db
new file mode 100644
index 0000000..ae372e6
Binary files /dev/null and b/resources/2mid_completedb.db differ
diff --git a/resources/2mid_final_grades.csv b/resources/2mid_final_grades.csv
new file mode 100644
index 0000000..42d449f
--- /dev/null
+++ b/resources/2mid_final_grades.csv
@@ -0,0 +1,273 @@
+Student Grades:
+StudentId, FirstName, LastName, CourseId, GroupId, AverageGrade
+1, Artem, Danilov, 1, 1, 7.0
+2, Anton, Krasov, 2, 1, 4.0
+3, Oksana, Strelec, 2, 1, 8.0
+4, Ruslana, Bondar, 3, 2, 4.0
+5, Vanessa, Robot, 1, 1, 4.0
+6, Mykola, Radiy, 3, 1, 8.0
+7, Kareem, Benzema, 1, 2, 9.0
+8, Evgeniya, Bremen, 1, 2, 4.0
+9, Oleksii, Makov, 3, 1, 8.0
+10, Ivan, Toney, 2, 2, 8.0
+11, Alice, Johnson, 2, 1, 6.0
+12, Bob, Smith, 3, 2, 7.0
+13, Charlie, Brown, 1, 3, 8.0
+14, Diana, Williams, 4, 1, 9.0
+15, Ethan, Davis, 5, 2, 6.0
+16, Fiona, Miller, 2, 3, 10.0
+17, George, Wilson, 3, 1, 5.0
+18, Hannah, Moore, 1, 2, 6.0
+19, Ian, Taylor, 4, 3, 7.0
+20, Jenna, Anderson, 5, 1, 9.0
+
+-------------------------------------------------
+
+Group Performances:
+GroupId, CourseId, AverageGrade
+1, 1, 5.5
+2, 1, 6.34
+1, 2, 6.0
+3, 1, 8.0
+2, 2, 8.0
+1, 3, 7.0
+3, 2, 10.0
+1, 4, 9.0
+2, 3, 5.5
+1, 5, 9.0
+3, 4, 7.0
+2, 5, 6.0
+
+-------------------------------------------------
+
+Course Performances:
+CourseId, AverageGrade
+1, 6.34
+2, 7.2
+3, 6.4
+4, 8.0
+5, 7.5
+
+-------------------------------------------------
+
+Teacher Performances:
+Teacher's full name: Ivan Andriyovych
+Student's full name, Student's course, Student's group, Student's average grade
+Artem Danilov, 1, 1, 5.72
+Anton Krasov, 2, 1, 9.62
+Oksana Strelec, 2, 1, 48.57
+Ruslana Bondar, 3, 2, 26.35
+Vanessa Robot, 1, 1, 77.98
+Mykola Radiy, 3, 1, 25.91
+Kareem Benzema, 1, 2, 32.1
+Evgeniya Bremen, 1, 2, 11.11
+Oleksii Makov, 3, 1, 49.06
+Ivan Toney, 2, 2, 26.45
+Alice Johnson, 2, 1, 48.53
+Bob Smith, 3, 2, 33.54
+Charlie Brown, 1, 3, 63.31
+Diana Williams, 4, 1, 12.68
+Ethan Davis, 5, 2, 82.58
+Fiona Miller, 2, 3, 76.17
+George Wilson, 3, 1, 8.83
+Hannah Moore, 1, 2, 13.39
+Ian Taylor, 4, 3, 26.07
+Jenna Anderson, 5, 1, 20.33
+
+Group Performances for Course Mathematical Analysis:
+GroupId, CourseId, AverageGrade
+1, 1, 41.85
+2, 1, 18.87
+1, 2, 35.58
+3, 1, 63.31
+2, 2, 26.45
+1, 3, 27.94
+3, 2, 76.17
+1, 4, 12.68
+2, 3, 29.95
+1, 5, 20.33
+3, 4, 26.07
+2, 5, 82.58
+
+Course Performances:
+CourseId, AverageGrade
+1, 33.94
+2, 41.87
+3, 28.74
+4, 19.38
+5, 51.46
+
+-------------------------------------------------
+
+Teacher's full name: Maria Ivanivna
+Student's full name, Student's course, Student's group, Student's average grade
+Artem Danilov, 1, 1, 19.83
+Anton Krasov, 2, 1, 4.71
+Oksana Strelec, 2, 1, 40.41
+Ruslana Bondar, 3, 2, 35.47
+Vanessa Robot, 1, 1, 78.12
+Mykola Radiy, 3, 1, 69.85
+Kareem Benzema, 1, 2, 23.06
+Evgeniya Bremen, 1, 2, 37.01
+Oleksii Makov, 3, 1, 9.49
+Ivan Toney, 2, 2, 10.73
+Alice Johnson, 2, 1, 85.49
+Bob Smith, 3, 2, 9.94
+Charlie Brown, 1, 3, 40.03
+Diana Williams, 4, 1, 96.86
+Ethan Davis, 5, 2, 36.96
+Fiona Miller, 2, 3, 39.17
+George Wilson, 3, 1, 87.43
+Hannah Moore, 1, 2, 51.55
+Ian Taylor, 4, 3, 57.57
+Jenna Anderson, 5, 1, 4.62
+
+Group Performances for Course Probability Theory:
+GroupId, CourseId, AverageGrade
+1, 1, 48.98
+2, 1, 37.21
+1, 2, 43.54
+3, 1, 40.03
+2, 2, 10.73
+1, 3, 55.59
+3, 2, 39.17
+1, 4, 96.86
+2, 3, 22.71
+1, 5, 4.62
+3, 4, 57.57
+2, 5, 36.96
+
+Course Performances:
+CourseId, AverageGrade
+1, 41.6
+2, 36.11
+3, 42.44
+4, 77.22
+5, 20.79
+
+-------------------------------------------------
+
+Teacher's full name: Maksym Vitaliyovych
+Student's full name, Student's course, Student's group, Student's average grade
+Artem Danilov, 1, 1, 30.82
+Anton Krasov, 2, 1, 54.38
+Oksana Strelec, 2, 1, 95.89
+Ruslana Bondar, 3, 2, 27.74
+Vanessa Robot, 1, 1, 13.24
+Mykola Radiy, 3, 1, 12.45
+Kareem Benzema, 1, 2, 10.54
+Evgeniya Bremen, 1, 2, 34.46
+Oleksii Makov, 3, 1, 94.61
+Ivan Toney, 2, 2, 18.16
+Alice Johnson, 2, 1, 3.16
+Bob Smith, 3, 2, 62.98
+Charlie Brown, 1, 3, 8.89
+Diana Williams, 4, 1, 72.14
+Ethan Davis, 5, 2, 59.58
+Fiona Miller, 2, 3, 12.25
+George Wilson, 3, 1, 87.25
+Hannah Moore, 1, 2, 8.49
+Ian Taylor, 4, 3, 98.54
+Jenna Anderson, 5, 1, 24.28
+
+Group Performances for Course Discrete Mathematics:
+GroupId, CourseId, AverageGrade
+1, 1, 22.03
+2, 1, 17.84
+1, 2, 51.15
+3, 1, 8.89
+2, 2, 18.16
+1, 3, 64.77
+3, 2, 12.25
+1, 4, 72.14
+2, 3, 45.36
+1, 5, 24.28
+3, 4, 98.54
+2, 5, 59.58
+
+Course Performances:
+CourseId, AverageGrade
+1, 17.74
+2, 36.77
+3, 57.01
+4, 85.34
+5, 41.93
+
+-------------------------------------------------
+
+Teacher's full name: Serhiy Vasylovych
+Student's full name, Student's course, Student's group, Student's average grade
+Artem Danilov, 1, 1, 20.64
+Anton Krasov, 2, 1, 37.57
+Oksana Strelec, 2, 1, 30.43
+Ruslana Bondar, 3, 2, 46.24
+Vanessa Robot, 1, 1, 86.5
+Mykola Radiy, 3, 1, 30.88
+Kareem Benzema, 1, 2, 86.18
+Evgeniya Bremen, 1, 2, 0.11
+Oleksii Makov, 3, 1, 64.59
+Ivan Toney, 2, 2, 43.42
+Alice Johnson, 2, 1, 29.22
+Bob Smith, 3, 2, 37.47
+Charlie Brown, 1, 3, 16.2
+Diana Williams, 4, 1, 49.56
+Ethan Davis, 5, 2, 23.55
+Fiona Miller, 2, 3, 97.9
+George Wilson, 3, 1, 69.07
+Hannah Moore, 1, 2, 7.61
+Ian Taylor, 4, 3, 82.38
+Jenna Anderson, 5, 1, 53.77
+
+-------------------------------------------------
+
+Group Performances for Course Programming:
+GroupId, CourseId, AverageGrade
+1, 1, 53.57
+2, 1, 31.3
+1, 2, 32.41
+3, 1, 16.2
+2, 2, 43.42
+1, 3, 54.85
+3, 2, 97.9
+1, 4, 49.56
+2, 3, 41.86
+1, 5, 53.77
+3, 4, 82.38
+2, 5, 23.55
+
+Course Performances:
+CourseId, AverageGrade
+1, 36.21
+2, 47.71
+3, 49.65
+4, 65.97
+5, 38.67
+
+-------------------------------------------------
+
+All Grades:
+StudentId, TeacherId, Grade
+1, 2, 5.0
+1, 3, 10.0
+2, 1, 4.0
+3, 4, 8.0
+4, 1, 4.0
+5, 3, 4.0
+1, 1, 6.0
+6, 4, 8.0
+7, 1, 9.0
+8, 1, 4.0
+9, 2, 8.0
+10, 3, 7.0
+10, 1, 9.0
+10, 2, 8.0
+11, 4, 6.0
+12, 2, 7.0
+13, 3, 8.0
+14, 1, 9.0
+15, 4, 6.0
+16, 3, 10.0
+17, 1, 5.0
+18, 1, 6.0
+19, 1, 7.0
+20, 1, 9.0
\ No newline at end of file
diff --git a/resources/completedb.db b/resources/completedb.db
new file mode 100644
index 0000000..a85a485
Binary files /dev/null and b/resources/completedb.db differ
diff --git a/resources/final_grades.csv b/resources/final_grades.csv
new file mode 100644
index 0000000..5159d5b
--- /dev/null
+++ b/resources/final_grades.csv
@@ -0,0 +1,83 @@
+Student Grades:
+StudentId, FirstName, LastName, CourseId, GroupId, AverageGrade
+1, Matvii, Tabala, 3, 1, 6.0
+2, Karem, Mashala, 1, 1, 8.0
+3, Sergiy, Horbach, 5, 2, 9.0
+
+-------------------------------------------------
+
+Group Performances:
+GroupId, CourseId, AverageGrade
+1, 1, 8.0
+1, 3, 6.0
+2, 5, 9.0
+
+-------------------------------------------------
+
+Course Performances:
+CourseId, AverageGrade
+1, 8.0
+3, 6.0
+5, 9.0
+
+-------------------------------------------------
+
+Teacher Performances:
+Teacher's full name: Ivan Andriyovych
+Student's full name, Student's course, Student's group, Student's average grade
+Sergiy Horbach, 5, 2, 9.0
+
+Group Performances for Course Mathematical Analysis:
+GroupId, CourseId, AverageGrade
+2, 5, 9.0
+
+Course Performances:
+CourseId, AverageGrade
+5, 9.0
+
+-------------------------------------------------
+
+Teacher's full name: Maria Ivanivna
+Student's full name, Student's course, Student's group, Student's average grade
+Matvii Tabala, 3, 1, 6.0
+
+Group Performances for Course Probability Theory:
+GroupId, CourseId, AverageGrade
+1, 3, 6.0
+
+Course Performances:
+CourseId, AverageGrade
+3, 6.0
+
+-------------------------------------------------
+
+Teacher's full name: Maksym Vitaliyovych
+Student's full name, Student's course, Student's group, Student's average grade
+
+Group Performances for Course Discrete Mathematics:
+GroupId, CourseId, AverageGrade
+
+Course Performances:
+CourseId, AverageGrade
+
+-------------------------------------------------
+
+Teacher's full name: Serhiy Vasylovych
+Student's full name, Student's course, Student's group, Student's average grade
+Karem Mashala, 1, 1, 8.0
+
+Group Performances for Course Programming:
+GroupId, CourseId, AverageGrade
+1, 1, 8.0
+
+Course Performances:
+CourseId, AverageGrade
+1, 8.0
+
+-------------------------------------------------
+
+All Grades:
+StudentId, TeacherId, Grade
+1, 2, 6.0
+2, 4, 8.0
+3, 1, 9.0
diff --git a/src/ProjectDocumentation.html b/src/ProjectDocumentation.html
new file mode 100644
index 0000000..1470f72
--- /dev/null
+++ b/src/ProjectDocumentation.html
@@ -0,0 +1,210 @@
+
+
+
+
+ Документація: StudentManagementSystem
+
+
+
+
+Документація: StudentManagementSystem
+
+
+ Даний проект призначений для обліку студентів, їх персональних даних та успішності.
+ Система дозволяє визначати успішність індивідуально для кожного студента, групи, курсу та по відношенню до викладача.
+ Всі дані зберігаються в SQLite базі даних, вони можуть редагуватись, імпортуватися та експортуватися у формат CSV.
+
+
+Зміст
+
+
+Клас StudentManagementSystem
+
+ Основний клас програми, який містить метод main і відповідає за запуск програми, взаємодію з користувачем та виклик необхідних методів для обробки даних.
+
+
+Метод public static void main(String[] args)
+
+ Точка входу програми. Виконує наступні дії:
+
+
+ - Перевіряє наявність файлу
final_grades.csv і створює його при необхідності.
+ - Підключається до бази даних SQLite.
+ - Створює необхідні таблиці в БД.
+ - Додає викладачів до бази даних.
+ - Завантажує дані студентів з CSV файлу.
+ - Відображає меню для користувача та обробляє вибір.
+
+
+Клас Teacher
+
+ Клас представляє викладача з наступними полями:
+
+
+ int id: Унікальний ідентифікатор викладача.
+ String name: Ім'я викладача.
+ String subject: Предмет, який викладає викладач.
+
+
+Конструктор public Teacher(int id, String name, String subject)
+Створює новий об'єкт Teacher з заданими параметрами.
+
+Методи доступу
+
+ public int getId(): Повертає ID викладача.
+ public String getName(): Повертає ім'я викладача.
+ public String getSubject(): Повертає предмет викладача.
+
+
+Клас Student
+
+ Клас представляє студента з наступними полями:
+
+
+ int id: Унікальний ідентифікатор студента.
+ String firstName: Ім'я студента.
+ String lastName: Прізвище студента.
+ int groupId: Номер групи студента.
+ int courseId: Номер курсу студента.
+
+
+Конструктор public Student(int id, String firstName, String lastName, int groupId, int courseId)
+Створює новий об'єкт Student з заданими параметрами.
+
+Методи доступу
+
+ public int getId(): Повертає ID студента.
+ public String getFirstName(): Повертає ім'я студента.
+ public String getLastName(): Повертає прізвище студента.
+ public int getGroupId(): Повертає номер групи студента.
+ public int getCourseId(): Повертає номер курсу студента.
+
+
+Клас Grades
+
+ Клас представляє оцінку студента з наступними полями:
+
+
+ int studentId: ID студента.
+ int teacherId: ID викладача.
+ double grade: Оцінка студента.
+
+
+Конструктор public Grades(int studentId, int teacherId, double grade)
+Створює новий об'єкт Grades з заданими параметрами.
+
+Методи доступу
+
+ public int getStudentId(): Повертає ID студента.
+ public int getTeacherId(): Повертає ID викладача.
+ public double getGrade(): Повертає оцінку студента.
+
+
+Клас DatabaseDAO
+
+ Клас відповідає за взаємодію з базою даних. Містить методи для створення таблиць, додавання та отримання викладачів, студентів та оцінок, а також оновлення даних.
+
+
+Конструктор public DatabaseDAO(Connection connection)
+Приймає об'єкт Connection для взаємодії з базою даних.
+
+Внутрішній клас public static class StudentGrade
+
+ Клас для зберігання інформації про студентів та їх оцінки від певного викладача.
+
+
+ String firstName: Ім'я студента.
+ String lastName: Прізвище студента.
+ int courseId: Номер курсу студента.
+ int groupId: Номер групи студента.
+ double averageGrade: Середня оцінка студента.
+
+
+Методи
+
+Основні (глобальні) методи
+
+public static void loadAllDataFromCSV(DatabaseDAO databaseDAO, String fileName)
+Завантажує всі дані з CSV файлу, очищує таблиці в базі даних та заповнює їх новими даними.
+
+public static void saveDataToCSV(DatabaseDAO databaseDAO)
+Зберігає всі дані з бази даних у CSV файл з відповідним форматуванням та розрахунком середніх оцінок.
+
+Другорядні методи
+
+public static List<Teacher> createTeachers()
+Створює та повертає список викладачів з заданими даними.
+
+public static void addTeachersToDatabase(DatabaseDAO databaseDAO, List<Teacher> teachers) throws SQLException
+Додає список викладачів до бази даних.
+
+public void createTables() throws SQLException
+Створює таблиці Students, Teachers та Grades у базі даних, якщо вони не існують.
+
+public void addTeacher(Teacher teacher) throws SQLException
+Додає викладача до таблиці Teachers.
+
+public List<Teacher> getAllTeachers() throws SQLException
+Повертає список всіх викладачів з таблиці Teachers.
+
+public void addStudent(Student student) throws SQLException
+Додає студента до таблиці Students.
+
+public void addGrade(int studentId, int teacherId, double grade) throws SQLException
+Додає оцінку студенту від викладача до таблиці Grades.
+
+public Student getStudentByNameAndGroup(String firstName, String lastName, int groupId, int courseId) throws SQLException
+Повертає студента за його ім'ям, прізвищем, номером групи та курсу.
+
+public Student getStudentById(int studentId) throws SQLException
+Повертає студента за його ID.
+
+public List<Student> getAllStudents() throws SQLException
+Повертає список всіх студентів з таблиці Students.
+
+public double getAverageGradeForStudent(int studentId) throws SQLException
+Обчислює та повертає середню оцінку для студента за його ID.
+
+public List<StudentGrade> getStudentsByTeacher(int teacherId) throws SQLException
+Повертає список студентів та їх середніх оцінок від певного викладача.
+
+public void updateStudentFirstName(int studentId, String newFirstName) throws SQLException
+Оновлює ім'я студента за його ID.
+
+public void updateStudentLastName(int studentId, String newLastName) throws SQLException
+Оновлює прізвище студента за його ID.
+
+public void updateStudentCourseId(int studentId, int newCourseId) throws SQLException
+Оновлює номер курсу студента за його ID.
+
+public void updateStudentGroupId(int studentId, int newGroupId) throws SQLException
+Оновлює номер групи студента за його ID.
+
+public void updateGrade(int studentId, double newGrade) throws SQLException
+Оновлює оцінку студента за його ID.
+
+public void updateTeacherForStudent(int studentId, int newTeacherId) throws SQLException
+Оновлює ID викладача для студента.
+
+public List<Grades> getAllGrades() throws SQLException
+Повертає список всіх оцінок з таблиці Grades.
+
+
+
\ No newline at end of file
diff --git a/src/StudentManagementSystem.java b/src/StudentManagementSystem.java
new file mode 100644
index 0000000..272e75d
--- /dev/null
+++ b/src/StudentManagementSystem.java
@@ -0,0 +1,904 @@
+// Проект з Java - Табала Матвій, 3-ій курс, "Комп'ютерна математика", 2-га група
+// Останння зміна файлу: 10.12.2024, 18:06:23
+
+import java.io.*;
+import java.sql.*;
+import java.util.*;
+
+@SuppressWarnings("unused")
+public class StudentManagementSystem {
+ /*
+ * Створіть систему для обліку студентів, яка дозволяє зберігати та редагувати персональні дані студентів та їх успішність.
+ * Система дозволяє визначати успішність індивідуально та для кожної групи та курсу, а також по відношенню до викладача.
+ * Всі дані зберігаються в SQL сумісній БД та можуть конвертуватись та завантажуватись в/з CSV.
+ */
+
+ // Клас для викладача
+ static class Teacher {
+ /*
+ * Клас для викладача, який містить ID, ім'я та предмет, який він викладає.
+ * Клас містить конструктор та методи доступу до полів.
+ */
+ private int id;
+ private String name;
+ private String subject;
+
+ public Teacher(int id, String name, String subject) { // Конструктор
+ this.id = id;
+ this.name = name;
+ this.subject = subject;
+ }
+
+ public int getId() { return id; }
+ public String getName() { return name; }
+ public String getSubject() { return subject; }
+ }
+
+ // Клас для студента
+ static class Student {
+ /*
+ * Клас для студента, який містить ID, ім'я, прізвище, ID групи та ID курсу.
+ * Клас містить конструктор та методи доступу до полів.
+ */
+ private int id;
+ private String firstName;
+ private String lastName;
+ private int groupId;
+ private int courseId;
+
+ public Student(int id, String firstName, String lastName, int groupId, int courseId) {
+ this.id = id;
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.groupId = groupId;
+ this.courseId = courseId;
+ }
+
+ public int getId() { return id; }
+ public String getFirstName() { return firstName; }
+ public String getLastName() { return lastName; }
+ public int getGroupId() { return groupId; }
+ public int getCourseId() { return courseId; }
+ }
+
+ // Клас для оцінок
+ static class Grades {
+ /*
+ * Клас для оцінок, який містить ID студента, ID викладача та оцінку.
+ * Клас містить конструктор та методи доступу до полів.
+ */
+ private int studentId;
+ private int teacherId;
+ private double grade;
+
+ public Grades(int studentId, int teacherId, double grade) {
+ this.studentId = studentId;
+ this.teacherId = teacherId;
+ this.grade = grade;
+ }
+
+ public int getStudentId() { return studentId; }
+ public int getTeacherId() { return teacherId; }
+ public double getGrade() { return grade; }
+ }
+
+ public static void main(String[] args) {
+ /*
+ ! Основний метод програми, який викликається при запуску програми.
+ * Метод створює файл final_grades.csv, якщо його немає, та підключається до SQLite БД.
+ * Метод створює таблиці в БД, додає викладачів, завантажує дані з CSV та виводить меню для користувача.
+ * Метод обробляє вибір користувача та викликає відповідні методи для додавання, виведення, редагування, конвертації та завантаження даних.
+ */
+ try {
+
+ // Перевірка наявності файлу ./resources/final_grades.csv та створення, якщо його немає
+ File csvFile = new File("./resources/final_grades.csv");
+ if (!csvFile.exists()) { // Якщо файл не існує, створюємо його і записуємо заголовок
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(csvFile))) {
+ writer.write("Student Grades:");
+ writer.newLine();
+ writer.write("FirstName,LastName,CourseId,GroupId,AverageGrade,TeacherId");
+ writer.newLine();
+ System.out.println("File final_grades.csv has been created.");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // Підключення до SQLite БД у файлі ./resources/completedb.db
+ Connection connection = DriverManager.getConnection("jdbc:sqlite:./resources/completedb.db");
+ DatabaseDAO databaseDAO = new DatabaseDAO(connection);
+
+ // Створення таблиць в БД
+ databaseDAO.createTables();
+
+ // Додавання викладачів у БД
+ List teachers = createTeachers();
+ addTeachersToDatabase(databaseDAO, teachers);
+
+ // Завантаження студентів з CSV
+ loadAllDataFromCSV(databaseDAO, "final_grades");
+
+ try (Scanner scanner = new Scanner(System.in)) {
+ while (true) {
+ System.out.println("Choose an option:");
+ System.out.println("1. Add a student");
+ System.out.println("2. Display all students");
+ System.out.println("3. Edit a student");
+ System.out.println("4. Convert and save data to CSV");
+ System.out.println("5. Import data from CSV");
+ System.out.println("6. Exit");
+ int choice = scanner.nextInt();
+ scanner.nextLine(); // Очищаємо буфер після вводу числа
+
+ if (choice == 1) {
+ // Додавання студента
+ System.out.println("Enter student's first name:");
+ String firstName = scanner.nextLine();
+ System.out.println("Enter student's last name:");
+ String lastName = scanner.nextLine();
+ System.out.println("Enter student's course:");
+ int courseId = scanner.nextInt();
+ System.out.println("Enter student's group:");
+ int groupId = scanner.nextInt();
+ scanner.nextLine();
+
+ System.out.println("Enter student's grade:");
+ double grade = scanner.nextDouble();
+ scanner.nextLine();
+
+ // Обираємо викладача
+ System.out.println("Select teacher by ID:");
+ for (Teacher teacher : teachers) { // Змінна teacher з типом Teacher як елемент списку teachers
+ System.out.println(teacher.getId() + ". " + teacher.getName() + " - " + teacher.getSubject());
+ }
+ int teacherId = scanner.nextInt();
+ scanner.nextLine(); // Очищаємо буфер після вводу числа
+
+ // Перевірка, чи є студент в базі
+ Student student = databaseDAO.getStudentByNameAndGroup(firstName, lastName, groupId, courseId);
+ if (student == null) {
+ // Якщо студента немає, додаємо його
+ student = new Student(0, firstName, lastName, groupId, courseId);
+ databaseDAO.addStudent(student);
+ }
+
+ // Додавання оцінки
+ databaseDAO.addGrade(student.getId(), teacherId, grade);
+ System.out.println("Grade has been added to the student.");
+
+ } else if (choice == 2) {
+ // Виведення всіх студентів з обчисленням середнього
+ List students = databaseDAO.getAllStudents();
+ for (Student s : students) {
+ double avgGrade = databaseDAO.getAverageGradeForStudent(s.getId()); // Отримання середнього бал
+ System.out.println("Student: " + s.getFirstName() + " " + s.getLastName() +
+ ", Course: " + s.getCourseId() + ", Group: " + s.getGroupId() +
+ ", Average grade: " + Math.ceil(avgGrade * 100) / 100 + ", " + "ID: " + s.getId());
+ }
+ } else if (choice == 3) {
+ // Редагування студента
+ System.out.println("Enter student's ID to edit:");
+ int studentId = scanner.nextInt();
+ scanner.nextLine();
+
+ Student student = databaseDAO.getStudentById(studentId);
+ if (student == null) {
+ System.out.println("Student not found.");
+ continue;
+ }
+
+ System.out.println("Select field to edit:");
+ System.out.println("1. First Name");
+ System.out.println("2. Last Name");
+ System.out.println("3. Course");
+ System.out.println("4. Group");
+ System.out.println("5. Grade");
+ System.out.println("6. Teacher");
+ int editChoice = scanner.nextInt();
+ scanner.nextLine();
+
+ switch (editChoice) {
+ /* Вибір поля для редагування:
+ * 1. Ім'я
+ * 2. Прізвище
+ * 3. Курс
+ * 4. Група
+ * 5. Оцінка
+ * 6. Викладач
+ */
+ case 1:
+ System.out.println("Enter new first name:");
+ String newFirstName = scanner.nextLine();
+ databaseDAO.updateStudentFirstName(studentId, newFirstName);
+ System.out.println("First name has been updated.");
+ break;
+ case 2:
+ System.out.println("Enter new last name:");
+ String newLastName = scanner.nextLine();
+ databaseDAO.updateStudentLastName(studentId, newLastName);
+ System.out.println("Last name has been updated.");
+ break;
+ case 3:
+ System.out.println("Enter new course:");
+ int newCourseId = scanner.nextInt();
+ scanner.nextLine();
+ databaseDAO.updateStudentCourseId(studentId, newCourseId);
+ System.out.println("Course has been updated.");
+ break;
+ case 4:
+ System.out.println("Enter new group:");
+ int newGroupId = scanner.nextInt();
+ scanner.nextLine();
+ databaseDAO.updateStudentGroupId(studentId, newGroupId);
+ System.out.println("Group has been updated.");
+ break;
+ case 5:
+ System.out.println("Enter new grade:");
+ double newGrade = scanner.nextDouble();
+ scanner.nextLine();
+ databaseDAO.updateGrade(studentId, newGrade);
+ System.out.println("Grade has been updated.");
+ break;
+ case 6:
+ System.out.println("Select new teacher by ID:");
+ for (Teacher teacher : teachers) {
+ System.out.println(teacher.getId() + ". " + teacher.getName() + " - " + teacher.getSubject());
+ }
+ int updatedTeacherId = scanner.nextInt();
+ scanner.nextLine();
+ databaseDAO.updateTeacherForStudent(studentId, updatedTeacherId);
+ System.out.println("Teacher updated.");
+ break;
+ default:
+ System.out.println("Invalid choice.");
+ }
+
+ } else if (choice == 4) {
+ // Збереження даних у CSV
+ saveDataToCSV(databaseDAO);
+ System.out.println("Data has been saved to final_grades.csv.");
+ } else if (choice == 5) {
+ // Завантаження даних з CSV
+ System.out.println("Enter the CSV filename (without .csv):");
+ String fileName = scanner.nextLine();
+ loadAllDataFromCSV(databaseDAO, fileName);
+ System.out.println("Data has been loaded from " + fileName + ".csv.");
+ } else if (choice == 6) {
+ break;
+ } else {
+ System.out.println("Invalid choice. Try again.");
+ }
+ }
+ }
+
+ connection.close();
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @param databaseDAO - об'єкт класу DatabaseDAO
+ * @param fileName - ім'я файлу CSV
+ * @return Метод для завантаження усіх даних з CSV файлу.
+ * Метод очищує всі таблиці в БД та завантажує дані з CSV.
+ * Метод також зберігає оновлені дані у файл final_grades.csv.
+ */
+ public static void loadAllDataFromCSV(DatabaseDAO databaseDAO, String fileName) {
+ String csvFilePath = "./resources/" + fileName + ".csv";
+ try (BufferedReader reader = new BufferedReader(new FileReader(csvFilePath))) {
+ String line; // Читання файлу по рядках
+ boolean isStudentSection = false; // Перевірка, чи це секція студентів
+ boolean isAllGradesSection = false; // Перевірка, чи це секція всіх оцінок
+ Map studentIdMap = new HashMap<>(); // Мапити старий ID студента на новий ID
+
+ // Видалення всіх даних з таблиць для завантаження нових даних
+ Statement stmt = databaseDAO.connection.createStatement();
+ stmt.execute("DELETE FROM Students");
+ stmt.execute("DELETE FROM Grades");
+ stmt.execute("DELETE FROM sqlite_sequence WHERE name='Students'");
+ stmt.execute("DELETE FROM sqlite_sequence WHERE name='Grades'");
+ System.out.println("All data has been cleared.");
+
+ while ((line = reader.readLine()) != null) {
+ line = line.trim(); // Видалення пробілів з початку та кінця рядка
+
+ if (line.equalsIgnoreCase("Student Grades:")) {
+ isStudentSection = true;
+ isAllGradesSection = false;
+ // Пропускаємо рядок заголовка по типу: "FirstName,LastName,CourseId,GroupId,AverageGrade,TeacherId"
+ reader.readLine();
+ continue;
+ } else if (line.equalsIgnoreCase("All Grades:")) {
+ isStudentSection = false;
+ isAllGradesSection = true;
+ // Аналогічно: "StudentId,TeacherId,Grade"
+ reader.readLine();
+ continue;
+ } else if (line.startsWith("-----") || line.isEmpty()) {
+ continue; // Пропускаємо роздільники та порожні рядки
+ }
+
+ if (isStudentSection) {
+ // Парсинг даних студента
+ String[] tokens = line.split(",");
+ if (tokens.length >= 6) { // Перевірка, чи є всі необхідні дані
+ int oldStudentId = Integer.parseInt(tokens[0].trim()); // Старий ID студента
+ String firstName = tokens[1].trim(); // Ім'я
+ String lastName = tokens[2].trim(); // Прізвище
+ int courseId = Integer.parseInt(tokens[3].trim()); // ID курсу
+ int groupId = Integer.parseInt(tokens[4].trim()); // ID групи
+
+ // Додаваємо студента до бази даних
+ Student student = new Student(0, firstName, lastName, groupId, courseId);
+ databaseDAO.addStudent(student);
+
+ // Зберігаємо маппінг старого та нового ID студента
+ studentIdMap.put(oldStudentId, student.getId());
+ }
+ } else if (isAllGradesSection) {
+ // Парсимо всі оцінки
+ String[] tokens = line.split(","); // Розділяємо рядок по комі
+ if (tokens.length >= 3) {
+ int oldStudentId = Integer.parseInt(tokens[0].trim());
+ int teacherId = Integer.parseInt(tokens[1].trim());
+ double grade = Double.parseDouble(tokens[2].trim());
+
+ Integer newStudentId = studentIdMap.get(oldStudentId); // Отримуємо новий ID студента
+ if (newStudentId != null) {
+ // Додавання оцінки до бази даних
+ databaseDAO.addGrade(newStudentId, teacherId, grade);
+ }
+ }
+ }
+ }
+ System.out.println("Data has been loaded from" + csvFilePath);
+
+ // Збереження оновлених даних у файл final_grades.csv
+ saveDataToCSV(databaseDAO);
+ System.out.println("final_grades.csv has been updated.");
+ } catch (IOException | SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ /**
+ * @param databaseDAO - об'єкт класу DatabaseDAO
+ * @return Метод для збереження даних у CSV файл.
+ * Метод записує студентів, групи, курси, викладачів та оцінки у файл final_grades.csv з відповідним форматом.
+ */
+ public static void saveDataToCSV(DatabaseDAO databaseDAO) {
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter("./resources/final_grades.csv"))) {
+ // Запис студентських оцінок
+ writer.write("Student Grades:");
+ writer.newLine();
+ writer.write("StudentId, FirstName, LastName, CourseId, GroupId, AverageGrade");
+ writer.newLine();
+ List students = databaseDAO.getAllStudents(); // Декларуємо список студентів і заповнюємо його
+ for (Student student : students) {
+ double avgGrade = databaseDAO.getAverageGradeForStudent(student.getId());
+ writer.write(student.getId() + ", " + student.getFirstName() + ", " + student.getLastName() + ", " +
+ student.getCourseId() + ", " + student.getGroupId() + ", " + Math.ceil(avgGrade * 100) / 100);
+ writer.newLine();
+ }
+
+ // Обчислення та запис успішності груп
+ Map> groupGrades = new HashMap<>(); // Створюємо відображення для зберігання середніх оцінок груп
+ for (Student student : students) {
+ double avgGrade = databaseDAO.getAverageGradeForStudent(student.getId());
+ String groupKey = student.getGroupId() + "," + student.getCourseId();
+ groupGrades.computeIfAbsent(groupKey, k -> new ArrayList<>()).add(avgGrade); // Якщо ключ не асоційований зі значенням, то додаємо його
+ }
+
+ writer.newLine();
+ writer.write("-------------------------------------------------\n");
+ writer.newLine();
+ writer.write("Group Performances:");
+ writer.newLine();
+ writer.write("GroupId, CourseId, AverageGrade");
+ writer.newLine();
+ for (Map.Entry> entry : groupGrades.entrySet()) { // для кожної циклу ітеруємось між ключами та значеннями в мапі groupGrades
+ String[] keys = entry.getKey().split(",");
+ int groupId = Integer.parseInt(keys[0]);
+ int courseId = Integer.parseInt(keys[1]);
+ List grades = entry.getValue(); // Отримуємо список оцінок
+ double sum = 0;
+ for (Double grade : grades) {
+ sum += grade; // Сумуємо оцінки
+ }
+ double avgGrade = grades.size() > 0 ? sum / grades.size() : 0; // Обчислюємо середню оцінку
+ writer.write(groupId + ", " + courseId + ", " + Math.ceil(avgGrade * 100) / 100); // Записуємо дані у файл
+ writer.newLine();
+ }
+
+ // Обчислення та запис успішності курсів
+ Map> courseGrades = new HashMap<>(); // Створюємо відображення для зберігання середніх оцінок курсів
+ for (Student student : students) {
+ int courseId = student.getCourseId();
+ double avgGrade = databaseDAO.getAverageGradeForStudent(student.getId());
+ courseGrades.computeIfAbsent(courseId, k -> new ArrayList<>()).add(avgGrade);
+ }
+
+ writer.newLine();
+ writer.write("-------------------------------------------------\n");
+ writer.newLine();
+ writer.write("Course Performances:");
+ writer.newLine();
+ writer.write("CourseId, AverageGrade");
+ writer.newLine();
+ for (Map.Entry> entry : courseGrades.entrySet()) {
+ int courseId = entry.getKey();
+ List grades = entry.getValue();
+ double sum = 0;
+ for (Double grade : grades) {
+ sum += grade;
+ }
+ double avgGrade = grades.size() > 0 ? sum / grades.size() : 0; // Обчислюємо середню оцінку, враховуючи, що список може бути порожнім
+ writer.write(courseId + ", " + Math.ceil(avgGrade * 100) / 100);
+ writer.newLine();
+ }
+
+ // Запис успішності викладачів
+ writer.newLine();
+ writer.write("-------------------------------------------------\n");
+ writer.newLine();
+ writer.write("Teacher Performances:");
+ writer.newLine();
+ List teachers = databaseDAO.getAllTeachers();
+ for (Teacher teacher : teachers) {
+ writer.write("Teacher's full name: " + teacher.getName());
+ writer.newLine();
+ writer.write("Student's full name, Student's course, Student's group, Student's average grade");
+ writer.newLine();
+ // StudentGrade - це вкладений клас у класі DatabaseDAO, який є частиною зовнішнього класу StudentManagementSystem
+ List studentGrades = databaseDAO.getStudentsByTeacher(teacher.getId());
+ for (StudentManagementSystem.DatabaseDAO.StudentGrade sg : studentGrades) {
+ writer.write(sg.firstName + " " + sg.lastName + ", " + sg.courseId + ", " +
+ sg.groupId + ", " + Math.ceil(sg.averageGrade * 100) / 100);
+ writer.newLine();
+ }
+ writer.newLine();
+
+ // Додавання успішності груп та курсів для викладача
+ writer.write("Group Performances for Course " + teacher.getSubject() + ":");
+ writer.newLine();
+ Map> teacherGroupGrades = new HashMap<>();
+ for (StudentManagementSystem.DatabaseDAO.StudentGrade sgGrade : studentGrades) {
+ String groupKey = sgGrade.groupId + "," + sgGrade.courseId;
+ teacherGroupGrades.computeIfAbsent(groupKey, k -> new ArrayList<>()).add(sgGrade.averageGrade);
+ }
+ writer.write("GroupId, CourseId, AverageGrade");
+ writer.newLine();
+ for (Map.Entry> entryGroup : teacherGroupGrades.entrySet()) {
+ String[] keys = entryGroup.getKey().split(",");
+ int groupId = Integer.parseInt(keys[0]);
+ int courseId = Integer.parseInt(keys[1]);
+ List grades = entryGroup.getValue();
+ double sum = 0;
+ for (Double grade : grades) {
+ sum += grade;
+ }
+ double avgGrade = grades.size() > 0 ? sum / grades.size() : 0;
+ writer.write(groupId + ", " + courseId + ", " + Math.ceil(avgGrade * 100) / 100);
+ writer.newLine();
+ }
+
+ writer.newLine();
+ writer.write("Course Performances:");
+ writer.newLine();
+ Map> teacherCourseGrades = new HashMap<>();
+ for (StudentManagementSystem.DatabaseDAO.StudentGrade sgGrade : studentGrades) {
+ int courseId = sgGrade.courseId;
+ // Якщо ключ не асоційований зі значенням, то додаємо його
+ teacherCourseGrades.computeIfAbsent(courseId, k -> new ArrayList<>()).add(sgGrade.averageGrade);
+ }
+ writer.write("CourseId, AverageGrade");
+ writer.newLine();
+ for (Map.Entry> entryCourse : teacherCourseGrades.entrySet()) {
+ int courseId = entryCourse.getKey();
+ List grades = entryCourse.getValue();
+ double sum = 0;
+ for (Double grade : grades) {
+ sum += grade;
+ }
+ double avgGrade = grades.size() > 0 ? sum / grades.size() : 0;
+ writer.write(courseId + ", " + Math.ceil(avgGrade * 100) / 100);
+ writer.newLine();
+ }
+ writer.newLine();
+ writer.write("-------------------------------------------------\n");
+ writer.newLine();
+ }
+
+ // Запис усіх оцінок
+ writer.write("All Grades:");
+ writer.newLine();
+ writer.write("StudentId, TeacherId, Grade");
+ writer.newLine();
+ List grades = databaseDAO.getAllGrades();
+ for (Grades grade : grades) {
+ writer.write(grade.getStudentId() + ", " + grade.getTeacherId() + ", " + grade.getGrade());
+ writer.newLine();
+ }
+
+ } catch (IOException | SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @return Метод створює список викладачів та додає їх до списку.
+ */
+ public static List createTeachers() {
+ List teachers = new ArrayList<>();
+ teachers.add(new Teacher(1, "Ivan Andriyovych", "Mathematical Analysis"));
+ teachers.add(new Teacher(2, "Maria Ivanivna", "Probability Theory"));
+ teachers.add(new Teacher(3, "Maksym Vitaliyovych", "Discrete Mathematics"));
+ teachers.add(new Teacher(4, "Serhiy Vasylovych", "Programming"));
+ return teachers;
+ }
+
+
+ /**
+ * @param databaseDAO - об'єкт класу DatabaseDAO
+ * @param teachers - список викладачів
+ * @return Метод додає кожного викладача зі списку викладачів до бази даних.
+ * @throws SQLException - виняток, який виникає при помилці SQL
+ */
+ public static void addTeachersToDatabase(DatabaseDAO databaseDAO, List teachers) throws SQLException {
+ for (Teacher teacher : teachers) {
+ databaseDAO.addTeacher(teacher);
+ }
+ }
+
+ // Оновлений клас DatabaseDAO для роботи з викладачами та оцінками
+ public static class DatabaseDAO {
+ /*
+ * Клас для роботи з базою даних.
+ * Клас містить методи для створення таблиць, додавання викладачів, студентів та оцінок, отримання даних та оновлення даних.
+ */
+
+ private Connection connection; // Підключення до БД
+
+ public DatabaseDAO(Connection connection) {
+ this.connection = connection; // Конструктор
+ }
+
+ // Допоміжний клас для зберігання оцінок студентів, бо клас Grades не містить інформацію про студента
+ public static class StudentGrade {
+ /*
+ * Клас для зберігання оцінок студентів.
+ * Клас містить ім'я, прізвище, ID курсу, ID групи та середню оцінку.
+ */
+ String firstName;
+ String lastName;
+ int courseId;
+ int groupId;
+ double averageGrade;
+
+ public StudentGrade(String firstName, String lastName, int courseId, int groupId, double averageGrade, int teacherId) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.courseId = courseId;
+ this.groupId = groupId;
+ this.averageGrade = averageGrade;
+ }
+ }
+
+ /**
+ * @return Метод виконує запит до БД та створює таблиці Students, Teachers та Grades.
+ * @throws SQLException
+ */
+ public void createTables() throws SQLException {
+ String studentsTable = "CREATE TABLE IF NOT EXISTS Students (" +
+ "id INTEGER PRIMARY KEY AUTOINCREMENT," +
+ "firstName TEXT," +
+ "lastName TEXT," +
+ "groupId INTEGER," +
+ "courseId INTEGER)";
+ String teachersTable = "CREATE TABLE IF NOT EXISTS Teachers (" +
+ "id INTEGER PRIMARY KEY," +
+ "name TEXT," +
+ "subject TEXT)";
+ String gradesTable = "CREATE TABLE IF NOT EXISTS Grades (" +
+ "id INTEGER PRIMARY KEY AUTOINCREMENT," +
+ "studentId INTEGER," +
+ "teacherId INTEGER," +
+ "grade REAL," +
+ "FOREIGN KEY(studentId) REFERENCES Students(id)," +
+ "FOREIGN KEY(teacherId) REFERENCES Teachers(id))";
+ Statement stmt = connection.createStatement();
+ stmt.execute(studentsTable);
+ stmt.execute(teachersTable);
+ stmt.execute(gradesTable);
+ }
+
+ /**
+ * @param teacher - об'єкт класу Teacher
+ * @return Метод виконує запит до таблиці Teachers та додає викладача.
+ * @throws SQLException
+ */
+ public void addTeacher(Teacher teacher) throws SQLException {
+ String query = "INSERT OR IGNORE INTO Teachers (id, name, subject) VALUES (?, ?, ?)";
+ PreparedStatement pstmt = connection.prepareStatement(query); // Підготовлений запит, краще працює з частими змінами значень
+ pstmt.setInt(1, teacher.getId());
+ pstmt.setString(2, teacher.getName());
+ pstmt.setString(3, teacher.getSubject());
+ pstmt.executeUpdate();
+ }
+
+ /**
+ * @return повертає список усіх викладачів з таблиці Teachers
+ */
+ public List getAllTeachers() throws SQLException {
+ List teachers = new ArrayList<>();
+ Statement stmt = connection.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT * FROM Teachers");
+ while (rs.next()) {
+ teachers.add(new Teacher(
+ rs.getInt("id"),
+ rs.getString("name"),
+ rs.getString("subject")
+ ));
+ }
+ return teachers;
+ }
+
+
+ /**
+ * @param student
+ * @return Метод виконує запит до таблиці Students та додає студента.
+ * @throws SQLException
+ */
+ public void addStudent(Student student) throws SQLException {
+ String query = "INSERT INTO Students (firstName, lastName, groupId, courseId) VALUES (?, ?, ?, ?)";
+ PreparedStatement pstmt = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
+ pstmt.setString(1, student.getFirstName());
+ pstmt.setString(2, student.getLastName());
+ pstmt.setInt(3, student.getGroupId());
+ pstmt.setInt(4, student.getCourseId());
+ pstmt.executeUpdate();
+ ResultSet rs = pstmt.getGeneratedKeys();
+ if (rs.next()) {
+ student.id = rs.getInt(1);
+ }
+ }
+
+ /**
+ * @param studentId - ID студента
+ * @param teacherId - ID викладача
+ * @param grade - оцінка
+ * @return Метод виконує запит до таблиці Grades та додає оцінку студенту.
+ * @throws SQLException
+ */
+ public void addGrade(int studentId, int teacherId, double grade) throws SQLException {
+ String query = "INSERT INTO Grades (studentId, teacherId, grade) VALUES (?, ?, ?)";
+ PreparedStatement pstmt = connection.prepareStatement(query);
+ pstmt.setInt(1, studentId);
+ pstmt.setInt(2, teacherId);
+ pstmt.setDouble(3, grade);
+ pstmt.executeUpdate();
+ }
+
+ /**
+ * @param firstName - ім'я
+ * @param lastName - прізвище
+ * @param groupId - ID групи
+ * @param courseId - ID курсу
+ * @return Метод виконує запит до таблиці Students по ім'ям, прізвищу, групі та курсу та повертає студента.
+ * @throws SQLException - виняток, який виникає при помилці SQL
+ */
+ public Student getStudentByNameAndGroup(String firstName, String lastName, int groupId, int courseId) throws SQLException {
+ String query = "SELECT * FROM Students WHERE firstName = ? AND lastName = ? AND groupId = ? AND courseId = ?";
+ PreparedStatement pstmt = connection.prepareStatement(query);
+ pstmt.setString(1, firstName);
+ pstmt.setString(2, lastName);
+ pstmt.setInt(3, groupId);
+ pstmt.setInt(4, courseId);
+ ResultSet rs = pstmt.executeQuery();
+ if (rs.next()) {
+ return new Student(
+ rs.getInt("id"),
+ rs.getString("firstName"),
+ rs.getString("lastName"),
+ rs.getInt("groupId"),
+ rs.getInt("courseId")
+ );
+ }
+ return null;
+ }
+
+ /**
+ * @param studentId - ID студента
+ * @return - повертає студента за ID
+ */
+ public Student getStudentById(int studentId) throws SQLException {
+ String query = "SELECT * FROM Students WHERE id = ?";
+ PreparedStatement pstmt = connection.prepareStatement(query);
+ pstmt.setInt(1, studentId);
+ ResultSet rs = pstmt.executeQuery();
+ if (rs.next()) {
+ return new Student(
+ rs.getInt("id"),
+ rs.getString("firstName"),
+ rs.getString("lastName"),
+ rs.getInt("groupId"),
+ rs.getInt("courseId")
+ );
+ }
+ return null;
+ }
+
+ /**
+ * @return - повертає список усіх студентів
+ * @throws SQLException
+ */
+ public List getAllStudents() throws SQLException {
+ List students = new ArrayList<>();
+ Statement stmt = connection.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT * FROM Students");
+ while (rs.next()) {
+ students.add(new Student(
+ rs.getInt("id"),
+ rs.getString("firstName"),
+ rs.getString("lastName"),
+ rs.getInt("groupId"),
+ rs.getInt("courseId")
+ ));
+ }
+ return students;
+ }
+
+ /**
+ * @param studentId - ID студента
+ * @return Метод виконує запит до таблиці Grades та обчислює середню оцінку для студента.
+ * @throws SQLException
+ */
+ public double getAverageGradeForStudent(int studentId) throws SQLException {
+ String query = "SELECT AVG(grade) as avgGrade FROM Grades WHERE studentId = ?";
+ PreparedStatement pstmt = connection.prepareStatement(query);
+ pstmt.setInt(1, studentId);
+ ResultSet rs = pstmt.executeQuery();
+ if (rs.next()) {
+ return rs.getDouble("avgGrade");
+ }
+ return 0;
+ }
+
+ /***
+ * @param teacherId
+ * @return Метод виконує запит до таблиць Students та Grades та повертає список студентів викладача.
+ * @throws SQLException
+ */
+ public List getStudentsByTeacher(int teacherId) throws SQLException {
+ List studentGrades = new ArrayList<>();
+ String query = "SELECT s.firstName, s.lastName, s.courseId, s.groupId, AVG(g.grade) as averageGrade " +
+ "FROM Students s " +
+ "JOIN Grades g ON s.id = g.studentId " +
+ "WHERE g.teacherId = ? " +
+ "GROUP BY s.id";
+ PreparedStatement pstmt = connection.prepareStatement(query);
+ pstmt.setInt(1, teacherId);
+ ResultSet rs = pstmt.executeQuery();
+ while (rs.next()) {
+ studentGrades.add(new StudentGrade(
+ rs.getString("firstName"),
+ rs.getString("lastName"),
+ rs.getInt("courseId"),
+ rs.getInt("groupId"),
+ Math.ceil(rs.getDouble("averageGrade") * 100) / 100,
+ teacherId
+ ));
+ }
+ return studentGrades;
+ }
+
+ /**
+ * @param studentId - ID студента
+ * @param newFirstName - нове ім'я
+ * @return Метод виконує запит до таблиці Students та оновлює ім'я студента.
+ * @throws SQLException
+ */
+ public void updateStudentFirstName(int studentId, String newFirstName) throws SQLException {
+ String query = "UPDATE Students SET firstName = ? WHERE id = ?";
+ PreparedStatement pstmt = connection.prepareStatement(query);
+ pstmt.setString(1, newFirstName);
+ pstmt.setInt(2, studentId);
+ pstmt.executeUpdate();
+ }
+
+ /**
+ * @param studentId - ID студента
+ * @param newLastName - нове прізвище
+ * @return Метод виконує запит до таблиці Students та оновлює прізвище студента.
+ * @throws SQLException
+ */
+ public void updateStudentLastName(int studentId, String newLastName) throws SQLException {
+ String query = "UPDATE Students SET lastName = ? WHERE id = ?";
+ PreparedStatement pstmt = connection.prepareStatement(query);
+ pstmt.setString(1, newLastName);
+ pstmt.setInt(2, studentId);
+ pstmt.executeUpdate();
+ }
+
+ /**
+ * @param studentId - ID студента
+ * @param newCourseId - новий ID курсу
+ * @return Метод виконує запит до таблиці Students та оновлює курс студента.
+ * @throws SQLException
+ */
+ public void updateStudentCourseId(int studentId, int newCourseId) throws SQLException {
+ String query = "UPDATE Students SET courseId = ? WHERE id = ?";
+ PreparedStatement pstmt = connection.prepareStatement(query);
+ pstmt.setInt(1, newCourseId);
+ pstmt.setInt(2, studentId);
+ pstmt.executeUpdate();
+ }
+
+ /**
+ * @param studentId - ID студента
+ * @param newGroupId - новий ID групи
+ * @return Метод виконує запит до таблиці Students та оновлює групу студента.
+ * @throws SQLException
+ */
+ public void updateStudentGroupId(int studentId, int newGroupId) throws SQLException {
+ String query = "UPDATE Students SET groupId = ? WHERE id = ?";
+ PreparedStatement pstmt = connection.prepareStatement(query);
+ pstmt.setInt(1, newGroupId);
+ pstmt.setInt(2, studentId);
+ pstmt.executeUpdate();
+ }
+
+ /**
+ * @param studentId - ID студента
+ * @param newGrade - нова оцінка
+ * @return Метод виконує запит до таблиці Grades та оновлює оцінку студента.
+ * @throws SQLException
+ */
+ public void updateGrade(int studentId, double newGrade) throws SQLException {
+ String query = "UPDATE Grades SET grade = ? WHERE studentId = ?";
+ PreparedStatement pstmt = connection.prepareStatement(query);
+ pstmt.setDouble(1, newGrade);
+ pstmt.setInt(2, studentId);
+ pstmt.executeUpdate();
+ }
+
+ /**
+ * @param studentId - ID студента
+ * @param newTeacherId - новий ID викладача
+ * @return Метод виконує запит до таблиці Grades та оновлює викладача для студента.
+ * @throws SQLException
+ */
+ public void updateTeacherForStudent(int studentId, int newTeacherId) throws SQLException {
+ String query = "UPDATE Grades SET teacherId = ? WHERE studentId = ?";
+ PreparedStatement pstmt = connection.prepareStatement(query);
+ pstmt.setInt(1, newTeacherId);
+ pstmt.setInt(2, studentId);
+ pstmt.executeUpdate();
+ }
+
+ /**
+ * @return Метод виконує запит до таблиці Grades та повертає всі оцінки.
+ */
+ public List getAllGrades() throws SQLException {
+ /*
+ * Метод для отримання всіх оцінок з бази даних.
+ * Метод виконує запит до таблиці Grades та повертає список оцінок.
+ */
+ String query = "SELECT * FROM Grades";
+ PreparedStatement pstmt = connection.prepareStatement(query);
+ ResultSet rs = pstmt.executeQuery();
+ List grades = new ArrayList<>();
+ while (rs.next()) {
+ grades.add(new Grades(
+ rs.getInt("studentId"),
+ rs.getInt("teacherId"),
+ rs.getDouble("grade")
+ ));
+ }
+ return grades;
+ }
+ }
+}