学生信息管理系统 DAO 模式改造:多存储模式实现与切换
原有学生信息管理系统仅用 List 存储数据,程序关闭后数据丢失。本文通过 DAO 模式改造,新增文本文件、Excel 两种持久化存储方式,实现主程序一键切换存储模式,同时规范项目结构。
一、为什么选 DAO 模式?
DAO(Data Access Object)模式核心是隔离数据访问与业务逻辑:
-
定义统一 DAO 接口,屏蔽底层存储差异
-
新增存储方式只需加实现类,不改动主程序
-
本次改造目标:支持 List(内存)、文本文件、Excel 三种存储,自由切换
二、项目结构设计(规范包结构)
按功能模块化拆分,符合 Java 编码规范(包名小写,类名驼峰式):
stumanagement/├─ entity/ # 实体类:Student.java(封装学生信息)├─ dao/ # DAO接口:StudentDao.java(统一数据操作)├─ dao.impl/ # DAO实现:3种存储模式的具体逻辑│ ├─ StudentDaoListImpl.java # List内存模式│ ├─ StudentDaoFileImpl.java # 文本文件模式│ └─ StudentDaoExcelImpl.java # Excel模式├─ utils/ # 工具类:FileUtils(文本读写)、ExcelUtils(Excel读写)└─ test/ # 测试类:TestMain.java(切换模式+功能验证)
三、核心代码实现
1. 实体类:Student.java
封装学生学号、姓名,提供 getter/setter 和 toString:
package stumanagement.entity;public class Student {  private String id; // 学号  private String name; // 姓名  public Student() {}  public Student(String id, String name) {  this.id = id;  this.name = name;  }  // getter/setter省略  @Override  public String toString() {  return "学号:" + id + ",姓名:" + name;  }}
2. DAO 接口:StudentDao.java
定义统一数据操作方法,所有存储模式需实现:
package stumanagement.dao;import stumanagement.entity.Student;public interface StudentDao {  boolean addStudent(Student student); // 新增学生  Student getStuByName(String name); // 按姓名查询  void displayAllStudents(); // 显示所有学生  void loadData(); // 加载数据到内存  void saveData(); // 持久化数据}
3. DAO 实现类(关键代码)
(1)List 内存模式:StudentDaoListImpl.java
无需持久化,load/save 空实现:
package stumanagement.dao.impl;// 导入省略public class StudentDaoListImpl implements StudentDao {  private List\<Student> studentList = new ArrayList<>();  @Override  public boolean addStudent(Student student) {  if (student != null) {  studentList.add(student);  return true;  }  return false;  }  @Override  public Student getStuByName(String name) {  for (Student stu : studentList) {  if (stu.getName().equals(name)) return stu;  }  return null;  }  @Override  public void displayAllStudents() {  studentList.forEach(System.out::println);  }  @Override public void loadData() {}  @Override public void saveData() {}}
(2)文本文件模式:StudentDaoFileImpl.java
依赖 FileUtils,数据格式 “学号,姓名”:
package stumanagement.dao.impl;// 导入省略public class StudentDaoFileImpl implements StudentDao {  private List\<Student> studentList;  private final String FILE\_PATH = "students.txt";  public StudentDaoFileImpl() {  studentList = FileUtils.loadFromFile(FILE\_PATH); // 初始化加载  }  @Override  public boolean addStudent(Student student) {  if (student != null) {  studentList.add(student);  saveData(); // 新增后立即持久化  return true;  }  return false;  }  // 查询、显示方法同List模式,省略  @Override public void loadData() {  studentList = FileUtils.loadFromFile(FILE\_PATH);  }  @Override public void saveData() {  FileUtils.saveToFile(studentList, FILE\_PATH);  }}
(3)Excel 模式:StudentDaoExcelImpl.java
需 Apache POI 依赖(pom.xml 配置):
\<dependency>  \<groupId>org.apache.poi\</groupId>  \<artifactId>poi-ooxml\</artifactId>  \<version>5.2.5\</version>\</dependency>
实现逻辑类似文本模式,调用 ExcelUtils:
package stumanagement.dao.impl;// 导入省略public class StudentDaoExcelImpl implements StudentDao {  private List\<Student> studentList;  private final String EXCEL\_PATH = "students.xlsx";  public StudentDaoExcelImpl() {  studentList = ExcelUtils.loadFromExcel(EXCEL\_PATH);  }  @Override  public boolean addStudent(Student student) {  if (student != null) {  studentList.add(student);  saveData(); // 写Excel  return true;  }  return false;  }  // 其他方法省略,load/save调用ExcelUtils}
4. 工具类(核心逻辑)
FileUtils.java(文本读写)
package stumanagement.utils;// 导入省略public class FileUtils {  // 从文本加载数据  public static List\<Student> loadFromFile(String path) {  List\<Student> list = new ArrayList<>();  File file = new File(path);  if (!file.exists()) return list;  try (BufferedReader br = new BufferedReader(new FileReader(file))) {  String line;  while ((line = br.readLine()) != null) {  String\[] arr = line.split(",");  if (arr.length >= 2) {  list.add(new Student(arr\[0], arr\[1]));  }  }  } catch (IOException e) {  e.printStackTrace();  }  return list;  }  // 保存到文本,省略}
ExcelUtils.java(Excel 读写)
package stumanagement.utils;// 导入POI相关类省略public class ExcelUtils {  // 从Excel加载  public static List\<Student> loadFromExcel(String path) {  List\<Student> list = new ArrayList<>();  File file = new File(path);  if (!file.exists()) return list;  try (Workbook wb = WorkbookFactory.create(new FileInputStream(file))) {  Sheet sheet = wb.getSheetAt(0);  for (int i = 1; i <= sheet.getLastRowNum(); i++) { // 跳过表头  Row row = sheet.getRow(i);  if (row == null) continue;  String id = row.getCell(0).getStringCellValue();  String name = row.getCell(1).getStringCellValue();  list.add(new Student(id, name));  }  } catch (Exception e) {  e.printStackTrace();  }  return list;  }  // 保存到Excel,省略}
四、主程序测试:一键切换模式
TestMain.java 中,修改 DAO 实现类即可切换存储模式:
package stumanagement.test;// 导入省略public class TestMain {  public static void main(String\[] args) {  // 切换模式:解开对应注释  // StudentDao dao = new StudentDaoListImpl(); // List模式  // StudentDao dao = new StudentDaoFileImpl(); // 文本模式  StudentDao dao = new StudentDaoExcelImpl(); // Excel模式  // 测试新增  dao.addStudent(new Student("1001", "Tom"));  dao.addStudent(new Student("1002", "Jerry"));  // 测试显示  System.out.println("所有学生:");  dao.displayAllStudents();  // 测试查询  Student stu = dao.getStuByName("Tom");  System.out.println("查询结果:" + stu);  }}
五、总结
1. 核心优势
-
低耦合:业务与数据访问分离,切换模式仅改一行代码
-
易扩展:新增数据库存储只需加 StudentDaoJdbcImpl
-
规范结构:按功能拆包,维护成本低
2. 注意事项
-
Excel 需配置 POI 依赖,避免类找不到
-
文本 / Excel 路径默认项目根目录,可按需修改
-
数据格式需与工具类逻辑匹配(如文本用逗号分隔)
(注:文档部分内容可能由 AI 生成)