学生信息管理系统,真的是码农的必修课吗?

🏆本文收录于「滚雪球学SpringBoot」(全网一个名)专栏,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

前言

忆起,在大学时,很多计算机专业的同学都会做一个经典的编程课题------学生信息管理系统。那时候,编程老师往往从这个项目开始,引导我们一步一步成长为标准程序员。大家端着一杯咖啡,带着对编程的好奇心,通宵熬夜在实验室写代码。虽然那时的代码可能有些生硬,设计也不完美,但正是通过这个项目,我们从一个个编程小白慢慢过渡到能解决实际问题的开发者。

转眼间,大学毕业后,我们都已经走入了社会,成了在开发岗位上摸爬滚打的"资深"程序员。回想起当年做学生信息管理系统的经历,仿佛又回到了那些青涩的大学时光。那时的我们满怀激情,带着对编程的无尽探索和好奇,面对代码时既有焦虑,也有解决问题时的满足感。这些都是我们编程生涯中不可磨灭的回忆。

而今天,当我们回头看那个简单的学生信息管理系统时,才深刻意识到,那时的学习和实践对我们有多么重要。通过那个项目,我们不仅掌握了 Java 编程的基础,还学会了如何组织和管理数据,如何设计类、搭建系统,甚至理解了如何将数据持久化,存储到文件里。这些看似简单的技术,实际上在今天的工作中无处不在。

这一次,我决定再次从头开始,纯手"撸"一个学生信息管理系统,将这个项目带给那些刚开始接触编程的小白。对于零基础的朋友来说,这将是你们接触编程的第一步。而对于已经有些经验的开发者来说,回顾这个项目,会让你们感叹自己从当初的稚嫩,到现在的成熟,程序员之路的成长和变化。

通过这个项目,我们不仅可以重温大学时的快乐时光,感受编程的乐趣,还能帮助零基础的小伙伴们一步步走近编程。让我们一起回到那个青涩的年代,手把手带着大家一起完成编码,做出一个简单的学生信息管理系统(命令行版本),让他们在编程的路上走得更稳。

项目概述

本项目是一个学生信息管理系统,主要目的是模拟学校如何对学生信息进行管理。通过该系统,用户能够实现学生信息的增、删、改、查等常见操作。具体功能包括:

  1. 添加学生信息:用户可以输入学号、姓名、性别、年龄等基本信息,添加到系统中。
  2. 删除学生信息:根据学生学号删除已存在的学生信息,确保数据的准确性。
  3. 修改学生信息:用户可以修改学生的姓名、性别、年龄等信息,保持系统数据的更新。
  4. 查看所有学生信息:用户可以查看当前系统中存储的所有学生信息。
  5. 学号唯一性校验:每个学生必须有一个唯一的学号,系统会检查用户输入的学号是否已存在。
  6. 数据持久化:通过文件操作,将学生信息保存到本地文件(如 CSV 文件),即使系统重启后,数据依然能够恢复。

技术要点

  1. Java 基础语法:包括类、对象、方法、构造方法等基本的 Java 编程概念。通过这个系统,我们将深刻理解如何在 Java 中组织和管理代码。
  2. 集合类 :我们使用 HashMap 来存储学生信息。HashMap 根据学号快速存取学生信息,保证我们能够高效进行学生数据的查找、修改和删除。
  3. 文件 I/O 操作 :通过 Java 的 BufferedReaderBufferedWriter 类,实现数据的读取和保存,从而让数据能够在系统退出后持久化保存。

项目结构

  1. Student.java:定义学生类,封装学生的基本信息及相关操作方法。
  2. StudentManager.java:负责学生数据的增、删、改、查操作。
  3. StudentSystem.java:主类,处理用户输入和系统交互,通过控制台菜单引导用户操作。

设计思路

我先给大家罗列下,该系统整体的一个实现步骤,具体步骤如下:结合整个学生信息管理系统的流程,下面是 Student 类的工作步骤解析:

