从零开始:使用 Spring Boot 开发图书管理系统
如何利用是springboot搭建一个简单的图书管理系统,下面让我们一起来看看吧
文章目录
- 项目结构
- 1. 主类 `LibraryApplication.java`
- 功能与注意事项:
- 2. 模型类 `Book.java`
- 功能与注意事项:
- 3. 数据仓库接口 `BookRepository.java`
- 功能与注意事项:
- 4. 服务层 `BookService.java`
- 功能与注意事项:
- 5. 控制器 `BookController.java`
- 功能与注意事项:
- 6. 配置文件 `application.properties`
- 功能与注意事项:
- 运行与测试
- 注意事项
项目结构
深色版本
src
└── main├── java│ └── com│ └── example│ └── library│ ├── LibraryApplication.java│ ├── controller│ │ └── BookController.java│ ├── model│ │ └── Book.java│ ├── repository│ │ └── BookRepository.java│ └── service│ └── BookService.java└── resources└── application.properties
1. 主类 LibraryApplication.java
这是Spring Boot应用的入口点。
java深色版本
package com.example.library;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class LibraryApplication {public static void main(String[] args) {SpringApplication.run(LibraryApplication.class, args);}
}
进入代码分屏
功能与注意事项:
@SpringBootApplication
注解:这个注解是组合注解,包含了@Configuration
、@EnableAutoConfiguration
和@ComponentScan
。它告诉Spring Boot自动配置应用程序,并扫描当前包及其子包中的组件。- 主方法:
main
方法是Java程序的入口点,通过调用SpringApplication.run()
启动Spring Boot应用。
2. 模型类 Book.java
这是一个简单的实体类,代表一本书。
java深色版本
package com.example.library.model;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class Book {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String title;private String author;private String isbn;// Getters and Setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getIsbn() {return isbn;}public void setIsbn(String isbn) {this.isbn = isbn;}
}
进入代码分屏
功能与注意事项:
@Entity
注解:表示该类是一个JPA实体类,对应数据库表。@Id
注解:标识字段为主键。@GeneratedValue
注解:指定主键生成策略为自增。- Getters and Setters:提供属性的访问和修改方法。确保所有属性都有对应的getter和setter方法,以便JPA和其他框架能够正确地进行对象映射。
3. 数据仓库接口 BookRepository.java
使用Spring Data JPA简化数据库操作。
java深色版本
package com.example.library.repository;import com.example.library.model.Book;
import org.springframework.data.jpa.repository.JpaRepository;public interface BookRepository extends JpaRepository<Book, Long> {
}
进入代码分屏
功能与注意事项:
- 继承
JpaRepository
:JpaRepository
提供了基本的CRUD操作方法,无需手动编写SQL语句。 - 泛型参数:第一个参数是实体类型(
Book
),第二个参数是主键类型(Long
)。 - 自定义查询方法:如果需要更复杂的查询,可以在接口中声明自定义的方法名,Spring Data JPA会根据方法名自动生成实现。
4. 服务层 BookService.java
业务逻辑处理。
java深色版本
package com.example.library.service;import com.example.library.model.Book;
import com.example.library.repository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.Optional;@Service
public class BookService {@Autowiredprivate BookRepository bookRepository;public List<Book> findAllBooks() {return bookRepository.findAll();}public Optional<Book> findBookById(Long id) {return bookRepository.findById(id);}public Book saveBook(Book book) {return bookRepository.save(book);}public void deleteBook(Long id) {bookRepository.deleteById(id);}
}
进入代码分屏
功能与注意事项:
@Service
注解:标识该类为服务层组件,便于Spring容器管理。- 依赖注入:通过
@Autowired
注解注入BookRepository
实例。 - 方法设计:每个方法对应一个具体的业务操作,保持方法的单一职责原则。
5. 控制器 BookController.java
定义API端点。
java深色版本
package com.example.library.controller;import com.example.library.model.Book;
import com.example.library.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;import java.util.List;
import java.util.Optional;@RestController
@RequestMapping("/api/books")
public class BookController {@Autowiredprivate BookService bookService;@GetMappingpublic List<Book> getAllBooks() {return bookService.findAllBooks();}@GetMapping("/{id}")public ResponseEntity<Book> getBookById(@PathVariable Long id) {Optional<Book> book = bookService.findBookById(id);if (book.isPresent()) {return ResponseEntity.ok(book.get());} else {return ResponseEntity.notFound().build();}}@PostMappingpublic Book createBook(@RequestBody Book book) {return bookService.saveBook(book);}@PutMapping("/{id}")public ResponseEntity<Book> updateBook(@PathVariable Long id, @RequestBody Book bookDetails) {Optional<Book> optionalBook = bookService.findBookById(id);if (optionalBook.isPresent()) {Book book = optionalBook.get();book.setTitle(bookDetails.getTitle());book.setAuthor(bookDetails.getAuthor());book.setIsbn(bookDetails.getIsbn());return ResponseEntity.ok(bookService.saveBook(book));} else {return ResponseEntity.notFound().build();}}@DeleteMapping("/{id}")public ResponseEntity<Void> deleteBook(@PathVariable Long id) {Optional<Book> book = bookService.findBookById(id);if (book.isPresent()) {bookService.deleteBook(id);return ResponseEntity.noContent().build();} else {return ResponseEntity.notFound().build();}}
}
进入代码分屏
功能与注意事项:
@RestController
注解:标识该类为控制器,并且所有的方法默认返回JSON格式的数据。@RequestMapping
注解:定义基础路径/api/books
,后续的请求都会基于此路径。- HTTP方法映射:使用
@GetMapping
、@PostMapping
、@PutMapping
、@DeleteMapping
分别映射不同的HTTP方法。 - 路径变量和请求体:使用
@PathVariable
获取URL中的路径参数,使用@RequestBody
解析请求体中的JSON数据。 - 响应状态码:根据不同情况返回适当的HTTP状态码,如
200 OK
、201 Created
、404 Not Found
等。
6. 配置文件 application.properties
配置数据源和其他属性。
properties深色版本
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.h2.console.enabled=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
进入代码分屏
功能与注意事项:
- 内存数据库:使用H2内存数据库,适合快速开发和测试,但不适合生产环境。
- H2控制台:启用H2控制台方便调试,可以通过浏览器访问
http://localhost:8080/h2-console
。 - DDL自动更新:设置
spring.jpa.hibernate.ddl-auto=update
让Hibernate自动更新数据库模式。 - 显示SQL:开启
spring.jpa.show-sql=true
以在控制台打印出执行的SQL语句,便于调试。
运行与测试
-
运行项目:在IDE中直接运行
LibraryApplication
类中的main方法,或者使用命令行执行mvn spring-boot:run
。 -
访问H2控制台:打开浏览器,访问
http://localhost:8080/h2-console
,输入JDBC URL为jdbc:h2:mem:testdb
,用户名为sa
,密码为空即可登录查看数据库内容。 -
测试API
:使用Postman或其他工具测试API端点:
- GET
/api/books
: 获取所有书籍 - GET
/api/books/{id}
: 根据ID获取书籍 - POST
/api/books
: 创建新书籍(JSON格式) - PUT
/api/books/{id}
: 更新指定ID的书籍(JSON格式) - DELETE
/api/books/{id}
: 删除指定ID的书籍
- GET
注意事项
- 依赖管理:确保项目的
pom.xml
文件中包含了必要的依赖项,如Spring Boot Starter Web、Spring Data JPA、H2 Database等。 - 异常处理:在实际项目中,需要添加全局异常处理器来捕获并返回有意义的错误信息。
- 安全性:考虑添加安全机制,如JWT认证、角色权限控制等。
- 性能优化:对于大型系统,需关注SQL查询优化、缓存策略等。
- 单元测试:编写单元测试覆盖各个组件的功能,确保代码质量。
- 数据验证:使用JSR-380(Bean Validation)注解对请求体中的数据进行验证,防止无效或恶意数据进入系统。
- 日志记录:添加日志记录,便于追踪和调试应用行为。
- 文档编写:编写API文档,帮助其他开发者理解和使用API。
希望这些详细的解释和注意事项能帮助你更好地理解如何构建一个完整的Spring Boot应用程序。如果有不明白的地方或者小编有写的不好的地方可以私信我哟!
相关文章:
从零开始:使用 Spring Boot 开发图书管理系统
如何利用是springboot搭建一个简单的图书管理系统,下面让我们一起来看看吧 文章目录 项目结构1. 主类 LibraryApplication.java功能与注意事项: 2. 模型类 Book.java功能与注意事项: 3. 数据仓库接口 BookRepository.java功能与注意事项&…...
速盾:海外服务器使用CDN加速有什么优势?
CDN(Content Delivery Network)是指一种分布式网络架构,将内容分发到全球多个节点服务器上,使用户能够就近获取所需内容。海外服务器使用CDN加速,具有以下几个优势: 提高访问速度:CDN将内容复制…...

