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

于鸿硕项目案例作业03

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

1. DAO 接口方法

DAO(Data Access Object)接口定义了学生数据操作的统一规范,所有数据存取模式都需实现该接口,保证操作方式的一致性。

public interface StudentDAO {void addStudent(Student student);void removeStudent(Student student);List<Student> getStudents();List<Student> searchByName(String name);List<Student> searchByMajor(String major);List<Student> searchByGpa(double gpa);}

1.1 addStudent

  • 作用:向数据存储中添加一个学生对象

  • 说明:接收Student实体对象,将其存入对应的数据载体(List 或文件)中

1.2 removeStudent

  • 作用:从数据存储中移除指定学生对象

  • 说明:接收Student实体对象,从数据载体中删除该对象

1.3 getStudents

  • 作用:获取所有学生数据

  • 说明:返回存储中所有学生的列表,用于展示全部数据

1.4 searchByName

  • 作用:按姓名搜索学生

  • 说明:接收姓名字符串,返回所有姓名匹配的学生列表

1.5 searchByMajor

  • 作用:按专业搜索学生

  • 说明:接收专业字符串,返回所有专业匹配的学生列表

1.6 searchByGpa

  • 作用:按 GPA 搜索学生

  • 说明:接收 GPA 数值,返回所有 GPA 匹配的学生列表


2. List 模式(内存存储)

2.1 List 模式的核心逻辑

List 模式以内存中的ArrayList作为数据载体,数据仅在程序运行时存在,程序退出后数据丢失。

public class StudentListDAO implements StudentDAO {private List\<Student> students;  // 核心数据存储载体public StudentListDAO() {students = new ArrayList<>();  // 初始化内存列表}// 接口实现方法...}

2.2 List 模式的接口应用

通过实现StudentDAO接口,完成内存中数据的操作:

public class StudentListDAO implements StudentDAO {// 成员变量及构造方法见2.1@Overridepublic void addStudent(Student student) { ... }@Overridepublic void removeStudent(Student student) { ... }@Overridepublic List\<Student> getStudents() { ... }@Overridepublic List\<Student> searchByName(String name) { ... }@Overridepublic List\<Student> searchByMajor(String major) { ... }@Overridepublic List\<Student> searchByGpa(double gpa) { ... }}

2.3 List 模式方法说明

  1. addStudent
@Overridepublic void addStudent(Student student) {students.add(student);}
  • 作用:向内存列表中添加学生

  • 逻辑:直接调用ArrayListadd()方法存储学生对象

  1. removeStudent
@Overridepublic void removeStudent(Student student) {students.remove(student);}
  • 作用:从内存列表中删除学生

  • 逻辑:调用ArrayListremove()方法移除指定学生对象

  1. getStudents
@Overridepublic List\<Student> getStudents() {return students;}
  • 作用:获取所有学生数据

  • 逻辑:直接返回内存列表的引用

  1. searchByName
@Overridepublic List\<Student> searchByName(String name) {List\<Student> result = new ArrayList<>();for (Student student : students) {if (student.getName().equals(name)) {result.add(student);}}return result;}
  • 作用:按姓名筛选学生

  • 逻辑:遍历内存列表,将姓名匹配的学生存入结果列表并返回

  1. searchByMajor
@Overridepublic List\<Student> searchByMajor(String major) {List\<Student> result = new ArrayList<>();for (Student student : students) {if (student.getMajor().equals(major)) {result.add(student);}}return result;}
  • 作用:按专业筛选学生

  • 逻辑:遍历内存列表,将专业匹配的学生存入结果列表并返回

  1. searchByGpa
@Overridepublic List\<Student> searchByGpa(double gpa) {List\<Student> result = new ArrayList<>();for (Student student : students) {if (student.getGpa() == gpa) {result.add(student);}}return result;}
  • 作用:按 GPA 筛选学生

  • 逻辑:遍历内存列表,将 GPA 匹配的学生存入结果列表并返回


3. 文本文件模式(持久化存储)

3.1 文本文件模式的核心逻辑

文本文件模式以students.txt文件作为数据载体,通过文件 IO 实现数据的持久化存储(程序退出后数据不丢失)。核心逻辑是 "加载 - 操作 - 保存":初始化时从文件加载数据到内存列表,操作后将内存列表同步到文件。

public class StudentFileDAO implements StudentDAO {private static final String FILE\_PATH = "students.txt";  // 文件路径private List\<Student> students;  // 内存缓存列表public StudentFileDAO() {students = loadFromFile();  // 初始化时从文件加载数据}// 从文件加载数据到内存private List\<Student> loadFromFile() { ... }// 将内存数据保存到文件private void saveToFile() { ... }// 接口实现方法...}

3.2 文本文件模式的接口应用

实现StudentDAO接口,通过文件 IO 完成数据的持久化操作:

public class StudentFileDAO implements StudentDAO {// 成员变量、构造方法及工具方法见3.1@Overridepublic void addStudent(Student student) { ... }@Overridepublic void removeStudent(Student student) { ... }@Overridepublic List\<Student> getStudents() { ... }@Overridepublic List\<Student> searchByName(String name) { ... }@Overridepublic List\<Student> searchByMajor(String major) { ... }@Overridepublic List\<Student> searchByGpa(double gpa) { ... }}

3.3 文本文件模式方法说明

