当前位置: 首页 > 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.hskmm.com/?act=detail&tid=34501

相关文章:

  • 【ARM CoreLink 系列 4 -- NIC-400 控制器详细介绍】
  • Linux反弹shell解析
  • 2025-10-18 MX-S 模拟赛 赛后总结【MX】
  • P1854 花店橱窗布置 解题笔记
  • P1896[SCOI2005]互不侵犯 解题笔记
  • habse
  • hbase
  • 微信小程序 在云函数本地调试时,总是提示node modules 未安装,立即安装。解决方法
  • Godot-C#场景之间的切换
  • 读书日记1
  • 【ARM CoreLink 系列 3.1 -- CCI-500 详细介绍 -上半部】
  • 央企程序员AI创业一个月感受 ✨
  • tryhackme-预安全-网络基础知识-局域网介绍-05
  • 10.19
  • 从众多知识汲取一星半点也能受益匪浅【day16(2025.10.18)】(加班但只加到四点半)
  • (个人思考)游戏技能的实现
  • 模拟赛T4 分析
  • ubuntu系统中containerd的cni网络配置
  • 十月阅读笔记
  • #20232408 2025-2026-1 《网络与系统攻防技术》实验二实验报告 - 20232408
  • 题解:P2672 [NOIP 2015 普及组] 推销员
  • 一文读懂Schnorr签名
  • 如何选择合适的SAP实施公司?3步锁定靠谱的SAP服务商
  • CSP-S2024
  • 10/19
  • 论DCT和IDCT的重要性,汇编SIMD版第一,此贴第二,就是这么狂 :-)
  • 这些SAP实施公司哪家强?国内比较好的SAP实施商推荐
  • 25秋周总结5
  • UML图
  • 博士研究文档管理技术指南