1. 完整实现步骤

步骤 1: 学生信息添加

  • 用户输入学生信息(学号、姓名、性别、年龄)。
  • Student 类通过构造方法创建一个新的学生对象。
  • 学生对象通过 StudentManageraddStudent 方法被添加到内存中的 HashMap 数据结构中,保证学号唯一性。

步骤 2: 显示所有学生信息

  • StudentManager 类调用 displayAllStudents 方法,遍历所有存储的学生对象。
  • 每个学生对象的 toString 方法被调用,输出格式化的学生信息,显示在命令行界面上。

步骤 3: 删除学生信息

  • 用户通过学号删除学生。
  • StudentManager 类通过学号从 HashMap 中删除对应的学生对象。

步骤 4: 修改学生信息

  • 用户选择修改学生信息(如修改姓名、性别、年龄等)。
  • StudentManager 类根据学号找到对应的学生对象,并通过相应的 Setter 方法更新学生的属性。

步骤 5: 持久化存储学生信息

  • 在系统退出时,StudentManager 会调用 saveData 方法,将所有学生对象的信息保存到 CSV 文件中。
  • 每个学生对象的 toString 方法将学生信息转化为 CSV 格式字符串,最终写入到文件中。

步骤 6: 从文件加载学生信息

  • 系统启动时,StudentManager 类会调用 loadData 方法,从文件中读取学生信息。
  • 每一行 CSV 数据通过 fromCSV 方法转化为 Student 对象,加载到内存中的 HashMap

2. 学生类(Student.java)

我们首先要设计一个 Student 类,表示一个学生对象。每个学生的基本信息包括学号、姓名、性别和年龄。Student 类不仅仅是用来存储这些数据,它还包含了方法,用于输出学生的基本信息,或者从 CSV 文件中读取数据并转换为学生对象。

学生类的设计(代码演示)

java 复制代码
/**
 * @Author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @date: 2025-07-31 15:56
 */
public class Student {
    private String studentId;  // 学号
    private String name;       // 姓名
    private String gender;     // 性别
    private int age;           // 年龄

