从零开始:使用 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> {
}

进入代码分屏

功能与注意事项:
  • 继承JpaRepositoryJpaRepository提供了基本的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 OK201 Created404 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语句,便于调试。

运行与测试

  1. 运行项目:在IDE中直接运行LibraryApplication类中的main方法,或者使用命令行执行mvn spring-boot:run

  2. 访问H2控制台:打开浏览器,访问http://localhost:8080/h2-console,输入JDBC URL为jdbc:h2:mem:testdb,用户名为sa,密码为空即可登录查看数据库内容。

  3. 测试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的书籍

注意事项

  • 依赖管理:确保项目的pom.xml文件中包含了必要的依赖项,如Spring Boot Starter Web、Spring Data JPA、H2 Database等。
  • 异常处理:在实际项目中,需要添加全局异常处理器来捕获并返回有意义的错误信息。
  • 安全性:考虑添加安全机制,如JWT认证、角色权限控制等。
  • 性能优化:对于大型系统,需关注SQL查询优化、缓存策略等。
  • 单元测试:编写单元测试覆盖各个组件的功能,确保代码质量。
  • 数据验证:使用JSR-380(Bean Validation)注解对请求体中的数据进行验证,防止无效或恶意数据进入系统。
  • 日志记录:添加日志记录,便于追踪和调试应用行为。
  • 文档编写:编写API文档,帮助其他开发者理解和使用API。

希望这些详细的解释和注意事项能帮助你更好地理解如何构建一个完整的Spring Boot应用程序。如果有不明白的地方或者小编有写的不好的地方可以私信我哟!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

排序(Java数据结构)

1. 排序的概念及引用 1.1 排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。(所有的排序都是默认从小到大排序) 稳定性&#xff1a;假定在待排序的记录序列中&#xff…

VH6501国产替代同星TH7011干扰仪?

文章目录 同星TH7011干扰仪VH6501有使用过TH7011的么,可以在评论区讨论一下~ 同星TH7011干扰仪 干货分享 | 一文详解同星CAN总线干扰仪的使用方法 VH6501

蓝桥杯每日真题 - 第23天

题目&#xff1a;&#xff08;直线&#xff09; 题目描述&#xff08;12届 C&C B组C题&#xff09; 解题思路&#xff1a; 题目理解: 在平面直角坐标系中&#xff0c;从给定的点集中确定唯一的直线。 两点确定一条直线&#xff0c;判断两条直线是否相同&#xff0c;可通过…

目录遍历漏洞-CVE-2021-41773

目录 简介 原理 例子 Apache路径穿越漏洞 环境搭建 漏洞原理 漏洞利用 简介 目录遍历漏洞&#xff08;也称为路径遍历漏洞&#xff09;是一种由于Web服务器或Web应用程序对用户输入的文件名称的安全性验证不足而导致的安全漏洞。 原理 目录遍历漏洞允许攻击者在未授权…

.NET9 - 新功能体验(三)

书接上回&#xff0c;我们继续来聊聊.NET9和C#13带来的新变化。 01、Linq新方法 CountBy 和 AggregateBy 引入了新的方法 CountBy 和 AggregateBy后&#xff0c;可以在不经过GroupBy 分配中间分组的情况下快速完成复杂的聚合操作&#xff0c;同时方法命名也非常直观&#xff0…

Android蓝牙架构,源文件目录/编译方式学习

Android 版本 发布时间 代号&#xff08;Codename&#xff09; Android 1.0 2008年9月23日 无 Android 1.1 2009年2月9日 Petit Four Android 1.5 2009年4月27日 Cupcake Android 1.6 2009年9月15日 Donut Android 2.0 2009年10月26日 Eclair Android 2.1 2…

YOLO-World解读:零基础学习开放世界模型

文章目录 一、摘要二、引言相关工作方法预训练公式模型架构可重新参数化的视觉-语言路径聚合网络&#xff08;RepVL-PAN&#xff09; 3.4 预训练方案 实验YOLO-World: 利用多样化数据集进行开放词汇对象检测的预训练方法YOLO-World: LVIS数据集上的零样本性能评估YOLO-World: 预…

信创改造 - TongRDS 安装方式之控制台安装【Window】