(二)手势识别——动作模型训练【代码+数据集+python环境(免安装)+GUI系统】
(二)手势识别——动作模型训练【代码数据集python环境(免安装)GUI系统】 背景意义 随着互联网的普及和机器学习技术的进一步发展,手势识别技术开始使用深度学习等方法进行手势识别,如Convolutional Neural…...
window系统下使用open-webui+ollama部署大模型
前面一篇博文中讲述了window下用ollama+AnythingLLM部署本地知识库,但是个人感觉anythingllm不是很好用,还不如直接用cmd窗口,而且仅能本机使用,如果想部署到服务器上面供其他人访问,完全不可行,但是使用open-webui+ollama或者独立的open-webui救可以实现。 使用open-web…...

一加ACE 3 Pro手机无法连接电脑传输文件问题
先说结论:OnePlus手机无法连接电脑传输数据的原因,大概率是一加数据线的问题。尝试其他手机品牌的数据线(比如华为),再次尝试。 连接电脑方法: 1 打开开发者模式(非必要操作) 进入…...

因果机器学习EconML | 客户细分案例——基于机器学习的异质性处理效果估计
机器学习的最大承诺之一是在众多应用领域中实现决策自动化。在大多数数据驱动的个性化决策场景中出现的一个核心问题是对异质性处理效果的估计:作为处理样本的一组可观察特征的函数,干预对感兴趣结果的影响是什么?例如,这个问题出…...
找到最大“葫芦”组合
文章目录 问题描述解题思路分析1. 数据预处理2. 特殊情况处理3. 普通情况计算4. 结果输出 Java代码实现复杂度分析与优化 在经典德州扑克中,“葫芦”是一种较强的牌型。它由五张牌组成,其中三张牌面值相同,另外两张牌面值也相同。本文将探讨一…...

