宠物管理系统:Dao层

模仿三层架构中的Dao层,是数据访问层,不同的是并非从数据库中获取数据,而是从文件中获取数据。

BaseDao:最基本的数据访问,包括数据的获取和保存。

java 复制代码
package com.wzb.dao;

import java.io.*;
import java.util.ArrayList;

public class BaseDao {

    // 保存数据到文件
    public <T> void saveToFile(String filename, ArrayList<T> list) {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename))) {
            oos.writeObject(list);
            oos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 从文件加载数据
    public <T> ArrayList<T> loadFromFile(String filename) {
        ArrayList<T> list = new ArrayList<>();
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename))) {
            list = (ArrayList<T>) ois.readObject();
        } catch (FileNotFoundException e) {
            // 文件不存在,返回空列表
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return list;
    }
}

UserDao:专门用于处理用户的数据。

java 复制代码
package com.wzb.dao;

import com.wzb.bean.User;

import java.util.ArrayList;

public interface UserDao {
    public Integer getNextId();

    void insert(User user);

    ArrayList<User> getAllUser();

    public void saveUpdatedUserById(User updatedUser);

    public void deleteUserById(int id);
}
java 复制代码
package com.wzb.dao.impl;

import com.wzb.bean.User;
import com.wzb.dao.BaseDao;
import com.wzb.dao.UserDao;
import com.wzb.utils.md5.MD5Util;

import java.util.ArrayList;

public class UserDaoImpl extends BaseDao implements UserDao {

    private static final String USER_FILE = "users.dat";
    private ArrayList<User> users;

    public Integer getNextId() {
        users = loadFromFile(USER_FILE);
        if (users.isEmpty()) {
            return 0;  // 如果没有宠物,ID 从 1 开始
        } else {
            return users.get(users.size() - 1).getId() + 1;
        }
    }

    // 构造函数:初始化用户数据
    public UserDaoImpl() {
        users = loadFromFile(USER_FILE); // 每次加载最新数据
        // 如果文件为空,添加管理员账户
        if (users.isEmpty()) {
            User admin = new User(getNextId(), "wzb", MD5Util.md5("123456"), "123456", Integer.MAX_VALUE);
            users.add(admin);
            saveToFile(USER_FILE, users);  // 保存管理员账户到文件
        }
    }

    @Override
    public void insert(User user) {
        users.add(user);
        saveToFile(USER_FILE, users);  // 每次插入后保存
    }

    @Override
    public ArrayList<User> getAllUser() {
        users = loadFromFile(USER_FILE);  // 每次获取都从文件重新加载
        return users;
    }

    @Override
    public void saveUpdatedUserById(User updatedUser) {
        // 查找并更新用户
        for (int i = 0; i < users.size(); i++) {
            if (users.get(i).getId().equals(updatedUser.getId())) {
                users.set(i, updatedUser);  // 替换旧用户信息
                saveToFile(USER_FILE, users);  // 保存更新后的数据
                return;
            }
        }
    }

    @Override
    public void deleteUserById(int id) {
        // 删除指定 ID 的用户
        users.removeIf(user -> user.getId() == id);
        saveToFile(USER_FILE, users);  // 删除后立刻保存
    }
}

PetDao:专门用于宠物数据的处理。

java 复制代码
package com.wzb.dao;

import com.wzb.bean.Pet;

import java.util.ArrayList;

public interface PetDao {
    int getNextId();

    void insert(Pet pet);

    ArrayList<Pet> getAllPet();

    public void saveUpdatedPetById(Pet updatedPet);

    public boolean deletePetById(int id);
}
java 复制代码
package com.wzb.dao.impl;

import com.wzb.bean.Pet;
import com.wzb.dao.BaseDao;
import com.wzb.dao.PetDao;

import java.util.ArrayList;
import java.util.Collections;

public class PetDaoImpl extends BaseDao implements PetDao {
    private static final String PET_FILE = "pets.dat";
    private ArrayList<Pet> pets;

    public int getNextId() {
        pets = loadFromFile(PET_FILE);
        if (pets.isEmpty()) {
            return 0;
        } else {
            return pets.get(pets.size() - 1).getId() + 1;
        }
    }

    public PetDaoImpl() {
        pets = loadFromFile(PET_FILE); // 每次加载最新数据
        // 如果文件为空,添加一猫一狗
        if (pets.isEmpty()) {
            Pet king = new Pet(0, "wzb-pet", 10, 70.0, "food", Integer.MAX_VALUE, 1);
            Pet dog = new Pet(1, "旺财", 2, 20.0, "bone", 500, 1);
            Pet cat = new Pet(2, "哈基米", 1, 15.0, "fish", 500, 2);
            Collections.addAll(pets, king, dog, cat);
            saveToFile(PET_FILE, pets);
        }
    }

    @Override
    public void insert(Pet pet) {
        pets.add(pet);
        saveToFile(PET_FILE, pets);  // 每次插入后保存
    }

    @Override
    public ArrayList<Pet> getAllPet() {
        pets = loadFromFile(PET_FILE);  // 每次获取都从文件重新加载
        return pets;
    }

    @Override
    public void saveUpdatedPetById(Pet updatedPet) {
        // 查找并更新用户
        for (int i = 0; i < pets.size(); i++) {
            if (pets.get(i).getId().equals(updatedPet.getId())) {
                pets.set(i, updatedPet);  // 替换旧用户信息
                saveToFile(PET_FILE, pets);  // 保存更新后的数据
                return;
            }
        }
    }

    @Override
    public boolean deletePetById(int id) {
        // 删除指定 ID 的用户
        pets.removeIf(pet -> pet.getId() == id);
        saveToFile(PET_FILE, pets);  // 删除后立刻保存
        return true;
    }
}
相关推荐
eLIN TECE17 分钟前
springboot和springframework版本依赖关系
java·spring boot·后端
SomeB1oody18 分钟前
【Python深度学习】3.4. 循环神经网络(RNN)实战:预测股价
开发语言·人工智能·python·rnn·深度学习·机器学习
良木生香27 分钟前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
老神在在00133 分钟前
Spring Bean 的六种作用域详解
java·后端·spring
仙草不加料35 分钟前
互联网大厂Java面试故事实录:三轮场景化技术提问与详细答案解析
java·spring boot·微服务·面试·aigc·电商·内容社区
程序员老邢41 分钟前
【技术底稿 19】Redis7 集群密码配置 + 权限锁死 + 磁盘占满连锁故障真实排查全记录
java·服务器·经验分享·redis·程序人生·微服务
Bug 挖掘机42 分钟前
一篇理清Prompt,Skill,MCP之间的区别
开发语言·软件测试·python·功能测试·测试开发·prompt·ai测试
寒秋花开曾相惜1 小时前
(学习笔记)4.1 Y86-64指令集体系结构(4.1.4 Y86-64异常&4.1.5 Y86-64程序)
开发语言·jvm·数据结构·笔记·学习
落魄江湖行1 小时前
基础篇一 Java 有了 int 为什么还要 Integer?它们到底差在哪?
java·面试·八股文
码界筑梦坊2 小时前
302-基于Python的安卓应用市场数据可视化分析推荐系统
开发语言·python·信息可视化·毕业设计·fastapi