安装前准备 安装 jdk1.8 即可&#xff0c;并配上 环境变量 安装 1&#xff09;解压缩 2&#xff09;启动 进入安装路径的console\bin目录&#xff0c;在cmd命令行窗口运行console.bat 输入序号 1 如果想查看运行状态&#xff0c;可以重新执行 console.bat&#xff0c;然后输…

志愿者小程序源码社区网格志愿者服务小程序php

志愿者服务小程序源码开发方案&#xff1a;开发语言后端php&#xff0c;tp框架&#xff0c;前端是uniapp。 一 志愿者端-小程序&#xff1a; 申请成为志愿者&#xff0c;志愿者组织端进行审核。成为志愿者后&#xff0c;可以报名参加志愿者活动。 志愿者地图&#xff1a;可以…

Node.js的下载与安装(支持各种新旧版本)

目录 1、node官网 2、node软件下载 3、软件安装&#xff08;完整版&#xff09; 1、node官网 Node.js — Download Node.jshttps://nodejs.org/en/download/package-manager 2、node软件下载 按照下图进行选择node版本&#xff08;真心推荐16/18&#xff0c;而是尽量是LTS…

对于相对速度的重新理解 - 2

回到先前说的&#xff0c;先令真空光速为标准光速&#xff0c; 光子的绝对速度 范围&#xff0c; 物质粒子的 范围&#xff0c; 这样的话&#xff0c;我们就可以根据 和 &#xff0c;把速度分成3个段&#xff0c; 这样就可以出现速度和它的负值&#xff0c;也就是速度的矢量具…

大模型系列11-ray

大模型系列11-ray PlasmaPlasmaStore启动监听处理请求 ProcessMessagePlasmaCreateRequest请求PlasmaCreateRetryRequest请求PlasmaGetRequest请求PlasmaReleaseRequestPlasmaDeleteRequestPlasmaSealRequest ObjectLifecycleManagerGetObjectSealObject ObjectStoreRunnerPlas…

Java---反射机制

JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c; 都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 在编译后产生…

Java 线程状态详解

1 引言 在 Java 多线程编程中&#xff0c;线程的状态是一个非常重要的概念。了解线程的状态及其转换过程&#xff0c;有助于我们更好地理解和控制线程的行为。本文将详细介绍 Java 线程的 6 种状态&#xff0c;并通过示例代码和图解来帮助读者更好地理解这些状态及其转换过程。…

AirScreen 安卓平板作为MacOS副屏

前言&#xff1a; 对笔记本续航有刚需&#xff0c;不得不选MacBook。 手机用的是mate40Pro&#xff0c;平板用的是matepad pro 12.6 干货&#xff1a; 参考网友的分享&#xff1a; https://www.bilibili.com/video/BV12A4y1d7zX/?spm_id_from333.337.search-card.all.click 【…

深度强化学习(RL)介绍

深度强化学习&#xff08;RL&#xff09;介绍 写到了一半&#xff0c;图待后补 一、强化学习概述 &#xff08;一&#xff09;与监督学习对比及定义 强化学习不同于监督学习&#xff0c;在一些任务中数据标注困难&#xff0c;但机器可通过环境反馈知道结果好坏。强化学习是机…

使用 Elasticsearch 构建食谱搜索(二)

这篇文章是之前的文章 “使用 Elasticsearch 构建食谱搜索&#xff08;一&#xff09;” 的续篇。在这篇文章中&#xff0c;我将详述如何使用本地 Elasticsearch 部署来完成对示例代码的运行。该项目演示了如何使用 Elastic 的 ELSER 实现语义搜索并将其结果与传统的词汇搜索进…

数据结构 【带环单链表】

在单链表中可能会存在一种情况&#xff0c;某一结点在经过几次转移之后回到了自己本身&#xff0c;这种情况就称之为带环链表。对于带环链表&#xff0c;我们不能轻易对其进行遍历&#xff0c;遍历可能会导致产生死循环。 带环链表的逻辑图如下所示&#xff1a;&#xff08;这…

Vue 项目中如何使用FullCalendar 时间段选择插件(类似会议室预定、课程表)

本文中是基于VUEelementui项目中实现的前后端分离的前端功能部分&#xff1a; 插件的官方文档&#xff1a;FullCalendar 1.安装对应依赖&#xff08;统一安装版本为6.15&#xff09; npm install --save fullcalendar/core6.15 npm install --save fullcalendar/daygrid6.…