1、创建实体类Book
package com.work.pojo;
import java.io.Serializable;
/**
* @Author: 憨憨浩浩
* @CreateTime: 2023-12-23 15:08
* @Description: 创建图书实体类
*/
public class Book implements Serializable {
// 生成serialVersionUID
private static final long serialVersionUID = -8180604591919457929L;
private int id;
private String name;
private String author;
private double price;
public Book() {
}
public Book(int id, String name, String author, double price) {
this.id = id;
this.name = name;
this.author = author;
this.price = price;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
2、创建数据访问层接口BookDao
package com.work.dao;
import com.work.pojo.Book;
import java.util.List;
/**
* @Author: 憨憨浩浩
* @CreateTime: 2023-12-23 15:22
* @Description: 数据访问层--BookDao接口
*/
public interface BookDao {
// 添加图书
public boolean addBook(Book book);
// 根据id查询图书
public Book findBookById(int id);
// 根据id删除图书
public boolean deleteBookById(int id);
// 根据id修改图书价格
public boolean updatePriceById(int id ,double price);
// 查询全部图书
public List<Book> selectBooks();
}
3、实现数据访问层接口BookDaoImpl
package com.work.dao.impl;
import com.work.dao.BookDao;
import com.work.pojo.Book;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: 憨憨浩浩
* @CreateTime: 2023-12-23 15:26
* @Description: 数据访问层--BookDao实现类BookDaoImpl
*/
public class BookDaoImpl implements BookDao {
// 文件路径
private static String path = "F:\\Java\\JavaSE\\Day20\\file\\books.txt";
// 创建一个集合接受图书
private List<Book> books;
// 初始化保存书籍的文件
static {
// 声明保存图书信息的文件
File file = new File(path);
//获取文件的父文件夹
File parentFile = file.getParentFile();
// 判断是否存在,不存在则创建
if (!parentFile.exists()){
parentFile.mkdirs();
}
// 判断文件是否存在,不存在创建文件并初始化
if (!file.exists()){
// 集合接收图书
List<Book> books = new ArrayList<>();
// 创建流
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(file));
// 操作流
oos.writeObject(books);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流
try {
if (oos != null)
oos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
/**
* @description: 添加图书
* @author: 憨憨浩浩
* @date: 2023/12/23 15:45
* @param: [book]
* @return: boolean
**/
@Override
public boolean addBook(Book book) {
// 获取图书集合
readBooks();
// 添加图书
books.add(book);
// 重新将集合写入文件
writeBooks();
return true;
}
/**
* @description: 根据id查询图书
* @author: 憨憨浩浩
* @date: 2023/12/23 16:03
* @param: [id]
* @return: com.work.pojo.Book
**/
@Override
public Book findBookById(int id) {
// 获取图书集合
readBooks();
// 遍历集合
for (Book book : books) {
if (id == book.getId()){
return book;
}
}
return null;
}
/**
* @description: 根据id删除图书
* @author: 憨憨浩浩
* @date: 2023/12/23 16:05
* @param: [id]
* @return: boolean
**/
@Override
public boolean deleteBookById(int id) {
// 获取图书集合
readBooks();
// 遍历集合
for (Book book : books) {
if (id == book.getId()){
books.remove(book);
// 写入数据
writeBooks();
return true;
}
}
return false;
}
/**
* @description: 根据id修改图书价格
* @author: 憨憨浩浩
* @date: 2023/12/23 16:08
* @param: [id, price]
* @return: boolean
**/
@Override
public boolean updatePriceById(int id ,double price) {
// 获取图书集合
readBooks();
// 遍历集合
for (Book book : books) {
if (id == book.getId()){
book.setPrice(price);
// 写入数据
writeBooks();
return true;
}
}
return false;
}
/**
* @description: 查询全部图书
* @author: 憨憨浩浩
* @date: 2023/12/23 17:04
* @param: []
* @return: java.util.List<com.work.pojo.Book>
**/
@Override
public List<Book> selectBooks() {
// 获取图书集合
readBooks();
return books;
}
/**
* @description: 读取文件中的集合对象,并返回到books集合中
* @author: 憨憨浩浩
* @date: 2023/12/23 15:47
* @param: []
* @return: java.util.List<com.work.pojo.Book>
**/
private void readBooks(){
// 创建流(反序列化流)
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(path));
// 操作流
books = (List<Book>) ois.readObject();
} catch (EOFException e) {
books = new ArrayList<>();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭流
try {
if (ois != null)
ois.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
/**
* @description: 将修改后的图书集合写入到文件中
* @author: 憨憨浩浩
* @date: 2023/12/23 15:55
* @param: []
* @return: boolean
**/
private void writeBooks(){
// 创建流(序列化流)
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(path));
// 操作流
oos.writeObject(books);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流
try {
if (oos != null)
oos.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
4、创建业务逻辑层接口BookService
package com.work.service;
import com.work.pojo.Book;
import java.util.List;
/**
* @Author: 憨憨浩浩
* @CreateTime: 2023-12-23 16:09
* @Description: 业务逻辑层--BookService
*/
public interface BookService {
// 添加图书
public boolean addBook(Book book);
// 根据id删除图书
public boolean deleteBookById(int id);
// 根据id修改图书价格
public boolean updatePriceById(int id ,double price);
// 查询全部图书
public List<Book> selectBooks();
}
5、实现业务逻辑层接口BookServiceImpl
package com.work.service.impl;
import com.work.dao.BookDao;
import com.work.dao.impl.BookDaoImpl;
import com.work.pojo.Book;
import com.work.service.BookService;
import java.util.List;
/**
* @Author: 憨憨浩浩
* @CreateTime: 2023-12-23 16:11
* @Description: 业务逻辑层--BookService实现类BookServiceImpl
*/
public class BookServiceImpl implements BookService {
// 创建数据层持久层对象
private BookDao bookDao = new BookDaoImpl();
/**
* @description: 添加图书
* @author: 憨憨浩浩
* @date: 2023/12/23 16:16
* @param: [book]
* @return: boolean
**/
@Override
public boolean addBook(Book book) {
// 根据id查询图书,为null表示没有该图书,添加图书
if (bookDao.findBookById(book.getId()) == null){
bookDao.addBook(book);
return true;
}
return false;
}
/**
* @description: 根据id删除图书
* @author: 憨憨浩浩
* @date: 2023/12/23 16:18
* @param: [id]
* @return: boolean
**/
@Override
public boolean deleteBookById(int id) {
return bookDao.deleteBookById(id);
}
/**
* @description: 根据id修改图书价格
* @author: 憨憨浩浩
* @date: 2023/12/23 16:19
* @param: [id, price]
* @return: boolean
**/
@Override
public boolean updatePriceById(int id, double price) {
return bookDao.updatePriceById(id,price);
}
/**
* @description: 查询全部图书
* @author: 憨憨浩浩
* @date: 2023/12/23 16:20
* @param: []
* @return: java.util.List<com.work.pojo.Book>
**/
@Override
public List<Book> selectBooks() {
List<Book> books = bookDao.selectBooks();
for (Book book : books) {
System.out.println(book);
}
return books;
}
}
6、创建测试类
package com.work.test;
import com.work.pojo.Book;
import com.work.service.impl.BookServiceImpl;
import java.util.List;
import java.util.Scanner;
/**
* @Author: 憨憨浩浩
* @CreateTime: 2023-12-23 16:21
* @Description: 图书管理系统测试类
*/
public class BookTest {
public static void main(String[] args) {
// 定义扫描器
Scanner scan = new Scanner(System.in);
// 定义bookServiceImpl实现类
BookServiceImpl bookService = new BookServiceImpl();
// 打印系统头部
System.out.println("******************************");
System.out.println("*********图书管理系统**********");
System.out.println("******************************");
while (true){
System.out.println("1、添加图书 2、根据id修改图书价格 3、根据id删除图书 4、查询所有图书 0、退出");
System.out.println("请输入你操作的编号:");
// 定义变量接收输入的操作编号
int num = scan.nextInt();
switch (num){
case 1: // 添加图书
System.out.println("请输入书籍id:");
int id = scan.nextInt();
System.out.println("请输入书籍名称:");
String name = scan.next();
System.out.println("请输入书籍作者:");
String author = scan.next();
System.out.println("请输入书籍价格:");
double price = scan.nextDouble();
Book book = new Book(id,name,author,price);
// 添加图书
if (bookService.addBook(book)){
System.out.println("添加成功");
} else {
System.out.println("添加失败");
}
break;
case 2: // 根据id修改图书价格
System.out.println("请输入你要修改的书籍id:");
id = scan.nextInt();
System.out.println("请输入你要修改的书籍价格:");
price = scan.nextDouble();
// 根据id修改图书价格
if (bookService.updatePriceById(id,price)){
System.out.println("修改成功");
} else {
System.out.println("修改失败");
}
break;
case 3: // 根据id删除图书
System.out.println("请输入你要删除的书籍id:");
id = scan.nextInt();
// 根据id删除图书
if (bookService.deleteBookById(id)){
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
break;
case 4: // 查询所有图书
// 查询所有图书
bookService.selectBooks();
break;
case 0:
System.out.println("你已退出图书管理系统");
return;
default:
System.out.println("暂无此操作,请重新输入");
break;
}
}
}
}
7、结果展示