shell(9)完结
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
【计算机网络】多路转接之select
系统提供select()来实现多路转接 IO 等 拷贝 -> select()只负责等待,可以一次等待多个fd select()本身没有数据拷贝的能力,拷贝要read()/write()来完成 一、select的使用 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exc…...

数据库-基础理论
文章目录 前言一、ORM框架二、ACID原则三、事务Transaction四、N1问题五、Normalization三范式六、FMEA方法论(Failure Mode and Effects Analysis)七、Profiling和PerformanceSchema查询分析 前言 基础理论 ORM框架、ACID原则、事务Transaction、N1问…...

Linux——1_系统的延迟任务及定时任务
系统的延迟任务及定时任务 在系统中我们的维护工作大多数时在服务器行对闲置时进行 我们需要用延迟任务来解决自动进行的一次性的维护 延迟任务时一次性的,不会重复执行 当延迟任务产生输出后,这些输出会以邮件的形式发送给延迟任务发起者 在RHEL9中…...
C++ 矩阵旋转
【问题描述】 编写一个程序,读入一个矩阵,输出该矩阵以第一行第一列数字为中心,顺时针旋转90度后的新矩阵,例如: 输入的矩阵为: 1 2 3 4 5 6 顺时针旋转90度后输出的矩阵为: 4 1 5 2 6 3 【输入…...

Docker学习笔记整理
这周不知道写点啥内容做个分享,但还是秉持学会分享的精神,粗略放一些Docker相关的问题和解答吧,后面有机会再补补再深挖深挖o(>﹏<)o 1. 容器VS虚拟机 虚拟机是一种带环境安装的解决方案(资源完全隔离),有以下缺…...

计算机组成原理期末试题三(含答案)
本科生期末试卷 三 一.选择题(每小题1分,共10分) 1.冯诺依曼机工作的基本方式的特点是______。 A 多指令流单数据流 B 按地址访问并顺序执行指令 C 堆栈操作 D 存贮器按内容选择地址 2.在机器数______中&a…...

django+boostrap实现注册
一、django介绍 Django 是一个高级的 Python 网络框架,可以快速开发安全和可维护的网站。由经验丰富的开发者构建,Django 负责处理网站开发中麻烦的部分,因此你可以专注于编写应用程序,而无需重新开发。 它是免费和开源的&#x…...

C++初阶——类和对象(下)
目录 1、再探构造函数——初始化列表 2、类型转换 3、static成员 4、友元 5、内部类 6、匿名对象 7、对象拷贝时编译器的优化(了解) 1、再探构造函数——初始化列表 1. 构造函数初始化除了使用函数体内赋值,还有一种方式——初始化列表, 初始化列…...

趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
随着容器技术的不断成熟,不少企业在开展私有化容器平台建设时,首要考虑的问题就是容器的部署环境——是采用虚拟机还是物理机运行容器?在往期“虚拟化 vs. 裸金属*”系列文章中,我们分别对比了容器部署在虚拟化平台和物理机上的架…...
idea初始化设置
下载idea: https://www.jetbrains.com/idea/ 安装idea 安装插件: Rainbow BracketsLombokMybatisXSonarLintMaven HelperCodeGeeX(国内AI插件可用) 设置idea注释模板: 设置代码注释模板: https://blo…...

LINUX系统编程之——环境变量
目录 环境变量 1、基本概念 2、查看环境变量的方法 三、查看PATH环境变量的內容 1)不带路径也能运行的自己的程序 a、将自己的程序直接添加到PATH指定的路径下 b、将程序所在的路径添加到PATH环境中 四、环境变量与本地变量 1、本地变量创建 2、环境变量创…...

健康老龄化:适合老年人的播客
什么是播客 什么是播客?好问题。对于那些还不熟悉这个术语的人来说,播客有点像在线广播或电视节目。这是一个可下载、可流式传输的程序,定期发布剧集,时长从几分钟到一个多小时不等。您可以在计算机、智能手机或平板电脑上…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...