相关推荐recommended
Spring Boot+Mybatis实现增删改查接口开发+测试(超详细建议收藏)
作者:mmseoamin日期:2023-12-13

前言

Java也是测试必知必会的内容,特别是现在类似spring boot 等Java框架更是成为主流。之前实现的图书增删改查是用Python实现的,没看过的请移步:Flask+mysql 实现增删改查接口开发+测试(图文教程附源码),本次给大家带来用Java实现的后端接口版本,并根据之前的项目总结有做一些优化。有基础的同学直接到第五章节CRUD开发

一、接口回顾

Python版本增删改查成功示例

1.1 图书增加

请求示例:

{
    "title":"《Flask框架》",
    "author":"pycharm",
    "read_status":1
}

响应示例: 

{
    "message": "图书添加成功!",
    "status": "success"
}

完整截图:

Spring Boot+Mybatis实现增删改查接口开发+测试(超详细建议收藏),第1张

1.2 图书删除

请求示例:

{
    "id":"49"
}

响应示例: 

{
    "message": "图书被删除!",
    "status": "success"
}

完整截图:

Spring Boot+Mybatis实现增删改查接口开发+测试(超详细建议收藏),第2张

1.3 图书修改

请求示例:

{
    "id": 70,
    "title": "《默8888888888》",
    "author": "陈玉名",
    "read_status": "1"
}

响应示例: 

{
    "message": "图书已更新!",
    "status": "success"
}

完整截图:

Spring Boot+Mybatis实现增删改查接口开发+测试(超详细建议收藏),第3张

1.4 图书查询

请求示例:

{
    "id":"55"
}

响应示例: 

{
    "data": [
        {
            "author": "罗贯中",
            "id": 55,
            "read_status": true,
            "title": "《三国演义》"
        }
    ],
    "message": "图书查询成功!",
    "status": "success"
}

完整截图:

Spring Boot+Mybatis实现增删改查接口开发+测试(超详细建议收藏),第4张

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+Mybatis实现增删改查接口开发+测试(超详细建议收藏),第5张

 上面我们对相关接口的请求入参,响应复习了一遍,注意请求结构、字段类型、请求方法、请求地址、接口响应格式、接口响应字段类型

下面我们就要用spring boot分层开发实现以上几个接口,把查询和分页查询合并一个接口,这也是一个优化点

二、技术准备

之前博客有简单使用springboot、Mybatis等的文章,本篇文章再次讲述下相关知识

2.1 spring boot

Spring Boot 是一个用于快速开发应用程序的框架,它建立在 Spring 框架的基础之上,旨在简化配置和部署过程,使开发者能够更专注于业务逻辑的实现。

以下是 Spring Boot 的一些主要特点:

  1. 简化配置: Spring Boot 提供了默认的配置选项,减少了开发者在配置方面的工作量。它使用约定大于配置的原则,根据项目的依赖和类型,自动配置应用程序的不同部分。

  2. 内嵌式 Web 服务器: Spring Boot 集成了多种内嵌式 Web 服务器,如Tomcat、Jetty和Undertow,使得构建和运行 Web 应用变得更加简单。

  3. 自动化依赖管理: Spring Boot 可以管理项目的依赖,自动选择合适的版本,简化了依赖管理的复杂性。

  4. 自动化配置: Spring Boot 根据项目的依赖和需要,自动进行一些常见配置,如数据源、消息队列等,减少了手动配置的步骤。

  5. 开箱即用的功能: Spring Boot 提供了许多常见功能的开箱即用实现,如安全认证、缓存、监控等,减少了开发者编写大量样板代码的工作。

  6. 简化部署: Spring Boot 支持将应用程序打包为可执行的 JAR 或 WAR 文件,以及支持 Docker 容器化部署,使部署变得更加方便。

  7. 微服务支持: Spring Boot 能够与 Spring Cloud 结合使用,为微服务架构提供支持,帮助开发者构建分布式系统。

总之,Spring Boot 旨在简化 Spring 应用程序的开发、测试、部署和运维过程,使开发者能够更快速、更高效地开发出高质量的应用程序。它适用于各种规模的项目,从小型应用到大型企业级系统。

