前言
Java也是测试必知必会的内容,特别是现在类似spring boot 等Java框架更是成为主流。之前实现的图书增删改查是用Python实现的,没看过的请移步:Flask+mysql 实现增删改查接口开发+测试(图文教程附源码),本次给大家带来用Java实现的后端接口版本,并根据之前的项目总结有做一些优化。有基础的同学直接到第五章节CRUD开发
一、接口回顾
Python版本增删改查成功示例
1.1 图书增加
请求示例:
{
"title":"《Flask框架》",
"author":"pycharm",
"read_status":1
}
响应示例:
{
"message": "图书添加成功!",
"status": "success"
}
完整截图:
1.2 图书删除
请求示例:
{
"id":"49"
}
响应示例:
{
"message": "图书被删除!",
"status": "success"
}
完整截图:
1.3 图书修改
请求示例:
{
"id": 70,
"title": "《默8888888888》",
"author": "陈玉名",
"read_status": "1"
}
响应示例:
{
"message": "图书已更新!",
"status": "success"
}
完整截图:
1.4 图书查询
请求示例:
{
"id":"55"
}
响应示例:
{
"data": [
{
"author": "罗贯中",
"id": 55,
"read_status": true,
"title": "《三国演义》"
}
],
"message": "图书查询成功!",
"status": "success"
}
完整截图:
1.5 分页查询
请求示例:
{
"page": 1,
"pagesize": 5
}
响应示例:
{
"data": [
{
"author": "罗贯中",
"id": 50,
"read_status": true,
"title": "《三国演义》"
},
{
"author": "罗贯中",
"id": 51,
"read_status": true,
"title": "《三国演义》"
},
{
"author": "罗贯中",
"id": 52,
"read_status": true,
"title": "《三国演义》"
},
{
"author": "罗贯中",
"id": 53,
"read_status": true,
"title": "《三国演义》"
},
{
"author": "罗贯中",
"id": 54,
"read_status": true,
"title": "《三国演义》"
}
],
"message": "图书查询成功!",
"page": 1,
"pagesize": 5,
"status": "success",
"total": 22
}
完整截图:
上面我们对相关接口的请求入参,响应复习了一遍,注意请求结构、字段类型、请求方法、请求地址、接口响应格式、接口响应字段类型
下面我们就要用spring boot分层开发实现以上几个接口,把查询和分页查询合并一个接口,这也是一个优化点
二、技术准备
之前博客有简单使用springboot、Mybatis等的文章,本篇文章再次讲述下相关知识
2.1 spring boot
Spring Boot 是一个用于快速开发应用程序的框架,它建立在 Spring 框架的基础之上,旨在简化配置和部署过程,使开发者能够更专注于业务逻辑的实现。
以下是 Spring Boot 的一些主要特点:
-
简化配置: Spring Boot 提供了默认的配置选项,减少了开发者在配置方面的工作量。它使用约定大于配置的原则,根据项目的依赖和类型,自动配置应用程序的不同部分。
-
内嵌式 Web 服务器: Spring Boot 集成了多种内嵌式 Web 服务器,如Tomcat、Jetty和Undertow,使得构建和运行 Web 应用变得更加简单。
-
自动化依赖管理: Spring Boot 可以管理项目的依赖,自动选择合适的版本,简化了依赖管理的复杂性。
-
自动化配置: Spring Boot 根据项目的依赖和需要,自动进行一些常见配置,如数据源、消息队列等,减少了手动配置的步骤。
-
开箱即用的功能: Spring Boot 提供了许多常见功能的开箱即用实现,如安全认证、缓存、监控等,减少了开发者编写大量样板代码的工作。
-
简化部署: Spring Boot 支持将应用程序打包为可执行的 JAR 或 WAR 文件,以及支持 Docker 容器化部署,使部署变得更加方便。
-
微服务支持: Spring Boot 能够与 Spring Cloud 结合使用,为微服务架构提供支持,帮助开发者构建分布式系统。
总之,Spring Boot 旨在简化 Spring 应用程序的开发、测试、部署和运维过程,使开发者能够更快速、更高效地开发出高质量的应用程序。它适用于各种规模的项目,从小型应用到大型企业级系统。
2.2 Mybatis
MyBatis(之前称为iBATIS)是一个开源的持久层框架,用于将 Java 对象映射到关系型数据库中的数据。它提供了一种将 SQL 查询、更新和删除等操作与 Java 对象之间的映射关系的方式,从而使数据库操作更加简化和灵活。
以下是 MyBatis 的一些主要特点:
-
灵活的SQL映射: MyBatis 允许开发者编写原生的 SQL 查询,而不需要过多的 ORM(对象关系映射)层。这使开发者能够更精确地控制 SQL 查询的执行,并更好地优化数据库操作。
-
参数绑定: MyBatis 提供了参数绑定的功能,可以将 Java 对象中的属性值绑定到 SQL 查询中的参数位置,从而更方便地执行动态 SQL 查询。
-
结果映射: MyBatis 可以将查询结果映射为 Java 对象,开发者可以通过配置来指定查询结果与 Java 对象之间的映射关系。
-
支持存储过程和高级映射: MyBatis 支持存储过程调用和一些复杂的结果映射,使开发者能够处理更复杂的数据库操作。
-
缓存支持: MyBatis 提供了一些级别的缓存支持,可以提高查询的性能。
-
插件机制: MyBatis 允许开发者编写插件来扩展框架的功能,例如添加自定义的拦截器、执行器等。
-
XML配置和注解: MyBatis 支持通过 XML 配置文件或者注解的方式来配置映射关系和查询。
-
与各种数据库兼容: MyBatis 支持多种数据库,并且不需要太多的配置就可以适应不同数据库的特性。
总之,MyBatis是一个轻量级的持久层框架,它通过提供简洁的方式来操作数据库,使开发者能够更加灵活和高效地进行数据库操作,而无需深入学习复杂的 ORM 框架。
2.3 Maven
Maven 是一个流行的项目构建和管理工具,用于帮助开发团队管理项目的构建、依赖管理和文档生成等任务。它提供了一种标准化的方式来管理项目的生命周期,从而简化了项目构建、发布和维护过程。
以下是 Maven 的一些主要特点和功能:
-
项目结构标准化: Maven 鼓励使用一种特定的项目结构,包括源代码目录、资源文件目录、测试目录等。这有助于团队成员更容易理解和协同开发项目。
-
依赖管理: Maven 使用一个称为 "坐标" 的标识符来唯一标识项目的依赖库。通过在项目的配置文件中声明依赖,Maven 可以自动下载和管理所需的库文件。
-
自动构建: Maven 使用 POM(项目对象模型)文件来描述项目的构建配置,包括源代码目录、依赖、插件等。开发者只需编写 POM 文件,Maven 就能自动执行构建任务。
-
插件体系: Maven 提供了丰富的插件来执行各种任务,例如编译、测试、打包、部署等。开发者可以通过配置插件来定制项目的构建过程。
-
生命周期和阶段: Maven 将项目的构建过程划分为生命周期(Lifecycle),每个生命周期又分为不同的阶段(Phase)。例如,项目的生命周期包括 validate、compile、test、package、install、deploy 等阶段。
-
仓库管理: Maven 使用中央仓库作为默认的依赖库,开发者可以将自己的构建产物发布到本地仓库或者远程仓库。
-
多模块支持: Maven 支持将一个大型项目划分为多个子模块,每个模块可以有自己的 POM 文件和构建配置,从而更好地管理复杂的项目结构。
-
文档生成: Maven 可以通过插件自动生成项目的文档,包括代码文档、用户文档等。
总之,Maven 是一个用于项目构建和管理的工具,它提供了一套规范和标准,使开发者能够更高效地进行项目的构建、依赖管理和发布等任务。
2.4 MySQL
MySQL 是一种开源的关系型数据库管理系统(RDBMS),它是一种广泛使用的数据库技术,用于存储和管理结构化数据。MySQL 最初由瑞典公司 MySQL AB 开发,后来被 Sun Microsystems 收购,再后来 Sun Microsystems 被 Oracle Corporation 收购,因此 MySQL 也被称为 Oracle MySQL。
以下是 MySQL 数据库的一些主要特点和功能:
-
关系型数据库: MySQL 是一种关系型数据库,数据以表格的形式存储,表格中的数据之间通过键值关系相互连接。
-
开源和免费: MySQL 是开源软件,因此可以免费使用和分发。开源性质使得它受到广泛的社区支持和贡献。
-
跨平台支持: MySQL 可以在多种操作系统上运行,包括 Windows、Linux、macOS 等。
-
性能优化: MySQL 在读写速度上具有优异的性能,特别是对于高并发读取请求和大规模数据操作。
-
数据安全性: MySQL 提供了数据的访问控制、权限管理以及数据加密等功能,以确保数据的安全性和保密性。
-
事务支持: MySQL 支持事务,可以保证在一系列操作中的原子性、一致性、隔离性和持久性(ACID 属性)。
-
存储引擎: MySQL 支持多种存储引擎,如 InnoDB、MyISAM 等,不同的存储引擎提供了不同的性能和特性。
-
SQL 支持: MySQL 使用结构化查询语言(SQL)作为与数据库进行交互的标准语言。
-
复制和集群: MySQL 提供了复制和集群功能,允许在多台服务器之间同步数据,实现高可用性和负载均衡。
-
备份和恢复: MySQL 支持数据备份和恢复,使用户能够定期保存数据以应对意外数据丢失。
总之,MySQL 是一款功能强大的开源关系型数据库管理系统,适用于各种规模的应用,从个人项目到大型企业应用都可以使用它来存储和管理数据。
三、工具准备
上面是理论,这一篇我们动手前检查一下环境
3.1 IDEA
首先装IDEA前,确保你本地有安装java环境,本篇才用jdk 17,安装教程有很多此处不再介绍
我用的是2020的pojie版本
3.2 Navicat
确保电脑安装了mysql,或者其他机器上。Navicat安装也简单此处也不再赘述
主要是为了验证数据方便
这里为了和Python版本区分,我另起了一个book表,之前的是books,并把read_status设计为int型。在实际工作中也是这样,有多个枚举值的定义为int,后期好拓展。
重新设计的表DDL如下:
CREATE TABLE `book` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自动递增id,唯一键',
`title` varchar(80) NOT NULL COMMENT '书名',
`author` varchar(120) NOT NULL COMMENT '作者',
`read_status` int(11) DEFAULT NULL COMMENT '阅读状态,0未读,1已读',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=utf8;
四、项目工程结构
4.1 项目目录结构
4.2 项目目录文件解析
4.2.1 config
包下有2个类:
DataSourceConfig.java、MyBatisConfig.java这2个是Mybatis调试过程中禁用了Spring Boot默认的数据源自动配置 学习的文件,暂时不用管。
4.2.2 controller
包下有1个类:BookController ,用来处理前端请求的,前端或者postman请求首先会到达这一层,也叫控制层
4.2.3 domain
包 下有3个类:
BaseInput:封装请求用的,实际项目会用上,此处没时间封装请求
Book:最主要的实体类或者模型类,字段和setter、getter方法都在这里,注意,实际项目会采用@Data注解等去掉setter、getter方法
ResponseData :封装响应类,实际项目也会有
4.2.4 mapper
包下有1个类:BookMapper
持久层,主要与数据库进行交互。也叫DAO层,现在用 Mybatis 逆向工程生成的 mapper 层,其实就是 DAO 层。DAO 层会调用entity(domain)层,DAO 中会定义实际使用到的方法,比如增删改查
4.2.5 service
包下有1个类 BookService
,1个包impl,包下有服务实现类 BookServiceImpl、自定义异常类BookNotFoundException
4.2.6 启动类
和上面 包平级的BookApplication类,是spring boot项目默认生成的启动类
4.2.7 resources下的mapper
有1个xml文件BookMapper.xml。和mapper(DAO)层交互,主要写的是SQL语句
4.2.8 resources 根目录下的配置文件
application.properties文件或者application.yml文件。都可以,但是要注意2种文件的配置格式。这里采用的是yml文件,即application.yml
4.2.9 依赖文件
pom.xml,存放一些依赖,可以在这里引入依赖,更改依赖
一定要注意目录结构,否则会有各种报错。
关于spring boot各层的详细解析参考我的博文:Spring Boot 各层作用与联系
五、增删改查接口开发
前端请求过来遵循controller->mapper->service->entity我们开始写代码
5.1 图书增加接口
5.1.1 controller.java
@RequestMapping("/api/book")
public class BookController {
private static final Logger logger = LoggerFactory.getLogger(BookController.class);
private final BookService bookService;
@Autowired
public BookController(BookService bookService){
this.bookService = bookService;
}
@PostMapping("/add")
public ResponseEntity<Map<String, String>> addBook(@RequestBody Book book) {
try {
//System.out.println("前端传值ReadStatus:"+book.getReadStatus());
bookService.insertData(book);
Map<String, String> response = new HashMap<>();
response.put("message", "图书添加成功!");
response.put("status", "success");
return ResponseEntity.ok(response);
} catch (IllegalArgumentException e) {
Map<String, String> response = new HashMap<>();
response.put("message", e.getMessage());
response.put("status", "fail");
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
}
}
代码点评:
这段代码是一个 Spring Boot 控制器(Controller),用于处理关于图书(Book)的 HTTP 请求。下面对其中的主要部分进行解释:
-
@RequestMapping("/api/book")
: 这个注解将类映射到 "/api/book" 路径,表示这个控制器处理与图书相关的 API 请求。 -
private final BookService bookService;
: 这是一个私有的成员变量,类型为BookService
,用于在控制器中调用与图书相关的业务逻辑方法。 -
@Autowired
: 这个注解用于自动装配BookService
实例,即将bookService
成员变量与 Spring 容器中的BookService
对象关联起来。 -
@PostMapping("/add")
: 这个注解表示该方法处理 HTTP POST 请求,路径为 "/add",用于添加图书信息。 -
public ResponseEntity<Map<String, String>> addBook(@RequestBody Book book)
: 这是处理添加图书请求的方法。它接收一个 HTTP 请求体中的 JSON 数据,并将其映射为一个Book
对象。返回类型为ResponseEntity<Map<String, String>>
,即返回一个带有消息和状态信息的响应。 -
try
: 这是一个异常处理的开始,表示尝试执行以下代码块,如果出现异常则跳到catch
部分进行处理。 -
bookService.insertData(book);
: 调用bookService
的insertData
方法来将传入的图书信息插入到数据库中。 -
Map<String, String> response = new HashMap<>();
: 创建一个HashMap
作为响应体,用于存储返回给客户端的消息和状态信息。 -
response.put("message", "图书添加成功!");
: 将消息和状态信息放入响应体中。 -
response.put("status", "success");
: 将操作状态放入响应体中。 -
return ResponseEntity.ok(response);
: 返回一个 HTTP 响应,状态码为 200(成功),将上述响应体包装在ResponseEntity
中。 -
catch (IllegalArgumentException e) { ... }
: 这是异常处理的部分,如果在try
块中出现了IllegalArgumentException
异常,就会执行这里的代码。 -
在
catch
部分中,创建一个包含错误消息和状态的响应体,然后使用ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response)
返回一个 HTTP 响应,状态码为 400(客户端请求错误),将错误信息包装在ResponseEntity
中。
这段代码定义了一个用于处理添加图书请求的 Spring Boot 控制器方法。接收来自客户端的图书数据,将数据传递给业务逻辑层进行处理,然后返回适当的响应消息和状态信息。
5.1.2 BookService.java
void insertData(Book book);
代码点评:
void insertData(Book book);
是一个方法声明,它位于某个 Java 接口(或抽象类)中,用于定义一个接口方法。这个方法声明的含义如下:
-
void
: 方法返回类型。这里是void
,表示这个方法没有返回值,即不返回任何数据。 -
insertData
: 方法名称。这个方法被称为insertData
,这是一个自定义的方法名,用于表示将一本图书信息插入到某个数据源(如数据库)中。