|
|
|
|
@ -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<String, Student> 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<Student> 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<Student> getStudentsByCourse(String course) {
|
|
|
|
|
List<Student> 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<Student> getStudentsByGradeRange(double minGrade, double maxGrade) {
|
|
|
|
|
List<Student> result = new ArrayList<>();
|
|
|
|
|
for (Student student : students.values()) {
|
|
|
|
|
double avgGrade = student.calculateAverageGrade();
|
|
|
|
|
if (avgGrade >= minGrade && avgGrade <= maxGrade) {
|
|
|
|
|
result.add(student);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
}
|