用 Java 实现控制台版图书管理系统:从需求到代码的完整实践

用 Java 实现控制台版图书管理系统:从需求到代码的完整实践

我不是广告

个人主页-爱因斯晨

文章专栏-JAVA学习

好久不见~最近变了很多,也在忙。也有点儿小体会吧,最近遇到了很多事儿,我也想了很多。我个人的想法还是:不能给自己的以后留下任何污点,因为路还很长,我这才刚开始。要坚守自己的底线吧!“苟非吾之所有,虽一毫而莫取”
最后,衷心祝大家,身心健康,注意好身体!

在这里插入图片描述

> 不知道大家喜欢听歌嘛?最近发现一个可以白嫖会员的东西,苹果音乐可以白嫖会员(新用户两个月,老用户一个月),苹果安卓都能用,领取之后记得关闭自动续费哦~曲库还是很多的,大家可以点击链接领取。领取链接绝对免费!绝对白嫖!

作为一名 Java 开发者,我们常常忙于框架和中间件的使用,却容易忽略基础语法的实战价值。今天,我将带大家从零开始实现一个控制台版图书管理系统,这个项目虽然简单,却涵盖了 Java 核心基础的大部分知识点,非常适合初学者巩固基础,也能让资深开发者重温 Java 设计的初心。

项目需求分析

在开始编码之前,我们需要明确这个图书管理系统应该具备哪些核心功能。一个最简化的图书管理系统应当包含:

  • 图书信息的管理(图书包含 ID、书名、作者、出版社、是否可借等属性)
  • 基本的 CRUD 操作(添加、查询、修改、删除图书)
  • 借阅和归还功能
  • 简单的控制台交互界面

这些功能虽然基础,但足以覆盖 Java 基础中的类与对象、集合框架、控制流、异常处理等核心知识点。

系统设计思路

对于这样一个小型项目,我们采用简单的三层结构设计:

  1. 实体层(Model):定义图书对象的属性和行为
  2. 业务逻辑层(Service):处理核心业务逻辑
  3. 视图层(View):负责控制台交互

这种分层思想即使在大型项目中也是核心设计原则,从小项目开始培养这种思维非常重要。

代码实现

1. 实体类设计

首先我们创建 Book 类,封装图书的基本信息和相关方法:

publicclassBook{privateString id;// 图书唯一标识privateString title;// 书名privateString author;// 作者privateString publisher;// 出版社privateboolean isBorrowed;// 是否被借出// 构造方法publicBook(String id,String title,String author,String publisher){this.id = id;this.title = title;this.author = author;this.publisher = publisher;this.isBorrowed =false;// 默认可借}// getter和setter方法publicStringgetId(){return id;}publicStringgetTitle(){return title;}publicvoidsetTitle(String title){this.title = title;}publicStringgetAuthor(){return author;}publicvoidsetAuthor(String author){this.author = author;}publicStringgetPublisher(){return publisher;}publicvoidsetPublisher(String publisher){this.publisher = publisher;}publicbooleanisBorrowed(){return isBorrowed;}publicvoidsetBorrowed(boolean borrowed){ isBorrowed = borrowed;}// 重写toString方法,方便打印图书信息@OverridepublicStringtoString(){returnString.format("ID: %s\n书名: %s\n作者: %s\n出版社: %s\n状态: %s", id, title, author, publisher, isBorrowed ?"已借出":"可借阅");}}

这个类体现了 Java 的封装特性,通过 private 修饰属性,提供 public 的 getter 和 setter 方法来访问和修改属性,同时重写了 toString () 方法方便输出图书信息。

2. 业务逻辑层实现

接下来实现 BookService 类,处理图书管理的核心业务逻辑:

importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassBookService{// 使用ArrayList存储图书,模拟数据库privateList<Book> books =newArrayList<>();privateScanner scanner =newScanner(System.in);// 添加图书publicvoidaddBook(){System.out.println("===== 添加新图书 =====");System.out.print("请输入图书ID: ");String id = scanner.nextLine();// 检查ID是否已存在if(findBookById(id)!=null){System.out.println("错误:该ID已存在!");return;}System.out.print("请输入书名: ");String title = scanner.nextLine();System.out.print("请输入作者: ");String author = scanner.nextLine();System.out.print("请输入出版社: ");String publisher = scanner.nextLine();// 创建图书对象并添加到集合Book newBook =newBook(id, title, author, publisher); books.add(newBook);System.out.println("图书添加成功!");}// 查找图书(按ID)publicBookfindBookById(String id){for(Book book : books){if(book.getId().equals(id)){return book;}}returnnull;}// 查找图书(按书名)publicList<Book>findBooksByTitle(String title){List<Book> result =newArrayList<>();for(Book book : books){if(book.getTitle().contains(title)){ result.add(book);}}return result;}// 显示所有图书publicvoidshowAllBooks(){System.out.println("===== 所有图书 =====");if(books.isEmpty()){System.out.println("暂无图书信息");return;}for(Book book : books){System.out.println("-------------------");System.out.println(book);}System.out.println("-------------------");}// 更新图书信息publicvoidupdateBook(){System.out.println("===== 修改图书信息 =====");System.out.print("请输入要修改的图书ID: ");String id = scanner.nextLine();Book book =findBookById(id);if(book ==null){System.out.println("未找到该图书!");return;}System.out.println("当前图书信息:");System.out.println(book);System.out.print("请输入新书名(不修改按回车): ");String title = scanner.nextLine();if(!title.isEmpty()){ book.setTitle(title);}System.out.print("请输入新作者(不修改按回车): ");String author = scanner.nextLine();if(!author.isEmpty()){ book.setAuthor(author);}System.out.print("请输入新出版社(不修改按回车): ");String publisher = scanner.nextLine();if(!publisher.isEmpty()){ book.setPublisher(publisher);}System.out.println("图书信息修改成功!");}// 删除图书publicvoiddeleteBook(){System.out.println("===== 删除图书 =====");System.out.print("请输入要删除的图书ID: ");String id = scanner.nextLine();Book book =findBookById(id);if(book ==null){System.out.println("未找到该图书!");return;}// 检查图书是否已借出if(book.isBorrowed()){System.out.println("无法删除:该图书已被借出!");return;} books.remove(book);System.out.println("图书删除成功!");}// 借阅图书publicvoidborrowBook(){System.out.println("===== 借阅图书 =====");System.out.print("请输入要借阅的图书ID: ");String id = scanner.nextLine();Book book =findBookById(id);if(book ==null){System.out.println("未找到该图书!");return;}if(book.isBorrowed()){System.out.println("抱歉,该图书已被借出!");}else{ book.setBorrowed(true);System.out.println("借阅成功!请按时归还。");}}// 归还图书publicvoidreturnBook(){System.out.println("===== 归还图书 =====");System.out.print("请输入要归还的图书ID: ");String id = scanner.nextLine();Book book =findBookById(id);if(book ==null){System.out.println("未找到该图书!");return;}if(!book.isBorrowed()){System.out.println("错误:该图书未被借出!");}else{ book.setBorrowed(false);System.out.println("归还成功!感谢使用。");}}// 搜索图书publicvoidsearchBooks(){System.out.println("===== 搜索图书 =====");System.out.print("请输入书名关键词: ");String keyword = scanner.nextLine();List<Book> results =findBooksByTitle(keyword);if(results.isEmpty()){System.out.println("未找到匹配的图书!");return;}System.out.println("找到"+ results.size()+"本匹配的图书:");for(Book book : results){System.out.println("-------------------");System.out.println(book);}System.out.println("-------------------");}}

在这个类中,我们使用了 ArrayList来存储图书对象,模拟了数据库的功能。每个方法对应一个具体的业务操作,包含了参数校验和业务逻辑处理。

3. 视图层实现

最后实现主程序类,负责控制台交互:

importjava.util.Scanner;publicclassBookManagementSystem{privatestaticBookService bookService =newBookService();privatestaticScanner scanner =newScanner(System.in);publicstaticvoidmain(String[] args){System.out.println("===== 欢迎使用图书管理系统 =====");showMenu();while(true){System.out.print("\n请输入操作编号: ");String choice;try{ choice = scanner.nextLine().trim();handleChoice(choice);}catch(Exception e){System.out.println("操作出错:"+ e.getMessage());System.out.println("请重新输入!");}}}// 显示菜单privatestaticvoidshowMenu(){System.out.println("\n操作菜单:");System.out.println("1. 添加图书");System.out.println("2. 查看所有图书");System.out.println("3. 修改图书信息");System.out.println("4. 删除图书");System.out.println("5. 借阅图书");System.out.println("6. 归还图书");System.out.println("7. 搜索图书");System.out.println("0. 退出系统");}// 处理用户选择privatestaticvoidhandleChoice(String choice){switch(choice){case"1": bookService.addBook();break;case"2": bookService.showAllBooks();break;case"3": bookService.updateBook();break;case"4": bookService.deleteBook();break;case"5": bookService.borrowBook();break;case"6": bookService.returnBook();break;case"7": bookService.searchBooks();break;case"0":System.out.println("感谢使用,再见!");System.exit(0);break;default:System.out.println("无效的操作编号,请重新输入!");}showMenu();}}

这个类实现了控制台菜单的展示和用户输入的处理,通过调用 BookService 的方法来完成具体的业务操作。

代码解析与知识点总结

这个简单的图书管理系统虽然代码量不大,但包含了 Java 基础的多个重要知识点:

  1. 面向对象编程:通过 Book 类封装图书属性和行为,体现了封装性;系统分层设计体现了模块化思想。
  2. 集合框架:使用ArrayList存储图书对象,展示了 Java 集合的基本用法,相比数组更加灵活。
  3. 控制流:大量使用 if-else 条件判断和 switch 选择结构,以及 for 循环遍历集合。
  4. 异常处理:在主程序中使用 try-catch 块捕获可能的异常,保证程序的健壮性。
  5. IO 操作:通过 Scanner 类实现控制台输入输出,是 Java IO 的基础应用。
  6. 方法设计:将不同功能封装成独立方法,提高代码的可读性和复用性。

功能扩展思路

这个基础版本的图书管理系统可以从多个方向进行扩展,使其更接近实际应用:

  1. 数据持久化:目前数据存储在内存中,程序退出后数据会丢失。可以添加文件 IO 操作,将图书信息保存到本地文件。
  2. 用户管理:增加用户登录功能,区分管理员和普通用户权限。
  3. 借阅记录:添加借阅记录功能,记录谁在什么时间借阅了什么图书。
  4. 更完善的查询:支持按作者、出版社等多条件组合查询。
  5. 图书分类:为图书添加分类属性,支持按分类管理图书。

项目收获与反思

通过实现这个图书管理系统,我们可以深刻体会到:

  1. 基础的重要性:复杂的系统都是由简单的模块构成的,扎实的基础是构建复杂系统的前提。
  2. 模块化思维:将功能拆分成独立的模块和方法,不仅便于开发,也利于后期维护和扩展。
  3. 用户体验:即使是控制台程序,也需要考虑用户交互的友好性,清晰的提示和简洁的操作流程很重要。
  4. 异常处理:在实际开发中,异常处理是保证程序稳定性的关键,需要仔细考虑各种可能的异常情况。

结语

这个控制台版图书管理系统虽然简单,但完整地实现了一个小型应用的开发流程,从需求分析到设计,再到编码实现。对于 Java 初学者来说,这是一个非常好的练手项目,能够帮助巩固基础知识,培养编程思维。

对于有经验的开发者,这样的基础项目也能让我们回归 Java 的本质,思考如何用最简洁的代码实现需求,而不是过度依赖框架和工具。

希望这个项目能给大家带来启发,也欢迎大家在此基础上进行扩展和优化,探索更多 Java 编程的乐趣。

Read more

Spring与OSGi集成深度解析:多层次整合技术要点

本文还有配套的精品资源,点击获取 简介:本文详细探讨了Spring框架与OSGi模块化系统的集成,深入解析了如何结合Spring的模块化设计和OSGi的核心特性来构建更灵活、可扩展的应用程序。内容涵盖OSGi的基础知识、Spring与OSGi的结合方式、SpringDM的工作机制、集成层次的策略,以及在实际应用中的案例分析,优势与挑战,和相关工具支持。旨在为开发者提供在OSGi环境中使用Spring进行高效开发的指导。 1. OSGi基础介绍 OSGi(Open Service Gateway Initiative)是一个基于Java语言的服务(模块)化规范。随着软件系统复杂性的增加,OSGi应运而生,旨在提供一种轻量级、高度模块化的系统架构。 1.1 OSGi核心概念 OSGi框架的核心在于其模块化的能力,它允许系统被分解成一系列的“Bundle”。每个Bundle都独立开发、部署,拥有自己的生命周期,包括安装、启动、停止、更新和卸载。这种模块化极大促进了软件组件的复用和维护。 1.2 OSGi的优势 OSGi的优势主要体现在以下几个方面: - 动态性 :OSG

By Ne0inhk
205-Spring AI Model Context Protocol 功能:Brave Search 功能完整案例

205-Spring AI Model Context Protocol 功能:Brave Search 功能完整案例

本案例演示如何创建一个 Spring AI Model Context Protocol (MCP) 客户端,该客户端与 Brave Search MCP 服务器通信。应用程序展示了如何构建一个 MCP 客户端,通过对话界面实现与 Brave Search 的自然语言交互,允许您通过对话界面执行互联网搜索。本示例使用 Spring Boot 自动配置通过配置文件设置 MCP 客户端。 运行时,应用程序通过询问特定问题来演示 MCP 客户端的功能:"Spring AI 是否支持 Model Context Protocol?请提供一些参考资料。"MCP 客户端使用 Brave Search 查找相关信息并返回全面答案。提供响应后,应用程序退出。 1. 案例目标 我们将创建一个展示以下功能的

By Ne0inhk
Flutter 组件 http_retry 的适配 鸿蒙Harmony 深度进阶 - 驾驭分布式负载感知重试、实现鸿蒙端高可靠通讯与协议幂等性审计方案

Flutter 组件 http_retry 的适配 鸿蒙Harmony 深度进阶 - 驾驭分布式负载感知重试、实现鸿蒙端高可靠通讯与协议幂等性审计方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 http_retry 的适配 鸿蒙Harmony 深度进阶 - 驾驭分布式负载感知重试、实现鸿蒙端高可靠通讯与协议幂等性审计方案 前言 在前文中,我们探讨了 http_retry 在鸿蒙(OpenHarmony)生态中解决单一移动终端弱网重试的基础实战。但在真正的“分布式工业物联网集成”、“跨设备协同办公资产同步”以及“需要对接具备动态压力管控的超大规模云原生后端”场景中。简单的指数退避往往难以应对复杂的网络分位震荡。面对一个需要在鸿蒙手机、智能穿戴设备与边缘网关之间,根据当前全网的平均负载压力(Load Pressure)动态调节重试节奏,并且要求在执行涉及核心资产变更(如:支付订单、库存锁定)的重试时执行绝对严密的协议幂等性(Idempotency)校验的高阶需求。如果缺乏一套具备分布式感知的重试调度模型。不仅会导致后端服务在故障恢复瞬间遭遇“重试波峰”引发再次崩溃,更会因为对非幂等操作的盲目重试。引发严重的业务资产错乱。 我们需要

By Ne0inhk
数据库 SQL 防火墙:内核级防护,筑牢 SQL 注入安全防线

数据库 SQL 防火墙:内核级防护,筑牢 SQL 注入安全防线

在数字化转型持续深化的今天,数据早已从辅助资源升级为企业的核心生产要素。无论是政务系统、金融交易,还是工业控制、能源调度,数据库作为数据的最终载体,其安全直接关系到业务连续性与数据资产完整性。 在各类数据库安全威胁中,SQL注入凭借门槛低、隐蔽性强、破坏力大的特点,长期位居OWASP Top 10 Web应用安全风险前列。它就像潜伏在业务链路中的隐秘入侵者,利用应用逻辑漏洞,将恶意指令伪装成正常参数传入数据库,进而实现越权访问、数据窃取甚至删库破坏。 尽管行业内早已形成共识——通过预编译语句、参数化查询、输入校验等方式可以有效防范SQL注入,但在真实业务环境中,风险依然无处不在:老旧系统的遗留代码难以全面改造、第三方组件存在未知漏洞、多团队协作中难免出现编码疏漏、动态SQL拼接场景难以完全规范化……只要存在一处薄弱环节,就可能被攻击者利用,引发连锁安全事故。 面对这种“处处设防仍可能百密一疏”的困境,单纯依赖应用层加固显然不够。能否从数据库自身出发,构建一层独立、可靠、主动的防御体系?金仓数据库(KingbaseES)V009R002C014版本内置的SQL防火墙能力,正是从这一

By Ne0inhk