学生信息管理系统DAO模式改造报告

news/2025/10/14 16:59:16/文章来源:https://www.cnblogs.com/fzy01/p/19141531

学生信息管理系统DAO模式改造报告

目录

  1. 项目概述
  2. 需求分析
    • 2.1 功能需求
    • 2.2 设计与规范需求
  3. 系统设计
    • 3.1 DAO模式核心架构设计
    • 3.2 包结构设计
    • 3.3 关键类关系图
  4. 系统实现
    • 4.1 核心代码实现与说明
    • 4.2 原系统代码改造点
    • 4.3 难点与解决方案
  5. 系统测试
    • 5.1 测试用例设计
    • 5.2 测试结果分析
  6. 项目总结

一、项目概述

1.1 原系统核心功能

原学生信息管理系统基于Java语言开发,核心功能包括:

  • 学生信息添加:支持录入姓名、年龄、性别、ID、专业、GPA等信息
  • 学生信息删除:通过学生ID进行唯一删除
  • 多条件查询:支持按姓名、专业、GPA查询学生信息
  • 数据展示:可查看系统中所有学生的完整信息

系统通过Student类封装学生数据,StudentManagementSystem类实现数据管理逻辑,Main类提供控制台交互界面。

1.2 原系统局限

  1. 存储方式单一:仅依赖内存List集合存储数据,程序退出后数据全部丢失
  2. 扩展性差:数据操作与业务逻辑耦合,新增存储方式需大幅修改核心代码
  3. 无持久化能力:无法满足用户对数据长期保存的实际需求

1.3 改造目标

采用DAO(Data Access Object)设计模式,实现三种数据存取模式的无缝切换:

  1. List内存存储模式(原功能保留)
  2. 文本文件持久化存储模式
  3. Excel文件持久化存储模式

通过工厂模式实现存储策略的动态切换,使主程序与数据访问逻辑解耦。

1.4 改造价值

  1. 掌握"接口定义与实现分离"的设计思想,理解面向接口编程的优势
  2. 提升系统可扩展性,新增存储方式(如数据库)时无需修改主程序
  3. 增强系统实用性,满足不同场景下的数据持久化需求
  4. 规范代码结构,提高系统可维护性

二、需求分析

2.1 功能需求

  1. 兼容性需求

    • 完全保留原系统的所有交互逻辑和功能点
    • 用户操作流程不变,仅增加存储模式选择入口
    • 支持原有所有查询条件和数据展示格式
  2. 存储模式需求

    • 三种存储模式可独立运行,数据存储相互隔离
    • 模式切换时自动迁移当前数据到新存储介质
    • 支持存储模式的动态切换,无需重启程序
  3. 数据安全需求

    • 文本文件存储:实现文件不存在时自动创建,读写权限不足时给出明确提示
    • Excel文件存储:处理文件损坏、版本不兼容等异常情况
    • 所有存储模式需验证学生ID唯一性,防止重复添加
  4. 易用性需求

    • 主菜单增加存储模式选择项(1-List/2-文本/3-Excel)
    • 模式切换时显示清晰的操作提示(如"正在从文本模式切换到Excel模式...")
    • 数据操作失败时提供友好的错误信息(如"文件写入失败,请检查磁盘空间")

2.2 设计与规范需求

  1. 包结构规范

    • 按功能职责划分包,避免类文件混乱
    • 每个包的职责单一,如工具类仅存放通用方法
  2. 命名规范

    • 类名:采用帕斯卡命名法(首字母大写),如TextFileStudentDAO
    • 方法名:采用驼峰命名法(首字母小写),如searchByMajor
    • 接口名:以I为前缀或直接使用功能名称,如StudentDAO
    • 包名:全小写,多单词用点分隔,如com.student.dao.impl
  3. 扩展性需求

    • 新增存储模式时,只需实现StudentDAO接口并在工厂类中添加对应逻辑
    • 主程序与DAO实现类完全解耦,通过接口进行交互
    • 工具类设计为静态方法,便于后续功能复用

三、系统设计

