From 064658191787f4ae4e9a4eab04c6a0c6dafeb673 Mon Sep 17 00:00:00 2001 From: pc9pizjb6 <122855890@qq.com> Date: Sat, 1 Nov 2025 23:45:11 +0800 Subject: [PATCH] ADD file via upload --- StudentDAO.java | 155 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 StudentDAO.java diff --git a/StudentDAO.java b/StudentDAO.java new file mode 100644 index 0000000..45d12cf --- /dev/null +++ b/StudentDAO.java @@ -0,0 +1,155 @@ +package com.studentmanagement.model; + +import com.studentmanagement.exception.DuplicateStudentException; +import com.studentmanagement.exception.StudentNotFoundException; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 学生数据访问对象 + * 负责学生数据的存储和访问操作,使用单例模式 + */ +public class StudentDAO { + private static StudentDAO instance; + private Map students; // 存储学生对象的集合 + + /** + * 私有构造函数,防止外部实例化 + */ + private StudentDAO() { + students = new HashMap<>(); + // 添加一些示例数据 + initSampleData(); + } + + /** + * 获取单例实例 + * @return StudentDAO的唯一实例 + */ + public static synchronized StudentDAO getInstance() { + if (instance == null) { + instance = new StudentDAO(); + } + return instance; + } + + /** + * 初始化示例数据 + */ + private void initSampleData() { + Student s1 = new Student("001", "张三", 20, "男"); + s1.addCourseGrade("数学", 85.5); + s1.addCourseGrade("英语", 92.0); + s1.addCourseGrade("计算机", 88.5); + + Student s2 = new Student("002", "李四", 21, "女"); + s2.addCourseGrade("数学", 90.0); + s2.addCourseGrade("英语", 88.0); + s2.addCourseGrade("计算机", 95.0); + + Student s3 = new Student("003", "王五", 19, "男"); + s3.addCourseGrade("数学", 78.5); + s3.addCourseGrade("英语", 82.0); + s3.addCourseGrade("计算机", 80.0); + + try { + addStudent(s1); + addStudent(s2); + addStudent(s3); + } catch (DuplicateStudentException e) { + // 示例数据初始化不应抛出重复异常 + System.err.println("示例数据初始化错误: " + e.getMessage()); + } + } + + /** + * 添加学生 + * @param student 学生对象 + * @throws DuplicateStudentException 如果学生ID已存在 + */ + public void addStudent(Student student) throws DuplicateStudentException { + if (students.containsKey(student.getId())) { + throw new DuplicateStudentException("学生ID已存在: " + student.getId(), student.getId()); + } + students.put(student.getId(), student); + } + + /** + * 获取所有学生 + * @return 学生列表 + */ + public List getAllStudents() { + return new ArrayList<>(students.values()); + } + + /** + * 根据ID查找学生 + * @param id 学生ID + * @return 学生对象 + * @throws StudentNotFoundException 如果学生不存在 + */ + public Student getStudentById(String id) throws StudentNotFoundException { + Student student = students.get(id); + if (student == null) { + throw new StudentNotFoundException("未找到ID为" + id + "的学生", id); + } + return student; + } + + /** + * 更新学生信息 + * @param student 学生对象 + * @throws StudentNotFoundException 如果学生不存在 + */ + public void updateStudent(Student student) throws StudentNotFoundException { + if (!students.containsKey(student.getId())) { + throw new StudentNotFoundException("未找到ID为" + student.getId() + "的学生", student.getId()); + } + students.put(student.getId(), student); + } + + /** + * 删除学生 + * @param id 学生ID + * @throws StudentNotFoundException 如果学生不存在 + */ + public void deleteStudent(String id) throws StudentNotFoundException { + if (!students.containsKey(id)) { + throw new StudentNotFoundException("未找到ID为" + id + "的学生", id); + } + students.remove(id); + } + + /** + * 根据课程筛选学生 + * @param course 课程名称 + * @return 选修该课程的学生列表 + */ + public List getStudentsByCourse(String course) { + List result = new ArrayList<>(); + for (Student student : students.values()) { + if (student.getCourseGrades().containsKey(course)) { + result.add(student); + } + } + return result; + } + + /** + * 根据成绩范围筛选学生 + * @param minGrade 最低成绩 + * @param maxGrade 最高成绩 + * @return 平均成绩在范围内的学生列表 + */ + public List getStudentsByGradeRange(double minGrade, double maxGrade) { + List result = new ArrayList<>(); + for (Student student : students.values()) { + double avgGrade = student.calculateAverageGrade(); + if (avgGrade >= minGrade && avgGrade <= maxGrade) { + result.add(student); + } + } + return result; + } +} \ No newline at end of file