2.2 Mybatis

MyBatis(之前称为iBATIS)是一个开源的持久层框架,用于将 Java 对象映射到关系型数据库中的数据。它提供了一种将 SQL 查询、更新和删除等操作与 Java 对象之间的映射关系的方式,从而使数据库操作更加简化和灵活。

以下是 MyBatis 的一些主要特点:

  1. 灵活的SQL映射: MyBatis 允许开发者编写原生的 SQL 查询,而不需要过多的 ORM(对象关系映射)层。这使开发者能够更精确地控制 SQL 查询的执行,并更好地优化数据库操作。

  2. 参数绑定: MyBatis 提供了参数绑定的功能,可以将 Java 对象中的属性值绑定到 SQL 查询中的参数位置,从而更方便地执行动态 SQL 查询。

  3. 结果映射: MyBatis 可以将查询结果映射为 Java 对象,开发者可以通过配置来指定查询结果与 Java 对象之间的映射关系。

  4. 支持存储过程和高级映射: MyBatis 支持存储过程调用和一些复杂的结果映射,使开发者能够处理更复杂的数据库操作。

  5. 缓存支持: MyBatis 提供了一些级别的缓存支持,可以提高查询的性能。

  6. 插件机制: MyBatis 允许开发者编写插件来扩展框架的功能,例如添加自定义的拦截器、执行器等。

  7. XML配置和注解: MyBatis 支持通过 XML 配置文件或者注解的方式来配置映射关系和查询。

  8. 与各种数据库兼容: MyBatis 支持多种数据库,并且不需要太多的配置就可以适应不同数据库的特性。

总之,MyBatis是一个轻量级的持久层框架,它通过提供简洁的方式来操作数据库,使开发者能够更加灵活和高效地进行数据库操作,而无需深入学习复杂的 ORM 框架。

2.3 Maven

Maven 是一个流行的项目构建和管理工具,用于帮助开发团队管理项目的构建、依赖管理和文档生成等任务。它提供了一种标准化的方式来管理项目的生命周期,从而简化了项目构建、发布和维护过程。

以下是 Maven 的一些主要特点和功能:

  1. 项目结构标准化: Maven 鼓励使用一种特定的项目结构,包括源代码目录、资源文件目录、测试目录等。这有助于团队成员更容易理解和协同开发项目。

  2. 依赖管理: Maven 使用一个称为 "坐标" 的标识符来唯一标识项目的依赖库。通过在项目的配置文件中声明依赖,Maven 可以自动下载和管理所需的库文件。

  3. 自动构建: Maven 使用 POM(项目对象模型)文件来描述项目的构建配置,包括源代码目录、依赖、插件等。开发者只需编写 POM 文件,Maven 就能自动执行构建任务。

  4. 插件体系: Maven 提供了丰富的插件来执行各种任务,例如编译、测试、打包、部署等。开发者可以通过配置插件来定制项目的构建过程。

  5. 生命周期和阶段: Maven 将项目的构建过程划分为生命周期(Lifecycle),每个生命周期又分为不同的阶段(Phase)。例如,项目的生命周期包括 validate、compile、test、package、install、deploy 等阶段。

  6. 仓库管理: Maven 使用中央仓库作为默认的依赖库,开发者可以将自己的构建产物发布到本地仓库或者远程仓库。

  7. 多模块支持: Maven 支持将一个大型项目划分为多个子模块,每个模块可以有自己的 POM 文件和构建配置,从而更好地管理复杂的项目结构。

  8. 文档生成: Maven 可以通过插件自动生成项目的文档,包括代码文档、用户文档等。

总之,Maven 是一个用于项目构建和管理的工具,它提供了一套规范和标准,使开发者能够更高效地进行项目的构建、依赖管理和发布等任务。

2.4 MySQL

MySQL 是一种开源的关系型数据库管理系统(RDBMS),它是一种广泛使用的数据库技术,用于存储和管理结构化数据。MySQL 最初由瑞典公司 MySQL AB 开发,后来被 Sun Microsystems 收购,再后来 Sun Microsystems 被 Oracle Corporation 收购,因此 MySQL 也被称为 Oracle MySQL。