    // 构造方法
    public Student(String studentId, String name, String gender, int age) {
        this.studentId = studentId;
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    // Getter 和 Setter 方法
    public String getStudentId() {
        return studentId;
    }

    public void setStudentId(String studentId) {
        this.studentId = studentId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    // 输出学生信息的方法
    public String toString() {
        return studentId + "," + name + "," + gender + "," + age;
    }

    // 从CSV数据中读取学生信息
    public static Student fromCSV(String csvData) {
        String[] data = csvData.split(",");
        return new Student(data[0], data[1], data[2], Integer.parseInt(data[3]));
    }
}

代码解析:

在这个简单的学生信息管理系统 中,Student 类是核心组成部分之一,负责存储和管理学生信息。接下来,我将结合整个项目的实现步骤,详细解析 Student 类的作用及其实现步骤。

1. 类的设计与目的

Student 类主要用于封装学生的基本信息,包括:

  • 学号 (studentId)
  • 姓名 (name)
  • 性别 (gender)
  • 年龄 (age)

在本项目中,我们利用这个类来创建学生对象,将其保存到内存中的数据结构中,并能够在文件存储和读取过程中方便地操作学生信息。

2. 构造方法与初始化

作用

  • 构造方法初始化了 Student 类的四个属性(学号、姓名、性别和年龄),确保每个学生对象在创建时都拥有完整的基本信息。
  • 这个方法将会在 StudentManager 中用于创建新的学生对象,并将其添加到存储学生信息的集合中。

在整个项目中的使用

  • 当用户添加学生时,我们通过调用这个构造方法创建一个新的学生对象,并将其存储到 StudentManager 类中维护的集合(如 HashMap)中。
3. Getter 和 Setter 方法

作用

  • Getter 方法:用于获取每个学生的属性值。
  • Setter 方法:用于设置或修改学生对象的属性值。

在整个项目中的使用

  • 这些方法在 StudentManager 类中被调用,用于获取学生信息或修改学生信息。例如,在修改学生信息时,我们通过 setNamesetAge 等方法来更新学生的姓名、年龄等属性。
4. toString 方法
java 复制代码
public String toString() {
    return studentId + "," + name + "," + gender + "," + age;
}

作用

  • 该方法用于返回学生信息的字符串表示。返回格式为:学号, 姓名, 性别, 年龄,即以 CSV 格式表示。

在整个项目中的使用

  • StudentManager 类中,当我们需要将学生信息保存到文件(如 CSV 文件)时,可以使用 toString() 方法将学生对象转化为一个字符串,便于写入文件。
  • 同时,toString() 方法还可以用于显示学生信息,例如在命令行中查看所有学生时,toString() 会返回每个学生的信息,并打印出来。
5. fromCSV 方法

作用

  • 该方法将 CSV 格式的字符串数据转换为 Student 对象。例如,输入 1001,John,Male,20,输出的是一个包含这些信息的 Student 对象。

在整个项目中的使用

  • 当从文件加载学生信息时,fromCSV 方法会被调用。StudentManager 类使用该方法将文件中的每一行(每一条学生记录)转换成一个 Student 对象,并将这些对象存储到集合中。

3. 学生管理类(StudentManager.java)

StudentManager 类的核心功能是管理学生信息的增、删、改、查操作。它内部使用了 HashMap 来存储学生信息。通过学号来快速查找和修改学生信息,同时提供数据的持久化支持。

学生管理类设计(代码演示)

java 复制代码
import java.util.HashMap;
import java.io.*;

/**
 * @Author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @date: 2025-07-31 15:56
 */
public class StudentManager {
    private HashMap<String, Student> studentMap;  // 存储学生信息(学号 -> 学生对象)

    public StudentManager() {
        studentMap = new HashMap<>();
        loadData();  // 从文件加载数据
    }

    // 添加学生信息
    public void addStudent(Student student) {
        if (studentMap.containsKey(student.getStudentId())) {
            System.out.println("学号已存在,不能添加!");
        } else {
            studentMap.put(student.getStudentId(), student);
            System.out.println("学生添加成功!");
        }
    }

    // 删除学生信息
    public void removeStudent(String studentId) {
        if (studentMap.containsKey(studentId)) {
            studentMap.remove(studentId);
            System.out.println("学生删除成功!");
        } else {
            System.out.println("学号不存在,无法删除!");
        }
    }

    // 修改学生信息
    public void updateStudent(String studentId, String name, String gender, int age) {
        if (studentMap.containsKey(studentId)) {
            Student student = studentMap.get(studentId);
            student.setName(name);
            student.setGender(gender);
            student.setAge(age);
            System.out.println("学生信息修改成功!");
        } else {
            System.out.println("学号不存在,无法修改!");
        }
    }

    // 输出所有学生信息
    public void displayAllStudents() {
        if (studentMap.isEmpty()) {
            System.out.println("没有学生信息!");
        } else {
            for (Student student : studentMap.values()) {
                System.out.println(student);
            }
        }
    }

    // 加载文件中的学生数据
    private void loadData() {
        File file = new File("students.csv");
        try {
            if (!file.exists()) {
                file.createNewFile();
                System.out.println("文件不存在,已创建新的文件:students.csv");
            }
            try (BufferedReader br = new BufferedReader(new FileReader(file))) {
                String line;
                while ((line = br.readLine()) != null) {
                    Student student = Student.fromCSV(line);
                    studentMap.put(student.getStudentId(), student);
                }
            }
        } catch (IOException e) {
            System.out.println("加载数据失败!" + e.getMessage());
        }
    }

    // 将学生数据保存到文件
    public void saveData() {
        try (BufferedWriter bw = new BufferedWriter(new FileWriter("students.csv"))) {
            for (Student student : studentMap.values()) {
                bw.write(student.toString());
                bw.newLine();
            }
            System.out.println("数据保存成功!");
        } catch (IOException e) {
            System.out.println("保存数据失败!");
        }
    }
}

代码解析:

StudentManager 类的主要职责是管理学生信息的增、删、改、查等操作,并实现学生信息的持久化存储。接下来,我们详细解析 StudentManager 类的各个方法,结合整个学生信息管理系统,逐步介绍它们的实现步骤。

1. 成员变量:studentMap

studentMap 是一个 HashMap,用来存储学生信息。键是学生的学号(String 类型),值是 Student 对象。通过学号,我们能够快速访问和操作学生的信息。

2. 构造方法:StudentManager()
  • 功能 :在类初始化时,studentMap 被初始化为一个空的 HashMap。然后,通过调用 loadData() 方法,从存储的文件(students.csv)中加载学生数据,确保在程序启动时,所有已经存在的学生信息能够加载到内存中。

  • 作用 :当系统启动时,自动加载已有的学生数据,并填充 studentMap。如果文件不存在,系统会自动创建一个空的文件,保证数据可以保存。

3. 添加学生信息:addStudent()
  • 功能 :该方法将新学生信息添加到 studentMap 中。

  • 步骤

    1. 通过 student.getStudentId() 获取学生的学号,检查该学号是否已存在于 studentMap 中。
    2. 如果学号已存在,打印提示信息并返回;如果学号不存在,则将学生对象添加到 studentMap 中。
  • 作用:这确保了每个学生的信息都具有唯一的学号,避免了重复添加相同学号的学生。

4. 删除学生信息:removeStudent()
  • 功能:根据学号删除学生信息。

  • 步骤

    1. 通过 studentMap.containsKey(studentId) 检查该学号是否存在。
    2. 如果学号存在,调用 studentMap.remove(studentId) 删除该学生信息。
    3. 如果学号不存在,打印提示信息,表示无法删除。
  • 作用:这个方法实现了删除操作,通过学号来唯一标识学生信息,确保学生数据的准确管理。

5. 修改学生信息:updateStudent()
  • 功能:修改已存在学生的信息(如姓名、性别、年龄)。

  • 步骤

    1. 通过 studentMap.containsKey(studentId) 检查学号是否存在。
    2. 如果学号存在,通过 studentMap.get(studentId) 获取学生对象,然后更新学生的姓名、性别和年龄。
    3. 如果学号不存在,打印提示信息,表示无法修改。
  • 作用:该方法提供了修改学生信息的功能,确保学生数据的最新性。

6. 显示所有学生信息:displayAllStudents()
  • 功能 :显示所有存储在 studentMap 中的学生信息。

  • 步骤

    1. 如果 studentMap 是空的,打印"没有学生信息!"。
    2. 如果 studentMap 中有学生信息,遍历所有学生并打印每个学生的信息(通过调用 Student 类的 toString() 方法)。
  • 作用:该方法可以帮助用户查看当前存储在系统中的所有学生信息。

7. 加载数据:loadData()
  • 功能 :从 students.csv 文件中加载学生数据,恢复系统数据。

  • 步骤

    1. 如果文件不存在,创建一个新的空文件。
    2. 如果文件存在,通过 BufferedReader 逐行读取文件内容。
    3. 每一行数据通过 Student.fromCSV() 方法转换为 Student 对象,然后将其添加到 studentMap 中。
  • 作用:确保系统能够从文件中加载之前保存的学生信息,恢复系统状态。

8. 保存数据:saveData()
  • 功能 :将当前内存中的学生信息保存到 students.csv 文件中。

  • 步骤

    1. 通过 BufferedWriter 将每个学生的信息逐行写入文件。
    2. 每个学生的信息通过调用 student.toString() 方法转化为 CSV 格式的字符串。
  • 作用:在系统退出时,将内存中的数据保存到文件,确保数据的持久化。

4. 主类(StudentSystem.java)

主类 StudentSystem 负责与用户进行交互,提供一个命令行界面,用户通过输入选项来进行操作。以下是主要流程:

graph TD; A[启动系统] --> B{选择操作} B -->|添加学生| C[输入学生信息] B -->|删除学生| D[输入学号删除] B -->|修改学生| E[输入学号修改] B -->|查看所有学生| F[显示所有学生] B -->|退出| G[保存数据并退出] C --> A D --> A E --> A F --> A G --> A

主类设计(代码演示)

java 复制代码
import java.util.Scanner;

/**
 * @Author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @date: 2025-07-31 15:56
 */
public class StudentSystem {
    private static StudentManager manager = new StudentManager();
    private static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        while (true) {
            System.out.println("学生信息管理系统");
            System.out.println("1. 添加学生信息");
            System.out.println("2. 删除学生信息");
            System.out.println("3. 修改学生信息");
            System.out.println("4. 显示所有学生信息");
            System.out.println("5. 退出");
            System.out.print("请输入您的选择:");

            int choice = scanner.nextInt();
            scanner.nextLine();  // Consume newline

            switch (choice) {
                case 1:
                    addStudent();
                    break;
                case 2:
                    removeStudent();
                    break;
                case 3:
                    updateStudent();
                    break;
                case 4:
                    manager.displayAllStudents();
                    break;
                case 5:
                    manager.saveData();  // 保存数据
                    System.out.println("退出系统...");
                    return;
                default:
                    System.out.println("无效选择,请重新输入!");
            }
        }
    }

    private static void addStudent() {
        System.out.print("请输入学号:");
        String studentId = scanner.nextLine();
        System.out.print("请输入姓名:");
        String name = scanner.nextLine();
        System.out.print("请输入性别:");
        String gender = scanner.nextLine();
        System.out.print("请输入年龄:");
        int age = scanner.nextInt();

        Student student = new Student(studentId, name, gender, age);
        manager.addStudent(student);
    }

    private static void removeStudent() {
        System.out.print("请输入要删除的学号:");
        String studentId = scanner.nextLine();
        manager.removeStudent(studentId);
    }

    private static void updateStudent() {
        System.out.print("请输入要修改的学号:");
        String studentId = scanner.nextLine();
        System.out.print("请输入新的姓名:");
        String name = scanner.nextLine();
        System.out.print("请输入新的性别:");
        String gender = scanner.nextLine();
        System.out.print("请输入新的年龄:");
        int age = scanner.nextInt();

        manager.updateStudent(studentId, name, gender, age);
    }
}

代码解析:

StudentSystem 类是整个学生信息管理系统的主程序,它提供了一个命令行界面,允许用户通过输入命令选择不同的操作,如添加、删除、修改和查看学生信息。以下是该类的逐步解析及实现细节:

1. 成员变量
  • manager:这是一个 StudentManager 对象,负责管理学生信息的增、删、改、查等操作。所有的学生数据和操作都通过它来实现。
  • scanner:这是一个 Scanner 对象,用于接收用户在命令行中输入的操作命令。
2. 主方法:main(String[] args)
  • 功能main 方法启动了一个无限循环,提供了一个菜单,用户可以根据提示输入选项执行对应的操作。

