Java程序设计项目教程:构建学生信息管理系统
第一部分:项目概述与准备
项目目标
我们将开发一个控制台(命令行)版的学生信息管理系统,该系统需要具备以下功能:
- 添加学生信息:包括学号、姓名、年龄、性别。
- 查看所有学生信息:以表格形式展示所有学生。
- 根据学号查询学生信息。
- 根据学号修改学生信息。
- 根据学号删除学生信息。
- 数据持久化:学生信息能够保存在文件中,程序关闭后重新打开,数据依然存在。
技术栈
- 核心语言: Java (建议使用 JDK 8 或更高版本)
- 开发工具: IntelliJ IDEA (强烈推荐) 或 Eclipse
- 数据存储: 文件存储 (使用
.txt或.csv格式) - 项目构建: Maven (可选,但推荐用于管理依赖和项目结构)
开发环境搭建
- 安装 JDK: 从 Oracle 官网或 OpenJDK 官网下载并安装 JDK。
- 安装 IDE: 下载并安装 IntelliJ IDEA Community Edition (免费版)。
- 配置环境变量: 确保
JAVA_HOME和PATH环境变量已正确配置。 - 验证安装: 打开终端或命令提示符,输入
java -version和javac -version,如果显示版本号,则说明安装成功。
第二部分:项目设计与架构
在敲代码之前,先进行设计是至关重要的,一个好的设计能让项目结构清晰,易于维护和扩展。
核心类设计
我们将创建以下几个核心类:
-
Student(学生类 - Model/Entity): 一个简单的Java类(POJO),用于封装单个学生的信息。- 属性:
id(学号),name(姓名),age(年龄),gender(性别) - 方法: 构造方法、Getter 和 Setter 方法、
toString()方法。
- 属性:
-
StudentManager(学生管理类 - Service/Logic): 项目的核心逻辑类,负责处理所有的业务操作。- 属性: 一个
List<Student>对象,用于在内存中存储所有学生。 - 方法:
addStudent(Student student): 添加学生。findAllStudents(): 查找所有学生。findStudentById(String id): 根据ID查找学生。updateStudent(String id, Student newStudent): 更新学生信息。deleteStudent(String id): 删除学生。saveToFile(): 将学生列表保存到文件。loadFromFile(): 从文件加载学生数据。
- 属性: 一个
-
Main(主程序类 - Entry Point): 程序的入口,负责显示菜单,接收用户输入,并调用StudentManager的方法来响应用户操作。
数据存储格式
我们选择使用 CSV (Comma-Separated Values) 格式来存储数据,因为它比纯文本更结构化,且可以用Excel等工具方便地查看。
文件名: students.csv
格式: id,name,age,gender
示例:
001,张三,18,男
002,李四,19,女
003,王五,20,男
第三部分:分步实现
创建项目与 Student 类
- 在 IntelliJ IDEA 中,选择
File -> New -> Project。 - 选择
Java,确保 Project SDK 已选择你的 JDK 版本,点击Next。 - 输入项目名称(如
StudentManagementSystem),选择项目位置,点击Finish。 - 在
src目录下,创建一个新的包,com.example.model。 - 在
model包下,创建Student.java类。
Student.java 代码:
package com.example.model;
public class Student {
private String id;
private String name;
private int age;
private String gender;
// 构造方法
public Student() {
}
public Student(String id, String name, int age, String gender) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
}
// Getter 和 Setter 方法
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
// 重写 toString() 方法,方便打印学生信息
@Override
public String toString() {
return String.format("学号: %s, 姓名: %s, 年龄: %d, 性别: %s", id, name, age, gender);
}
}
实现 StudentManager 类
- 在
src目录下创建一个新包com.example.service。 - 在
service包下创建StudentManager.java类。
StudentManager.java 代码:
package com.example.service;
import com.example.model.Student;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class StudentManager {
private List<Student> studentList;
private static final String FILE_NAME = "students.csv";
public StudentManager() {
studentList = new ArrayList<>();
// 程序启动时,从文件加载数据
loadFromFile();
}
// 添加学生
public void addStudent(Student student) {
// 检查学号是否已存在
if (findStudentById(student.getId()) != null) {
System.out.println("错误:学号 " + student.getId() + " 已存在!");
return;
}
studentList.add(student);
System.out.println("学生 " + student.getName() + " 添加成功!");
}
// 查找所有学生
public List<Student> findAllStudents() {
return studentList;
}
// 根据ID查找学生
public Student findStudentById(String id) {
for (Student student : studentList) {
if (student.getId().equals(id)) {
return student;
}
}
return null;
}
// 更新学生信息
public void updateStudent(String id, Student newStudent) {
Student studentToUpdate = findStudentById(id);
if (studentToUpdate != null) {
studentToUpdate.setName(newStudent.getName());
studentToUpdate.setAge(newStudent.getAge());
studentToUpdate.setGender(newStudent.getGender());
System.out.println("学号为 " + id + " 的学生信息更新成功!");
} else {
System.out.println("错误:未找到学号为 " + id + " 的学生!");
}
}
// 删除学生
public void deleteStudent(String id) {
Student studentToDelete = findStudentById(id);
if (studentToDelete != null) {
studentList.remove(studentToDelete);
System.out.println("学号为 " + id + " 的学生删除成功!");
} else {
System.out.println("错误:未找到学号为 " + id + " 的学生!");
}
}
// 保存到文件
public void saveToFile() {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_NAME))) {
for (Student student : studentList) {
// 将学生对象转换为CSV格式的一行字符串
String line = student.getId() + "," + student.getName() + "," + student.getAge() + "," + student.getGender();
writer.write(line);
writer.newLine(); // 写入换行符
}
} catch (IOException e) {
System.err.println("保存数据到文件时出错: " + e.getMessage());
}
}
// 从文件加载
public void loadFromFile() {
File file = new File(FILE_NAME);
if (!file.exists()) {
// 如果文件不存在,则无需加载
return;
}
try (BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME))) {
String line;
while ((line = reader.readLine()) != null) {
String[] parts = line.split(",");
if (parts.length == 4) {
String id = parts[0];
String name = parts[1];
int age = Integer.parseInt(parts[2]);
String gender = parts[3];
studentList.add(new Student(id, name, age, gender));
}
}
} catch (IOException | NumberFormatException e) {
System.err.println("从文件加载数据时出错: " + e.getMessage());
}
}
}
实现 Main 类与用户交互
- 在
src目录下创建com.example包。 - 在
com.example包下创建Main.java类。
Main.java 代码:
package com.example;
import com.example.model.Student;
import com.example.service.StudentManager;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
StudentManager manager = new StudentManager();
while (true) {
printMenu();
System.out.print("请输入您的选择: ");
int choice = scanner.nextInt();
scanner.nextLine(); // 消费掉nextInt()留下的换行符
switch (choice) {
case 1:
addStudent(scanner, manager);
break;
case 2:
listAllStudents(manager);
break;
case 3:
findStudent(scanner, manager);
break;
case 4:
updateStudent(scanner, manager);
break;
case 5:
deleteStudent(scanner, manager);
break;
case 6:
System.out.println("感谢使用,再见!");
manager.saveToFile(); // 退出前保存数据
scanner.close();
System.exit(0);
default:
System.out.println("无效的选择,请重新输入!");
}
System.out.println(); // 打印空行,使界面更清晰
}
}
private static void printMenu() {
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.println(" 6. 退出系统");
System.out.println("=====================================");
}
private static void addStudent(Scanner scanner, StudentManager manager) {
System.out.println("--- 添加学生 ---");
System.out.print("请输入学号: ");
String id = scanner.nextLine();
System.out.print("请输入姓名: ");
String name = scanner.nextLine();
System.out.print("请输入年龄: ");
int age = scanner.nextInt();
scanner.nextLine(); // 消费换行符
System.out.print("请输入性别: ");
String gender = scanner.nextLine();
Student student = new Student(id, name, age, gender);
manager.addStudent(student);
}
private static void listAllStudents(StudentManager manager) {
System.out.println("--- 所有学生信息 ---");
List<Student> students = manager.findAllStudents();
if (students.isEmpty()) {
System.out.println("当前没有学生信息。");
} else {
for (Student student : students) {
System.out.println(student);
}
}
}
private static void findStudent(Scanner scanner, StudentManager manager) {
System.out.println("--- 查询学生 ---");
System.out.print("请输入要查询的学号: ");
String id = scanner.nextLine();
Student student = manager.findStudentById(id);
if (student != null) {
System.out.println("查询结果: " + student);
} else {
System.out.println("未找到学号为 " + id + " 的学生。");
}
}
private static void updateStudent(Scanner scanner, StudentManager manager) {
System.out.println("--- 修改学生信息 ---");
System.out.print("请输入要修改的学生学号: ");
String id = scanner.nextLine();
Student existingStudent = manager.findStudentById(id);
if (existingStudent == null) {
System.out.println("未找到该学生,无法修改。");
return;
}
System.out.print("请输入新姓名 (原: " + existingStudent.getName() + "): ");
String name = scanner.nextLine();
System.out.print("请输入新年龄 (原: " + existingStudent.getAge() + "): ");
int age = scanner.nextInt();
scanner.nextLine(); // 消费换行符
System.out.print("请输入新性别 (原: " + existingStudent.getGender() + "): ");
String gender = scanner.nextLine();
Student newStudent = new Student(id, name, age, gender);
manager.updateStudent(id, newStudent);
}
private static void deleteStudent(Scanner scanner, StudentManager manager) {
System.out.println("--- 删除学生 ---");
System.out.print("请输入要删除的学生学号: ");
String id = scanner.nextLine();
manager.deleteStudent(id);
}
}
第四部分:项目运行与测试
- 编译与运行: 在 IntelliJ IDEA 中,直接点击
Main.java文件旁边的绿色运行按钮。 - 测试流程:
- 添加: 选择
1,输入几个学生的信息。 - 查看: 选择
2,检查是否所有学生都被正确显示。 - 查询: 选择
3,输入一个已存在的学号,看是否能查到。 - 修改: 选择
4,修改一个学生的信息,然后选择2或3验证修改是否成功。 - 删除: 选择
5,删除一个学生,然后选择2验证是否已删除。 - 退出: 选择
6,程序会退出,检查你的项目根目录下是否生成了students.csv文件。
- 添加: 选择
- 重启测试: 再次运行程序,选择
2查看所有学生,你会发现之前添加的学生信息依然存在,这证明了数据持久化功能正常工作。
第五部分:项目扩展与优化建议
当你完成了这个基础版本后,可以尝试以下扩展来提升你的技能:
- 使用数据库存储: 将
students.csv替换为 MySQL 或 SQLite 数据库,你需要学习 JDBC(Java Database Connectivity)来连接和操作数据库。 - 引入 GUI 界面: 使用 JavaFX 或 Swing 创建图形用户界面,让操作更直观。
- 使用集合框架优化: 学习使用
Map(如HashMap)来存储学生,以学号为key,可以极大地提高查询效率(从 O(n) 到 O(1))。 - 代码重构与设计模式:
- 将
Main类中的switch-case逻辑抽取到独立的MenuService类中。 - 学习使用 MVC (Model-View-Controller) 设计模式来重构项目,使代码结构更清晰、职责更分明。
- 使用 工厂模式 或 建造者模式 来创建
Student对象。
- 将
- 单元测试: 使用 JUnit 为
StudentManager类的方法编写单元测试,确保代码的正确性。 - 构建工具: 学习使用 Maven 或 Gradle 来管理项目依赖和构建过程。
- 异常处理: 创建自定义异常类(如
StudentNotFoundException),使错误处理更加优雅和专业。
这个项目从零开始,带你走完了整个Java应用程序的生命周期:需求分析、设计、编码、测试,希望这份详细的教程能对你有所帮助!祝你编程愉快!
