当前位置: 首页 > news >正文

使用DAO模式改造学生信息管理系统

学生信息管理系统 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 {&#x20;   private List\<Student> studentList = new ArrayList<>();&#x20;   @Override&#x20;   public boolean addStudent(Student student) {&#x20;       if (student != null) {&#x20;           studentList.add(student);&#x20;           return true;&#x20;       }&#x20;       return false;&#x20;   }&#x20;   @Override&#x20;   public Student getStuByName(String name) {&#x20;       for (Student stu : studentList) {&#x20;           if (stu.getName().equals(name)) return stu;&#x20;       }&#x20;       return null;&#x20;   }&#x20;   @Override&#x20;   public void displayAllStudents() {&#x20;       studentList.forEach(System.out::println);&#x20;   }&#x20;   @Override public void loadData() {}&#x20;   @Override public void saveData() {}}

(2)文本文件模式:StudentDaoFileImpl.java

依赖 FileUtils,数据格式 “学号,姓名”:

package stumanagement.dao.impl;// 导入省略public class StudentDaoFileImpl implements StudentDao {&#x20;   private List\<Student> studentList;&#x20;   private final String FILE\_PATH = "students.txt";&#x20;   public StudentDaoFileImpl() {&#x20;       studentList = FileUtils.loadFromFile(FILE\_PATH); // 初始化加载&#x20;   }&#x20;   @Override&#x20;   public boolean addStudent(Student student) {&#x20;       if (student != null) {&#x20;           studentList.add(student);&#x20;           saveData(); // 新增后立即持久化&#x20;           return true;&#x20;       }&#x20;       return false;&#x20;   }&#x20;   // 查询、显示方法同List模式,省略&#x20;   @Override public void loadData() {&#x20;       studentList = FileUtils.loadFromFile(FILE\_PATH);&#x20;   }&#x20;   @Override public void saveData() {&#x20;       FileUtils.saveToFile(studentList, FILE\_PATH);&#x20;   }}

(3)Excel 模式:StudentDaoExcelImpl.java

需 Apache POI 依赖(pom.xml 配置):

\<dependency>&#x20;   \<groupId>org.apache.poi\</groupId>&#x20;   \<artifactId>poi-ooxml\</artifactId>&#x20;   \<version>5.2.5\</version>\</dependency>

实现逻辑类似文本模式,调用 ExcelUtils:

package stumanagement.dao.impl;// 导入省略public class StudentDaoExcelImpl implements StudentDao {&#x20;   private List\<Student> studentList;&#x20;   private final String EXCEL\_PATH = "students.xlsx";&#x20;   public StudentDaoExcelImpl() {&#x20;       studentList = ExcelUtils.loadFromExcel(EXCEL\_PATH);&#x20;   }&#x20;   @Override&#x20;   public boolean addStudent(Student student) {&#x20;       if (student != null) {&#x20;           studentList.add(student);&#x20;           saveData(); // 写Excel&#x20;           return true;&#x20;       }&#x20;       return false;&#x20;   }&#x20;   // 其他方法省略,load/save调用ExcelUtils}

4. 工具类(核心逻辑)

FileUtils.java(文本读写)

package stumanagement.utils;// 导入省略public class FileUtils {&#x20;   // 从文本加载数据&#x20;   public static List\<Student> loadFromFile(String path) {&#x20;       List\<Student> list = new ArrayList<>();&#x20;       File file = new File(path);&#x20;       if (!file.exists()) return list;&#x20;       try (BufferedReader br = new BufferedReader(new FileReader(file))) {&#x20;           String line;&#x20;           while ((line = br.readLine()) != null) {&#x20;               String\[] arr = line.split(",");&#x20;               if (arr.length >= 2) {&#x20;                   list.add(new Student(arr\[0], arr\[1]));&#x20;               }&#x20;           }&#x20;       } catch (IOException e) {&#x20;           e.printStackTrace();&#x20;       }&#x20;       return list;&#x20;   }&#x20;   // 保存到文本,省略}

ExcelUtils.java(Excel 读写)

package stumanagement.utils;// 导入POI相关类省略public class ExcelUtils {&#x20;   // 从Excel加载&#x20;   public static List\<Student> loadFromExcel(String path) {&#x20;       List\<Student> list = new ArrayList<>();&#x20;       File file = new File(path);&#x20;       if (!file.exists()) return list;&#x20;       try (Workbook wb = WorkbookFactory.create(new FileInputStream(file))) {&#x20;           Sheet sheet = wb.getSheetAt(0);&#x20;           for (int i = 1; i <= sheet.getLastRowNum(); i++) { // 跳过表头&#x20;               Row row = sheet.getRow(i);&#x20;               if (row == null) continue;&#x20;               String id = row.getCell(0).getStringCellValue();&#x20;               String name = row.getCell(1).getStringCellValue();&#x20;               list.add(new Student(id, name));&#x20;           }&#x20;       } catch (Exception e) {&#x20;           e.printStackTrace();&#x20;       }&#x20;       return list;&#x20;   }&#x20;   // 保存到Excel,省略}

四、主程序测试:一键切换模式

TestMain.java 中,修改 DAO 实现类即可切换存储模式:

package stumanagement.test;// 导入省略public class TestMain {&#x20;   public static void main(String\[] args) {&#x20;       // 切换模式:解开对应注释&#x20;       // StudentDao dao = new StudentDaoListImpl();    // List模式&#x20;       // StudentDao dao = new StudentDaoFileImpl();    // 文本模式&#x20;       StudentDao dao = new StudentDaoExcelImpl();   // Excel模式&#x20;       // 测试新增&#x20;       dao.addStudent(new Student("1001", "Tom"));&#x20;       dao.addStudent(new Student("1002", "Jerry"));&#x20;       // 测试显示&#x20;       System.out.println("所有学生:");&#x20;       dao.displayAllStudents();&#x20;       // 测试查询&#x20;       Student stu = dao.getStuByName("Tom");&#x20;       System.out.println("查询结果:" + stu);&#x20;   }}

五、总结

1. 核心优势

  • 低耦合:业务与数据访问分离,切换模式仅改一行代码

  • 易扩展:新增数据库存储只需加 StudentDaoJdbcImpl

  • 规范结构:按功能拆包,维护成本低

2. 注意事项

  • Excel 需配置 POI 依赖,避免类找不到

  • 文本 / Excel 路径默认项目根目录,可按需修改

  • 数据格式需与工具类逻辑匹配(如文本用逗号分隔)

(注:文档部分内容可能由 AI 生成)

http://www.zskr.cn/news/24618.html

相关文章:

  • 第1章 人工智能项目概述
  • Linux反弹shell解析
  • 2025-10-18 MX-S 模拟赛 赛后总结【MX】
  • clickhouse搭建单机版和集群版本
  • 零基础Linux快速上手-01
  • securecrt linux版本安装
  • P1896[SCOI2005]互不侵犯 解题笔记
  • 央企程序员AI创业一个月感受 ✨
  • Write To Spreadsheet labview这是什么
  • 从众多知识汲取一星半点也能受益匪浅【day16(2025.10.18)】(加班但只加到四点半)
  • 模拟赛T4 分析
  • 十月阅读笔记
  • #20232408 2025-2026-1 《网络与系统攻防技术》实验二实验报告 - 20232408
  • 关于我的博客密码
  • 如何选择合适的SAP实施公司?3步锁定靠谱的SAP服务商
  • 25秋周总结5
  • apisix升级完整流程
  • 程序员做视频难在哪?可能是文案这一关
  • 题解:P12003 在小小的奶龙山里面挖呀挖呀挖(加强版)
  • 如何生成逼真的合成表格数据:独立采样与关联建模方法对比
  • Why dont Japanese people reply to messages
  • 关于从使用blender编辑ue动画的设置
  • Python 潮流周刊#73:让我们对 PyPI 温柔一点,好吗?
  • React+Three.js 实现 Apple 2025 热成像 logo
  • 完整教程:【无人机】无人机群在三维环境中的碰撞和静态避障仿真(Matlab代码实现)
  • 数据采集与融合作业1
  • 运算符与自增自减
  • with关键字
  • 2025 年电磁流量计最新推荐榜,聚焦企业技术实力与市场口碑深度解析
  • 练习篇:从零开始了解网络空间安全(网导1)