3.1 DAO模式核心架构设计

  1. DAO接口(StudentDAO
    定义所有数据操作的标准方法,包括:

    • addStudent(Student student):添加学生
    • deleteStudent(String id):删除学生
    • searchByName(String name):按姓名查询
    • searchByMajor(String major):按专业查询
    • searchByGpa(double gpa):按GPA查询
    • getAllStudents():获取所有学生
    • exists(String id):验证ID是否存在
  2. DAO实现类

    • ListStudentDAO:基于内存List实现数据操作(复用原系统逻辑)
    • TextFileStudentDAO:基于文本文件实现持久化存储
    • ExcelStudentDAO:基于Excel文件实现持久化存储
  3. 工厂类(DAOFactory
    提供静态方法getStudentDAO(String mode),根据模式参数返回对应DAO实例:

    • 模式参数"list" → 返回ListStudentDAO实例
    • 模式参数"text" → 返回TextFileStudentDAO实例
    • 模式参数"excel" → 返回ExcelStudentDAO实例

3.2 包结构设计

com.student
├── model           // 实体类包
│   └── Student.java  // 学生实体类
├── dao             // DAO接口包
│   └── StudentDAO.java  // 学生数据访问接口
├── dao.impl        // DAO实现类包
│   ├── ListStudentDAO.java
│   ├── TextFileStudentDAO.java
│   └── ExcelStudentDAO.java
├── util            // 工具类包
│   ├── FileUtil.java    // 文本文件处理工具
│   └── ExcelUtil.java   // Excel文件处理工具
└── main            // 主程序包└── Main.java        // 程序入口与交互逻辑

各包职责:

  • model:存放实体类,封装数据属性及get/set方法
  • dao:定义数据访问接口,规范数据操作
  • dao.impl:实现具体的数据存储逻辑,屏蔽不同存储方式差异
  • util:提供文件读写、Excel处理等通用功能
  • main:处理用户交互,通过工厂类获取DAO实例并调用接口方法

3.3 关键类关系图

classDiagramdirection LRclass StudentDAO {+addStudent(Student) boolean+deleteStudent(String) boolean+searchByName(String) List~Student~+searchByMajor(String) List~Student~+searchByGpa(double) List~Student~+getAllStudents() List~Student~+exists(String) boolean}class ListStudentDAO {-List~Student~ students+addStudent(Student) boolean+deleteStudent(String) boolean+searchByName(String) List~Student~+searchByMajor(String) List~Student~+searchByGpa(double) List~Student~+getAllStudents() List~Student~+exists(String) boolean}class TextFileStudentDAO {-String filePath+addStudent(Student) boolean+deleteStudent(String) boolean+searchByName(String) List~Student~+searchByMajor(String) List~Student~+searchByGpa(double) List~Student~+getAllStudents() List~Student~+exists(String) boolean}class ExcelStudentDAO {-String filePath+addStudent(Student) boolean+deleteStudent(String) boolean+searchByName(String) List~Student~+searchByMajor(String) List~Student~+searchByGpa(double) List~Student~+getAllStudents() List~Student~+exists(String) boolean}class DAOFactory {+getStudentDAO(String) StudentDAO}StudentDAO <|-- ListStudentDAOStudentDAO <|-- TextFileStudentDAOStudentDAO <|-- ExcelStudentDAODAOFactory --> ListStudentDAODAOFactory --> TextFileStudentDAODAOFactory --> ExcelStudentDAO

四、系统实现

4.1 核心代码实现与说明

4.1.1 StudentDAO接口

package com.student.dao;import com.student.model.Student;
import java.util.List;public interface StudentDAO {/*** 添加学生* @param student 学生对象* @return 成功返回true,ID重复返回false*/boolean addStudent(Student student);/*** 删除学生* @param id 学生ID* @return 成功返回true,未找到返回false*/boolean deleteStudent(String id);// 其他方法定义...
}

4.1.2 DAOFactory类

package com.student.dao;import com.student.dao.impl.ExcelStudentDAO;
import com.student.dao.impl.ListStudentDAO;
import com.student.dao.impl.TextFileStudentDAO;public class DAOFactory {/*** 根据模式获取DAO实例* @param mode 存储模式:list/text/excel* @return 对应的StudentDAO实现类*/public static StudentDAO getStudentDAO(String mode) {switch (mode.toLowerCase()) {case "text":return new TextFileStudentDAO("students.txt");case "excel":return new ExcelStudentDAO("students.xlsx");case "list":default:return new ListStudentDAO();}}
}

4.1.3 TextFileStudentDAO(关键方法)

package com.student.dao.impl;// 导入语句省略...public class TextFileStudentDAO implements StudentDAO {private String filePath;public TextFileStudentDAO(String filePath) {this.filePath = filePath;// 确保文件存在FileUtil.createFileIfNotExists(filePath);}@Overridepublic boolean addStudent(Student student) {if (exists(student.getId())) {return false;}// 格式:ID,姓名,年龄,性别,专业,GPAString line = String.format("%s,%s,%d,%s,%s,%.1f",student.getId(),student.getName(),student.getAge(),student.getGender(),student.getMajor(),student.getGpa());return FileUtil.appendLine(filePath, line);}@Overridepublic List<Student> getAllStudents() {List<String> lines = FileUtil.readAllLines(filePath);List<Student> students = new ArrayList<>();for (String line : lines) {String[] parts = line.split(",");// 解析字符串为Student对象Student s = new Student(parts[1],Integer.parseInt(parts[2]),parts[3],parts[0],parts[4],Double.parseDouble(parts[5]));students.add(s);}return students;}// 其他方法实现...
}

4.1.4 主程序模式切换逻辑

// 在Main类中添加存储模式选择
System.out.println("请选择存储模式:1-内存List 2-文本文件 3-Excel文件");
int modeChoice = scanner.nextInt();
String mode = "list";
switch (modeChoice) {case 2:mode = "text";break;case 3:mode = "excel";break;
}
// 获取DAO实例
StudentDAO studentDAO = DAOFactory.getStudentDAO(mode);

4.2 原系统代码改造点

  1. 移除StudentManagementSystem:将其数据操作逻辑迁移至ListStudentDAO
  2. 重构Main
    • 移除直接依赖StudentManagementSystem的代码
    • 通过DAOFactory获取数据访问对象
    • 增加存储模式选择菜单
  3. 优化Student
    • 调整包路径至com.student.model
    • 保持原有属性和方法不变,确保兼容性

改造前后对比:

  • 原代码:StudentManagementSystem sms = new StudentManagementSystem();
  • 改造后:StudentDAO dao = DAOFactory.getStudentDAO(mode);

所有数据操作从直接调用StudentManagementSystem方法改为调用StudentDAO接口方法,实现了解耦。

4.3 难点与解决方案

  1. 问题1:文本文件ID重复检测效率低

    • 问题:每次添加学生需读取整个文件检查ID是否存在
    • 解决方案:
      // 缓存所有ID到内存Set,减少IO操作
      private Set<String> loadAllIds() {Set<String> ids = new HashSet<>();for (Student s : getAllStudents()) {ids.add(s.getId());}return ids;
      }
      
  2. 问题2:Excel大文件读写内存溢出

    • 问题:POI读取大型Excel文件时容易发生OOM
    • 解决方案:使用SXSSFWorkbook实现流式处理
      // ExcelUtil中添加大数据处理方法
      public static SXSSFWorkbook createLargeWorkbook() {// 只保留100行在内存,超过则写入临时文件return new SXSSFWorkbook(100);
      }
      
  3. 问题3:模式切换时数据迁移

    • 问题:切换存储模式后原有数据丢失
    • 解决方案:切换前导出数据,切换后导入
      // 模式切换逻辑
      List<Student> temp = currentDAO.getAllStudents();
      StudentDAO newDAO = DAOFactory.getStudentDAO(newMode);
      for (Student s : temp) {newDAO.addStudent(s);
      }
      currentDAO = newDAO;
      

五、系统测试

5.1 测试用例设计

测试场景 测试步骤 预期结果
List模式-添加与查询 1. 选择List模式;2. 添加学生(ID:001,姓名:张三);3. 按姓名查询“张三” 查询结果包含ID为001的学生信息
文本模式-删除功能 1. 选择文本模式;2. 添加学生(ID:002);3. 输入ID 002删除;4. 查看所有学生 学生列表中无ID为002的记录,文本文件中对应行被删除
Excel模式-GPA查询 1. 选择Excel模式;2. 添加2个GPA=3.5的学生;3. 按GPA=3.5查询 查询结果返回2条记录,Excel文件中数据正确保存
模式切换(List→Excel) 1. List模式添加3名学生;2. 切换到Excel模式;3. 在Excel模式查看所有学生 Excel模式下能看到3名学生信息,数据完整无丢失
ID重复添加验证 1. 任意模式;2. 连续添加相同ID的学生 第二次添加失败,提示“ID已存在”
文本文件权限不足处理 1. 选择文本模式;2. 将文件设置为只读;3. 尝试添加学生 操作失败,提示“文件写入失败,请检查权限”

5.2 测试结果分析

所有测试用例均通过验证,关键结果说明:

  1. 三种存储模式独立运行正常,数据操作结果符合预期
  2. 模式切换功能实现数据完整迁移,无信息丢失
  3. 异常处理机制有效:
    • 文件不存在时自动创建新文件
    • 权限不足时给出明确错误提示
    • ID重复添加被有效拦截

发现的问题及修复:

  • 问题:Excel模式中GPA读取为字符串类型导致查询失败
  • 修复方案:使用cell.getNumericCellValue()方法正确获取数值
    // 修复前
    double gpa = Double.parseDouble(cell.getStringCellValue());
    // 修复后
    double gpa = cell.getNumericCellValue();
    

六、项目总结

6.1 完成情况

已完全实现需求中规定的所有功能:

  • 三种存储模式(List/文本/Excel)的独立运行与自由切换
  • 完整保留原系统的所有核心功能与交互逻辑
  • 实现模式切换时的数据自动迁移
  • 完善的异常处理机制

6.2 收获与不足

收获

  1. 深入理解DAO模式的设计思想,掌握接口与实现分离的编程技巧
  2. 熟练运用Java IO流进行文本文件操作,掌握POI库处理Excel文件的方法
  3. 学会使用工厂模式实现对象创建的解耦,提升系统扩展性

不足

  1. 文本文件存储未实现数据加密,存在数据泄露风险
  2. Excel模式查询效率较低,未实现索引机制
  3. 大数据量(10000+条记录)下内存占用较高

6.3 改进方向

  1. 功能扩展

    • 新增MySQL数据库存储模式,实现JDBCStudentDAO
    • 添加数据导出功能,支持在任意模式下导出为Excel
  2. 性能优化

    • 为文本和Excel存储添加索引文件,提升查询速度
    • 实现分页查询,减少大数据量下的内存消耗
  3. 安全增强

    • 对文本和Excel文件进行AES加密处理
    • 添加用户认证机制,区分管理员和普通用户权限

通过本次改造,系统的可扩展性和实用性得到显著提升,充分体现了DAO模式在数据访问层设计中的优势,为后续功能迭代奠定了良好基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/936943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pringcloud 中的gateway详解一下,其中的原理

🚪 一、Spring Cloud Gateway 是什么? Spring Cloud Gateway 是基于 Spring WebFlux(反应式编程模型) 实现的 API 网关, 它是 Spring Cloud 官方推荐替代 Zuul 1.x 的网关组件。 在整个微服务架构中,它是:🧩…

Hive -2025/8/19

分布式SQL计算Hive 基础架构切换java版本 ln -sfn /export/server/jdk1.8.0_361 /export/server/jdk # 切换回 JDK8 ln -sfn /export/server/jdk-17.0.12 /export/server/jdk # 切换到 JDK17#启动HDFS start-dfs.s…

2025年10月学术会议全名单!科研人请抢先收藏,别错过关键节点!

2025年10月,全球学术界迎来了一系列高水平的国际会议,涵盖了网络通信、人工智能、智能制造等多个前沿领域。以下是这些会议的详细介绍和时间安排,为相关领域的学者和研究人员提供参考。 第三届网络、通信与智能计算…

用 Python + Vue3 打造超炫酷音乐播放器:网易云歌单爬取 + Three.js 波形可视化

用Python + Vue3 打造超炫酷音乐播放器*项目背景:一直想做一个属于自己的音乐播放器,既能听歌,又有炫酷的视觉效果。于是,我结合 Python 爬虫能力 与 Vue3 前端生态,打造了一个集网易云音乐数据获取 + Web Audio …

读书笔记:时间戳(TIMESTAMP)类型:比日期更强大的时间管理工具

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学…

python对比“解包赋值”和 match 语句中的“解构”

🎯 核心区别一句话总结:普通解包赋值:只做“拆包 + 赋值”,不检查类型或结构是否匹配(错了就报错)。 match 中的解构:先检查结构/类型是否匹配,匹配成功才解包赋值,否则跳过。一、场景:处理一个表示点的元组…

2025 防静电/耐高温/耐低温/耐湿耐水/防油/耐酸耐碱/进口原料塑烧板厂家推荐榜单:聚焦高效过滤解决方案

在工业除尘与粉体回收领域,塑烧板凭借过滤精度高、使用寿命长、适应复杂工况等优势,成为众多企业的核心设备选择。结合技术实力、市场口碑与应用反馈,以下为大家梳理出五家值得关注的塑烧板厂家,供行业采购与选型参…

2025 优质的数控/空心管/螺旋/钢带/方向盘/伺服/液压/不锈钢带/桶箍/抱箍/卡箍/弹簧打圈机厂家推荐榜单:聚焦精度与服务的实力之选

在金属线材成型领域,打圈机的精度、稳定性与适配性直接影响制造企业的生产效率与产品质量。当前市场上设备厂家资质参差不齐,为帮助行业伙伴精准选择靠谱供应商,结合生产规模、技术实力、产品性能及服务能力等多维度…

在线PS(Photoshop网页版)如何加马赛克,保护隐私的小技巧

在这个信息化的时代,保护隐私显得尤为重要。尤其是在日常分享图片时,无论是朋友圈中晒出的聚会照片,还是协作工作中发送的档案截图,都需要对部分信息做模糊处理。今天,我想和大家分享一个快速给图片加马赛克的小技…

2025 深圳点胶机厂家实用推荐榜:从精密制造到行业适配的优选指南

在智能制造升级的浪潮中,点胶机作为精密流体控制的核心设备,其性能直接影响电子制造、新能源、半导体等领域的生产质量与效率。随着高精度、智能化需求的持续增长,选择适配的设备厂家成为制造企业降本增效的关键。以…

观点分享:Oracle数据库GRID升级的案例的闲聊

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。今天我们来聊…

2025 广东洗头机厂家推荐榜:从家用到商用的品质之选

在生活节奏加快与洗护需求升级的双重驱动下,智能洗头机正逐渐走进家庭、美发门店、养老机构等多个场景,成为提升洗护效率与体验的重要设备。本次结合产品品质、技术实力、场景适配性及市场口碑等维度,筛选出 5 家值…

深入解析:XC7A100T-2CSG324I 赛灵思 Xilinx AMD Artix-7 FPGA

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025北京优质拆迁/征地/征拆/动迁/腾退/强拆/房产/烂尾楼/行政诉讼/行政赔偿律师事务所所推荐:聚焦专业实力与服务价值

在法律需求日益多元化的今天,选择一家专业可靠的律师事务所成为解决纠纷、规避风险的关键。北京作为国内法律服务的核心高地,汇聚了众多实力强劲的律所。以下结合专业能力、服务口碑与实务表现,推荐五家各具特色的律…

excel单元格粘贴显示科学计数法,需要展示完整的字符串的解决方法

excel单元格粘贴显示科学计数法,需要展示完整的字符串的解决方法1.现象 excel 2007粘贴会显示科学计数法,无法完整显示字符 2.解决方法 可以使用企业微信的在线表格或者使用wps的在线表格

2025 佛山高尔夫模拟器厂家推荐:从家庭到专业场景的靠谱之选

随着室内高尔夫运动的兴起,模拟器设备成为连接大众与这项运动的重要桥梁。但市场上品牌繁杂,技术参数与场景适配性差异较大,给消费者选择带来困扰。结合技术测评、用户反馈及场景适配能力,以下推荐五家各有优势的高…

跨越三年周期、几十部门、上千零部件:庞大整车研发项目如何被清晰掌控?

在整车研发的复杂世界里,团队、部门、零部件和流程交织成一张庞大网络。本文带你探索如何通过现代化管理方法实现整车研发全程可视、可拆解、可控。在整车研发的复杂世界里,团队、部门、零部件和流程交织成一张庞大网…

【SPIE出版】2025计算机视觉和影像计算国际学术会议

2025计算机视觉和影像计算国际学术研究会议将于2025年11月21-11日23日在中国香港举办,本次“计算机视觉和影像计算国际研讨会”旨在汇聚来自学术界和工业界的研究人员和专家,共同探讨计算机视觉与影像计算领域的最新…

2025 年济南画室最新推荐排行榜权威发布,含小班教学、全封闭管理机构及素描课、寒暑假班、高考集训选择指南

随着济南艺考热度持续攀升,美术生及家长对优质画室的需求愈发迫切,但当前市场上画室数量繁杂,资质参差不齐。部分机构缺乏正规教学资质,师资水平不稳定,采用大班粗放教学模式,难以兼顾不同基础学生的学习需求;还…