    • 操作选项:每次显示以下选项:

      1. 添加学生信息
      2. 删除学生信息
      3. 修改学生信息
      4. 显示所有学生信息
      5. 退出系统
    • 用户输入数字后,根据选择进入相应的操作。

    • scanner.nextLine() 用来消耗换行符,避免影响后续输入。

3. addStudent() 方法
  • 功能:该方法用于从用户输入中获取学生信息,并将新学生对象添加到系统中。

  • 操作流程

    1. 用户输入学号、姓名、性别和年龄。
    2. 创建一个新的 Student 对象,并通过 manager.addStudent(student) 将其添加到学生信息管理系统中。
    3. addStudent 方法会将学生对象存入 StudentManagerstudentMap 中。
4. removeStudent() 方法
  • 功能:该方法根据学号删除学生信息。

  • 操作流程

    1. 用户输入要删除的学生学号。
    2. 调用 manager.removeStudent(studentId) 方法删除该学号对应的学生数据。
    3. removeStudent 方法会从 StudentManager 中的 studentMap 中移除对应学号的学生。
5. updateStudent() 方法
  • 功能:该方法根据学号修改学生信息(姓名、性别、年龄)。

  • 操作流程

    1. 用户输入要修改的学生学号。
    2. 输入新的姓名、性别和年龄。
    3. 调用 manager.updateStudent(studentId, name, gender, age) 方法更新学生信息。

案例结果演示

根据如上的测试用例,作者在本地进行测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加其他的测试数据或测试方法,以便于进行熟练学习以此加深知识点的理解。

1. 运行整体效果

我们启动main函数,运行起来,我们可以看到,控制台会列出相关文字版的菜单:

2. 信息录入

我们先来操作一下,输入1,测试学生信息录入功能。

3. 删除学生

输入2,输入对应的学生编号,进行测试删除学生功能。

4. 学生信息修改

输入3,输入对应的学生编号,进行测试修改学生信息功能。

5. 学生信息查询

输入4,进行测试查询所有学生信息列表功能。

6. 系统退出

输入5,进行测试退出系统。

验证是否按退出系统后,会保存上次操作录入的学生信息,我们打开对应的students.csv文件,可以查验下。

7. 再次访问系统

我们再次访问,需要测试两件事:

