模仿三层架构中的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;
}
}