以下是 MySQL 数据库的一些主要特点和功能:

  1. 关系型数据库: MySQL 是一种关系型数据库,数据以表格的形式存储,表格中的数据之间通过键值关系相互连接。

  2. 开源和免费: MySQL 是开源软件,因此可以免费使用和分发。开源性质使得它受到广泛的社区支持和贡献。

  3. 跨平台支持: MySQL 可以在多种操作系统上运行,包括 Windows、Linux、macOS 等。

  4. 性能优化: MySQL 在读写速度上具有优异的性能,特别是对于高并发读取请求和大规模数据操作。

  5. 数据安全性: MySQL 提供了数据的访问控制、权限管理以及数据加密等功能,以确保数据的安全性和保密性。

  6. 事务支持: MySQL 支持事务,可以保证在一系列操作中的原子性、一致性、隔离性和持久性(ACID 属性)。

  7. 存储引擎: MySQL 支持多种存储引擎,如 InnoDB、MyISAM 等,不同的存储引擎提供了不同的性能和特性。

  8. SQL 支持: MySQL 使用结构化查询语言(SQL)作为与数据库进行交互的标准语言。

  9. 复制和集群: MySQL 提供了复制和集群功能,允许在多台服务器之间同步数据,实现高可用性和负载均衡。

  10. 备份和恢复: MySQL 支持数据备份和恢复,使用户能够定期保存数据以应对意外数据丢失。

总之,MySQL 是一款功能强大的开源关系型数据库管理系统,适用于各种规模的应用,从个人项目到大型企业应用都可以使用它来存储和管理数据。

三、工具准备

上面是理论,这一篇我们动手前检查一下环境

3.1 IDEA

首先装IDEA前,确保你本地有安装java环境,本篇才用jdk 17,安装教程有很多此处不再介绍

我用的是2020的pojie版本

Spring Boot+Mybatis实现增删改查接口开发+测试(超详细建议收藏),第6张

3.2 Navicat

确保电脑安装了mysql,或者其他机器上。Navicat安装也简单此处也不再赘述

Spring Boot+Mybatis实现增删改查接口开发+测试(超详细建议收藏),第7张

主要是为了验证数据方便

这里为了和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 项目目录结构