  • 是否会继续将录入的学生信息追加到students.csv文件里。
  • 是否能查询上次的学生信息。

我们先进行查询操作。

经过如下操作演示,明显可以看到,如上两件事,均与预期一致。

OK,一把过,完美!请大家放心食用...

总结

说到这里,本期内容就要告一段落了,通过实现这个简易的学生信息管理系统,我们不仅可以完成学生信息的增删改查等基本操作,还能掌握 Java 中集合类、文件 I/O 操作、异常处理等重要知识点。这个项目的实现为我们后续学习更复杂的系统打下了坚实的基础。同时,随着需求的增加,我们可以在这个系统基础上不断拓展新功能,例如添加学籍信息、成绩管理、学生查询等,进一步提高系统的实用性和复杂度。

这个项目不仅仅是一个编程练习,更是一次全面理解编程语言、算法设计、数据结构和系统设计的机会。无论你是刚刚入门的学生,还是有一定基础的开发者,这个项目都能够为你提供实用的编程经验,帮助你在实际工作中更加高效地解决问题。

📣 关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主&最具价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题(好多小伙伴靠这个宝典拿到了多家大厂的offer)、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

相关推荐
杨DaB1 小时前
【SpringMVC】拦截器,实现小型登录验证
java·开发语言·后端·servlet·mvc
自由鬼2 小时前
如何处理Y2K38问题
java·运维·服务器·程序人生·安全·操作系统
_oP_i6 小时前
RabbitMQ 队列配置设置 RabbitMQ 消息监听器的并发消费者数量java
java·rabbitmq·java-rabbitmq
Monkey-旭6 小时前
Android Bitmap 完全指南:从基础到高级优化
android·java·人工智能·计算机视觉·kotlin·位图·bitmap
我爱996!6 小时前
SpringMVC——响应
java·服务器·前端
小宋10216 小时前
多线程向设备发送数据
java·spring·多线程
大佐不会说日语~7 小时前
Redis高频问题全解析
java·数据库·redis
寒水馨7 小时前
Java 17 新特性解析与代码示例
java·开发语言·jdk17·新特性·java17
启山智软7 小时前
选用Java开发商城的优势
java·开发语言
鹦鹉0077 小时前
SpringMVC的基本使用
java·spring·html·jsp