  1. loadFromFile(工具方法)
private List\<Student> loadFromFile() {List\<Student> list = new ArrayList<>();File file = new File(FILE\_PATH);if (!file.exists()) {return list;  // 文件不存在则返回空列表}try (BufferedReader br = new BufferedReader(new FileReader(file))) {String line;while ((line = br.readLine()) != null) {// 解析文件内容为Student对象String\[] parts = line.split(",");if (parts.length == 6) {String name = parts\[0];int age = Integer.parseInt(parts\[1]);String gender = parts\[2];String id = parts\[3];String major = parts\[4];double gpa = Double.parseDouble(parts\[5]);list.add(new Student(name, age, gender, id, major, gpa));}}} catch (IOException e) {e.printStackTrace();}return list;}
  • 作用:从文件读取数据并转换为学生列表

  • 逻辑:使用BufferedReader读取文件,按行解析字符串为Student对象

  1. saveToFile(工具方法)
private void saveToFile() {try (BufferedWriter bw = new BufferedWriter(new FileWriter(FILE\_PATH))) {for (Student student : students) {// 将Student对象转换为字符串并写入文件String line = String.join(",",student.getName(),String.valueOf(student.getAge()),student.getGender(),student.getId(),student.getMajor(),String.valueOf(student.getGpa()));bw.write(line);bw.newLine();}} catch (IOException e) {e.printStackTrace();}}
  • 作用:将内存中的学生列表写入文件

  • 逻辑:遍历学生列表,将对象属性拼接为字符串(逗号分隔),通过BufferedWriter写入文件

  1. addStudent
@Overridepublic void addStudent(Student student) {students.add(student);saveToFile();  // 添加后同步到文件}
  • 作用:添加学生并持久化到文件

  • 逻辑:先添加到内存列表,再调用saveToFile()同步到文件

  1. removeStudent
@Overridepublic void removeStudent(Student student) {students.remove(student);saveToFile();  // 删除后同步到文件}
  • 作用:删除学生并更新文件

  • 逻辑:先从内存列表删除,再调用saveToFile()同步到文件

  1. getStudents
@Overridepublic List\<Student> getStudents() {return students;}
  • 作用:获取所有学生数据

  • 逻辑:返回内存缓存的学生列表(已从文件加载)

  1. searchByName、searchByMajor、searchByGpa
  • 实现逻辑与 List 模式完全一致(基于内存列表遍历筛选)

  • 区别:数据来源是从文件加载的内存列表,而非直接初始化的空列表

3.4 文本文件模式的特殊用法

  1. try-with-resources 语法

    自动关闭文件流,避免资源泄露:

try (BufferedReader br = new BufferedReader(new FileReader(file))) {// 读取操作} catch (IOException e) {e.printStackTrace();}
  1. 字符串分割与解析

    使用split(",")分割文件中的字符串,并通过Integer.parseInt()Double.parseDouble()转换数据类型:

String\[] parts = line.split(",");int age = Integer.parseInt(parts\[1]);double gpa = Double.parseDouble(parts\[5]);
  1. 文件不存在处理

    初始化时检查文件是否存在,不存在则返回空列表,避免空指针异常:

File file = new File(FILE\_PATH);if (!file.exists()) {return list;}

4. 主程序修改部分

4.1 主程序的核心修改

  1. 引入 DAO 接口依赖

    主程序不再直接操作 List,而是通过StudentDAO接口调用方法:

StudentDAO studentDAO;  // 声明接口类型,不依赖具体实现
  1. 支持模式选择与切换

    允许用户选择数据存储模式,并在运行中切换:

// 初始化选择模式System.out.println("请选择数据存储模式:");System.out.println("1. 内存模式(List)");System.out.println("2. 文件模式");int modeChoice = scanner.nextInt();studentDAO = modeChoice == 1 ? new StudentListDAO() : new StudentFileDAO();// 运行中切换模式(菜单选项7)case 7:System.out.println("请选择数据存储模式:");modeChoice = scanner.nextInt();studentDAO = modeChoice == 1 ? new StudentListDAO() : new StudentFileDAO();System.out.println("模式切换成功");break;
  1. 统一操作接口

    所有数据操作通过studentDAO接口完成,与具体存储模式解耦:

// 添加学生studentDAO.addStudent(student);// 搜索学生List\<Student> searchResults = studentDAO.searchByName(searchName);// 显示所有学生List\<Student> studentList = studentDAO.getStudents();

4.2 修改的好处与作用

  1. 实现数据存储模式的自由切换

    用户可根据需求选择内存模式(临时数据,速度快)或文件模式(持久化数据,可保存),无需修改核心逻辑。

  2. 降低代码耦合度

    主程序仅依赖StudentDAO接口,不关心具体实现,符合 "依赖倒置原则"。

  3. 提高扩展性

    若后续需添加数据库存储模式,只需新增StudentDBDAO实现接口,主程序无需修改。

  4. 统一操作方式

    两种模式的操作接口完全一致,用户无需学习新的操作逻辑。

5. 拓展:DAO 模式详解

5.1 DAO 模式的含义与作用

DAO 模式是一种数据访问层设计模式,用于隔离业务逻辑与数据访问逻辑。其核心思想是:

  • 定义DAO接口:规范数据操作方法

  • 实现DAO实现类:针对不同数据存储方式(如内存、文件、数据库)提供具体实现

  • 通过接口调用:业务逻辑层仅依赖接口,不依赖具体存储方式

作用:

  • 分离数据访问与业务逻辑,降低耦合度

  • 统一数据操作接口,简化业务层代码

  • 便于切换数据存储方式,提高系统扩展性

5.2 本系统中 DAO 模式的优势

  1. 多存储模式支持:通过实现不同 DAO,轻松支持 List(内存)和文本文件(持久化)两种模式。

  2. 操作一致性:无论使用哪种存储模式,添加、删除、查询的方法名和参数完全一致。

  3. 可维护性提升:数据访问逻辑集中在 DAO 实现类中,修改存储方式时无需改动主程序。

  4. 可扩展性增强:如需添加数据库存储,只需新增StudentDBDAO实现接口,主程序代码不变。

5.3 适合使用 DAO 模式的系统

  1. 需要多种数据存储方式的系统:如同时支持内存缓存、文件存储、数据库存储的系统。

  2. 数据访问逻辑复杂的系统:通过 DAO 封装数据操作,简化业务层代码。

  3. 需要长期维护和扩展的系统:DAO 模式的低耦合特性便于后期功能迭代。

  4. 分层架构的系统:在 MVC 等分层架构中,DAO 作为数据访问层,可清晰划分各层职责。

http://www.hskmm.com/?act=detail&tid=32196

相关文章:

  • restful接口返回忽略字段 jackon的@JsonIgnore注解应用
  • Windows系统-应用问题全面剖析Ⅱ:德承工控机DC-1300在Windows操作系统下[TPM功能]设置教程 - Johnny
  • 挂在天上放光明,好像一群IDA*
  • 元推理框架,是逻辑产物,也是逻辑功能,佛渡有缘人
  • 2025 年国内铝型材源头厂家最新推荐排行榜:聚焦优质企业核心优势,为下游企业精准采购提供专业参考
  • 基于遗传方法的动态多目标优化算法
  • 【linux内核】内核类型
  • 2025年脱模剂混合机厂家最新推荐排行榜,高效混合机,立式混合机,卧式混合机,化工混合机,脱模剂专用混合设备厂家精选
  • 神经网络_读书报告
  • Python.爬虫练习
  • vivo HDFS EC大规模落地实践
  • 防抖函数节流函数 - 东方不败-
  • 中电金信:从AI赋能到AI原生——企业级工具链平台重塑与建设实践
  • 基于TMS320F28377D双核芯片的开发例程
  • C# Avalonia 16- Animation- AnimateVisual
  • 元推理:自指自洽,无所住而生其心,良性循环就好
  • DA (Domain Adaptation,域适应)
  • 多模态大模型是新一代人工智能技术范式
  • Android四大组件之一Activity简介
  • WPF应用绑定系统快捷键
  • 2025年篷布厂家最新推荐排行榜,多功能防水篷布、聚乙烯篷布、帐篷/汽车/宴会盖布、盖草布、泳池布、微喷水带、日用盖布、农林用篷布、重型机器用篷布公司精选
  • 2025年轻钢龙骨/铝方通/铝单板/石膏板厂家最新权威推荐榜单:专业生产与品质保障深度解析
  • 2025年彩钢瓦/镀锌板/折弯件/C型钢/Z型钢/压型瓦/楼承板/次檩条厂家最新推荐排行榜,钢结构安装服务与金属构件生产实力深度解析
  • 2025年发电机组厂家最新权威推荐榜:柴油/燃气/船用/静音箱式/移动拖车/集装箱式,涵盖上柴/玉柴/潍柴/康明斯/沃尔沃/道依茨/帕金斯/MTU品牌
  • 程序员面试、算法研究、机器学习、大模型/ChatGPT/AIGC、论文审稿、具身智能/人形机器人、RAG等20大系列集锦
  • 2025年精密磨床/CNC加工厂家最新权威推荐榜:涵盖车床/铣床/多轴/复合加工,铝/不锈钢/钛合金/模具钢/塑料件定制,专攻汽车/医疗/航空航天/机器人零件及注塑模具
  • 2025 年最新推荐导轨丝杆源头厂家排行榜:聚焦优质货源,助力企业精准选品直线/滚珠/孚雷/恒而达导轨丝杆厂家推荐
  • 有没有什么比较好用的拼图工具?
  • 2025年鸡精生产线厂家最新权威推荐榜:高速混合机/WDG农药生产线/鸡粉干燥设备/海鲜精干燥设备/调味料干燥成套系统专业解析
  • 2025年法兰保护罩厂家最新推荐排行榜,阀门保温罩,法兰罩,法兰防溅罩,法兰保护套,专业定制与防护性能深度解析