Spring Boot+Mybatis实现增删改查接口开发+测试(超详细建议收藏),第8张

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> addBook(@RequestBody Book book) {
        try {
            //System.out.println("前端传值ReadStatus:"+book.getReadStatus());
            bookService.insertData(book);
            Map response = new HashMap<>();
            response.put("message", "图书添加成功!");
            response.put("status", "success");
            return ResponseEntity.ok(response);
        } catch (IllegalArgumentException e) {
            Map 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 请求。下面对其中的主要部分进行解释:

  1. @RequestMapping("/api/book"): 这个注解将类映射到 "/api/book" 路径,表示这个控制器处理与图书相关的 API 请求。

  2. private final BookService bookService;: 这是一个私有的成员变量,类型为 BookService,用于在控制器中调用与图书相关的业务逻辑方法。

  3. @Autowired: 这个注解用于自动装配 BookService 实例,即将 bookService 成员变量与 Spring 容器中的 BookService 对象关联起来。

  4. @PostMapping("/add"): 这个注解表示该方法处理 HTTP POST 请求,路径为 "/add",用于添加图书信息。

  5. public ResponseEntity> addBook(@RequestBody Book book): 这是处理添加图书请求的方法。它接收一个 HTTP 请求体中的 JSON 数据,并将其映射为一个 Book 对象。返回类型为 ResponseEntity>,即返回一个带有消息和状态信息的响应。

  6. try: 这是一个异常处理的开始,表示尝试执行以下代码块,如果出现异常则跳到 catch 部分进行处理。

  7. bookService.insertData(book);: 调用 bookService 的 insertData 方法来将传入的图书信息插入到数据库中。

  8. Map response = new HashMap<>();: 创建一个 HashMap 作为响应体,用于存储返回给客户端的消息和状态信息。

  9. response.put("message", "图书添加成功!");: 将消息和状态信息放入响应体中。

  10. response.put("status", "success");: 将操作状态放入响应体中。

  11. return ResponseEntity.ok(response);: 返回一个 HTTP 响应,状态码为 200(成功),将上述响应体包装在 ResponseEntity 中。

  12. catch (IllegalArgumentException e) { ... }: 这是异常处理的部分,如果在 try 块中出现了 IllegalArgumentException 异常,就会执行这里的代码。

  13. 在 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 接口(或抽象类)中,用于定义一个接口方法。这个方法声明的含义如下:

  1. void: 方法返回类型。这里是 void,表示这个方法没有返回值,即不返回任何数据。

  2. insertData: 方法名称。这个方法被称为 insertData,这是一个自定义的方法名,用于表示将一本图书信息插入到某个数据源(如数据库)中。

  3. (Book book): 方法参数。这里的 (Book book) 表示这个方法接受一个名为 book 的参数,参数类型是 Book 类。这个参数将用于传递要插入的图书信息。

这个方法声明表示一个用于将图书信息插入到数据源中的接口方法。实际的实现代码应该在某个类中,实现了包含这个方法声明的接口,以便在调用时执行插入操作。这个方法是在 BookService 接口中声明的,具体的实现在 BookServiceImpl 类中

5.1.3 BookServiceImpl.java

    @Override
    public void insertData(Book book) {
        if (book.getTitle() == null || book.getAuthor() == null || book.getReadStatus() == null) {
            throw new IllegalArgumentException("title、author和read_status是必传参数!");
        }
    // Check for duplicate title
        String title = book.getTitle().trim();
        if (bookMapper.existsByTitle(title)) {
            throw new IllegalArgumentException("书名(title)重复!");
        }
        bookMapper.insertData(book);
}

代码点评: 

这段代码是一个方法的实现,覆盖(Override)了一个接口或父类中的同名方法。具体解释如下:

  1. @Override: 这是一个注解,表示这个方法是对父类或接口中同名方法的重写。在 Java 中,如果一个类实现了某个接口,或者一个类继承了另一个类,可以通过使用 @Override 注解来表明某个方法是对父类或接口中方法的重写。

  2. public void insertData(Book book) { ... }: 这是一个方法的实现。它覆盖了某个接口或父类中声明的 insertData 方法。方法签名中的参数类型和返回类型必须与被重写的方法一致。

  3. 方法体: 方法体包含了实际的代码逻辑。这段代码的目的是在插入图书信息之前进行一些验证和处理:

    • 首先,检查传入的 book 对象的 title、author 和 readStatus 是否为 null。如果有任何一个为 null,就会抛出 IllegalArgumentException 异常,提示必要的参数不能为空。

    • 然后,对传入的 title 进行修整,去掉前后的空格,以确保数据的准确性。

    • 接着,使用 bookMapper.existsByTitle(title) 方法检查数据库中是否已经存在具有相同标题的图书。如果存在重复的标题,会抛出 IllegalArgumentException 异常,提示标题重复。

    • 最后,如果验证通过,调用 bookMapper.insertData(book) 方法将传入的图书信息插入到数据源中。

这段代码实现了向数据源插入图书信息的操作,并在插入前进行了一些数据验证和处理,以确保数据的完整性和准确性。

5.1.4 BookMapper.java

    void insertData(Book book);

代码点评: 

在 MyBatis 中,Mapper 接口的方法声明定义了对数据库的操作。这个 void insertData(Book book); 就是一个 Mapper 接口中的方法声明,指定了一个用于向数据库插入图书信息的操作。

具体解释如下:

  1. void insertData(Book book);: 这是一个接口中的方法声明。它告诉 MyBatis 框架在映射配置文件中找到名为 "insertData" 的 SQL 语句,并将参数 book 中的数据插入到数据库中。

    • void: 表示该方法没有返回值。
    • insertData: 方法的名称,与映射配置文件中的 元素的 id 属性对应。
    • (Book book): 方法的参数,表示插入操作需要传入一个名为 book 的参数,它的类型是 Book 类(或其子类)。

这样,在 MyBatis 映射配置文件中配置了一个名为 "insertData" 的 元素,定义了插入操作的 SQL 语句,并在代码中调用了 insertData(book) 方法时,MyBatis 会根据配置文件的定义,执行对应的 SQL 语句,将 book 对象的数据插入到数据库中

5.1.5 BookMapper.xml

    
    
        INSERT INTO book (title, author, read_status)
        VALUES (#{title}, #{author}, #{readStatus})
    

代码点评: 

这段 XML 代码是 MyBatis 映射文件中的一个 SQL 映射,定义了一个插入操作,用于向数据库中的 "book" 表中插入数据。具体解释如下:

  • : 这是一个插入操作的声明,通过 id 属性指定了该操作的标识名,这样在 Java 代码中就可以通过这个标识名来调用这个操作。

  • INSERT INTO book (title, author, read_status): 这是 SQL 语句的一部分,表示将数据插入到 "book" 表中,指定了插入的目标表和需要插入的字段。

  • VALUES (#{title}, #{author}, #{readStatus}): 这也是 SQL 语句的一部分,用来指定插入的具体数值。#{title}, #{author}, #{readStatus} 是 MyBatis 的占位符语法,表示这里会将 Java 对象中的属性值填充进去。

    • #{title}: 这是占位符,会被实际的 title 属性值替代。
    • #{author}: 同样是占位符,会被实际的 author 属性值替代。
    • #{readStatus}: 这也是占位符,会被实际的 readStatus 属性值替代。

    这段 XML 代码定义了一个插入操作,会将传入的 title、author 和 readStatus 属性值插入到数据库的 "book" 表中的相应字段中

    5.2 图书删除接口

    5.2.1 controller.java

        public ResponseEntity> deleteById(@RequestBody Map requestParams) {
            Map data = (Map) requestParams.get("data");
            Long id = Long.valueOf(data.get("id").toString());
            // 构建返回结果
            boolean isDeleted = bookService.deleteById(id);
            if (isDeleted) {
                Map successResponse = new HashMap<>();
                successResponse.put("message", "图书被删除!");
                successResponse.put("status", "success");
                return ResponseEntity.ok(successResponse);
            } else {
                Map failResponse = new HashMap<>();
                failResponse.put("message", "需要删除的图书不存在!");
                failResponse.put("status", "fail");
                return ResponseEntity.status(HttpStatus.NOT_FOUND).body(failResponse);
            }
        }
    

    代码点评: 

    这段代码是一个 Spring Boot 控制器方法,用于处理删除图书的请求。下面是代码的解释:

    • public ResponseEntity> deleteById(@RequestBody Map requestParams) {: 这是一个控制器方法的声明。它使用了 @RequestBody 注解,表示请求体中的数据会被映射为一个 Map 对象,并且返回一个 ResponseEntity 对象,该对象包含了响应数据以及 HTTP 状态码等信息。

    • Map data = (Map) requestParams.get("data");: 这行代码从请求参数的 data 字段中获取了一个嵌套的 Map 对象,这个嵌套的 Map 包含了需要的删除操作数据。

    • Long id = Long.valueOf(data.get("id").toString());: 这行代码从嵌套的 Map 中获取了键为 "id" 的值,并将其转换为 Long 类型,这个 id 表示要删除的图书的唯一标识。

    • boolean isDeleted = bookService.deleteById(id);: 这行代码调用了一个 bookService 的方法来进行实际的删除操作,它会尝试根据传入的 id 来删除对应的图书数据,并返回一个布尔值表示是否删除成功。

    • if (isDeleted) { ... } else { ... }: 这是一个条件语句,用于根据删除操作的结果返回不同的响应。如果删除成功,就返回一个成功的响应,其中包含成功的消息和状态。如果删除失败,就返回一个失败的响应,其中包含失败的消息和状态,并且设置了 HTTP 响应状态码为 404(NOT FOUND)。

      这段代码实现了一个删除图书的功能,会从请求体中获取图书的唯一标识 id,然后调用服务层的方法来删除图书,并根据删除操作的结果返回不同的响应。

      5.2.2 BookService.java

        boolean deleteById(Long id);
        boolean existsByTitle(@Param("title") String title);

      代码点评: 

      当需要删除一本图书时,可以调用 boolean deleteById(Long id); 方法。这个方法通常是在一个服务接口或类中定义的。它使用图书的唯一标识符(id)来从数据库中删除对应的图书。方法的工作方式如下:

      • Long id:这个参数表示要删除的图书的唯一标识符。

      • boolean:方法的返回类型表明删除是否成功。如果图书成功删除,方法返回 true,如果删除失败,返回 false。

        另一个方法是 boolean existsByTitle(@Param("title") String title);。这个方法也通常在一个服务接口或类中定义。它用于检查数据库中是否存在具有给定标题的图书。方法的工作方式如下:

        • @Param("title") String title:这个参数表示要检查的图书的标题。

        • boolean:方法的返回类型表明具有给定标题的图书是否存在于数据库中。如果存在,方法返回 true,如果不存在,返回 false。

          这两个方法经常结合使用,以执行与在数据库中管理图书相关的各种操作。deleteById 方法负责根据图书的 ID 删除图书,而 existsByTitle 方法有助于确定数据库中是否已经存在具有特定标题的图书

          5.2.3 BookServiceImpl.java

              @Override
              public boolean deleteById(Long id) {
                  if (id == null || id <= 0) {
                      throw new IllegalArgumentException("无效的图书 ID");
                  }
                  int rowsAffected = bookMapper.deleteById(id);
                  return rowsAffected > 0;
              }

          代码点评: 

          这段代码是一个方法实现,用于从数据库中删除一本图书。下面是对这段代码的解释:

          • @Override:这个注解表示这个方法是重写自父类或接口的方法。

          • public boolean deleteById(Long id):这是一个公共方法,它的返回类型是布尔值 boolean。它接受一个类型为 Long 的参数 id,表示要删除的图书的唯一标识符。

          • if (id == null || id <= 0):这是一个条件语句,用于检查传入的图书标识符是否为无效值。如果 id 为 null 或小于等于零,就会抛出一个 IllegalArgumentException 异常,提示图书 ID 无效。

          • int rowsAffected = bookMapper.deleteById(id);:这一行调用了名为 bookMapper 的对象的 deleteById 方法,传入要删除的图书的 ID。这个方法将在数据库中执行删除操作,并返回受影响的行数(即删除的行数)。

          • return rowsAffected > 0;:根据执行删除操作后受影响的行数,这个表达式返回一个布尔值。如果受影响的行数大于零,表示删除成功,返回 true,否则返回 false。这是为了指示删除操作是否成功完成。

            这个方法的作用是接收一个图书的唯一标识符,然后调用底层的数据库访问方法,将对应的图书从数据库中删除。如果删除成功(受影响的行数大于零),方法返回 true,否则返回 false

            5.2.4 BookMapper.java

            int deleteById(@Param("id") Long id);

            代码点评: 

            这段代码是一个 MyBatis Mapper 接口中的方法定义,用于在数据库中根据图书的 ID 删除记录。下面是对这段代码的解释:

            • int deleteById(@Param("id") Long id);:这是一个接口方法定义,返回类型是整型 int。它使用了 MyBatis 的 @Param 注解,指定了参数名称和对应的映射关系。方法接受一个类型为 Long 的参数 id,表示要删除的图书的唯一标识符。

            • @Param("id"):这是 MyBatis 的注解,它用于为方法参数指定一个映射名称,这里是 "id"。在 SQL 语句中,可以通过 #{id} 来引用这个参数。

            • int:方法的返回类型是整型 int,表示删除操作受影响的行数。

              这个方法的作用是为 MyBatis 映射文件提供一个接口,通过调用这个接口的方法,可以在数据库中执行根据图书 ID 进行删除操作。在映射文件中,可以通过使用 #{id} 来获取传递的图书 ID 参数,并执行相应的删除 SQL 操作。方法的返回值表示删除操作后受影响的行数,可以用于判断删除是否成功

              5.2.5 BookMapper.xml

                  
                  
                  
                  
                      DELETE FROM book WHERE id = #{id}
                  

              代码点评: 

              这段代码是 MyBatis 映射文件中的两个 SQL 查询语句,分别用于判断指定标题的记录是否存在以及删除指定 ID 的记录。下面是对这两段代码的解释:

              1. 判断是否存在指定 title 的记录:

                • SELECT id,title,author,read_status readStatus FROM book AND title LIKE CONCAT('%', #{title}, '%') 标签:定义一个查询语句。
                • id="queryBookByTitle":为查询语句指定一个唯一的标识符。
                • resultType="com.example.book.domain.Book":指定查询结果的类型,即图书对象的类型。
                • SELECT id, title, author, read_status readStatus FROM book:实际的 SQL 查询语句,从数据库中选择图书的 id、title、author 和 read_status 字段。
                • 标签:这个标签用于生成 SQL 的 WHERE 子句,根据条件动态生成。
                • :条件判断语句,判断是否传入了 title 参数并且不为空。
                • AND title LIKE CONCAT('%', #{title}, '%'):如果满足条件,会在 SQL 查询语句中添加类似 AND title LIKE '%关键字%' 的条件,进行模糊匹配书名关键字。                                   2、查询所有图书 
                • SELECT COUNT(*) > 0 FROM book WHERE title = #{title} DELETE FROM book WHERE id = #{id} UPDATE book SET title = #{title}, author = #{author}, read_status = #{readStatus} WHERE id = #{id}

                  9.13 application.properties

                  注意我加了个1在后缀,2个文件选择1个生效即可

                  spring.datasource.url = jdbc:mysql://XX.XX.XXX.24:13300/z_liqiju_test?tinyInt1isBit=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
                  spring.datasource.username = XXX
                  spring.datasource.password = XXX
                  mybatis.mapper-locations = classpath*:mapper/*.xml
                  server.port = 5002
                  logging.level.root=info
                  #logging.level.root=DEBUG
                  #logging.level.org.mybatis=DEBUG

                  9.14 application.yml

                  原来是的项目是5001 端口,这一次改为5002端口启动防止端口冲突

                  spring:
                      datasource:
                          driver-class-name: com.mysql.jdbc.Driver
                          url: jdbc:mysql://XX.XX.XXX.24:13300/z_liqiju_test?tinyInt1isBit=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true
                          username: XXX
                          password: XXX
                  mybatis:
                      mapper-locations: classpath*:mapper/*.xml
                  server:
                      port: 5002
                  logging:
                      level:
                          root: DEBUG
                  #        org:
                  #          mybatis: INFO

                  9.15 pom.xml

                  
                  
                      4.0.0
                      
                          org.springframework.boot
                          spring-boot-starter-parent
                          3.0.4
                           
                      
                      com.example
                      book
                      0.0.1-SNAPSHOT
                      book
                      Demo project for Spring Boot
                      
                          1.8
                      
                      
                          
                          
                              org.springframework.boot
                              spring-boot-starter-jdbc
                          
                          
                          
                              org.springframework.boot
                              spring-boot-starter-web
                          
                          
                              org.mybatis.spring.boot
                              mybatis-spring-boot-starter
                              3.0.0
                          
                          
                              org.springframework.boot
                              spring-boot-devtools
                              runtime
                              true
                          
                          
                              com.mysql
                              mysql-connector-j
                              runtime
                          
                          
                              org.projectlombok
                              lombok
                              true
                          
                          
                              org.springframework.boot
                              spring-boot-starter-test
                              test
                          
                          
                              com.baomidou
                              mybatis-plus-annotation
                              3.3.1
                          
                          
                              com.baomidou
                              mybatis-plus-core
                              3.3.1
                          
                          
                              junit
                              junit
                              4.12
                              test
                          
                          
                              com.baomidou
                              mybatis-plus-extension
                              3.3.1
                          
                          
                              io.swagger
                              swagger-annotations
                              1.6.6
                          
                      
                      
                          
                              
                                  org.springframework.boot
                                  spring-boot-maven-plugin
                                  2.2.5.RELEASE
                                  
                                      
                                          
                                              org.projectlombok
                                              lombok
                                          
                                      
                                  
                              
                              
                                  org.apache.maven.plugins
                                  maven-surefire-plugin
                                  2.22.1
                                  
                                      true
                                  
                              
                          
                      
                  

                  2023年8月12日 -深圳笔

                  有疑问直接评论区见