前端视角下的Spring-Boot语法学习:demo-todo-list 实现数据库增删改查

avatar
作者
筋斗云
阅读量:2

24.png

今日话题

基于 Spring Boot 实现增删改查,并且使用mysql数据库来实现
作者:云层上的光
时间:2024年6月21日 16时36分14秒

主线任务

一、项目创建

1、点击 “新建项目”,创建项目用来演示 Spring Boot 实现增删改查
image.png
2、填写项目配置:详细版见:
image.png
3、选择 3.1.1 项目版本作为演示,详细见 支线任务一

  1. Lombok
  2. Spring Web
  3. MyBatis Framework
  4. MySQL Driver

image.png
mysql 相关依赖选择
image.png
4、使用 Maven 下载依赖,(详细版见:https://www.yuque.com/chuxin-cs/spring-boot-demo/dx1zlnxducmrtgih
image.png
5、如果遇到依赖安装报错,详细版见:支线任务二

二、实现 controller 增删改查方法

1、新建 controller 软件包、并且新建 UserController 文件类
image.png
2、编写“增删改查”方法
image.png
3、代码如下:

package com.chuxin.demotodolist.controller;  import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;  @RestController @RequestMapping("/user") public class UserController {     // 增加     @PostMapping("/add")     private String add() {         return "add";     }     // 删除     @PostMapping("/delete")     public String delete() {         return "delete";     }     // 修改     @PostMapping("/edit")     public String edit() {         return "edit";     }     // 查看     @GetMapping("/getList")     public String getList() {         return "getList";     } } 

三、实现 entity 实体类

1、新建 entity 软件包
image.png
2、新建 User 实体类
image.png
3、User 首字母大写,然后选择“类”回车创建
image.png
4、在 demo-crud 中介绍了 生成 Getter 和 Setter 这里采用 Lombok
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四、Mysql 数据库设计

1、打开自己喜欢的数据库图形化工具,当前使用的是 Navicat Premium下载教程见
image.png
2、连接本地数据库
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
3、选择 Mysql 进行连接
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
4、填写 Mysql 连接信息
image.png
5、点击“连接测试”提示“连接成功”
image.png
6、点击 “确认”,进行本地 Mysql 进行连接
image.png
7、双击打开连接的本地数据库
image.png
8、由于之前 go 在进行数据库操作时创建过,先删除 spring-boot-demo
image.png
9、点击右键删除 “spring-boot-demo”
image.png
10、创建数据库
image.png
11、填写数据库信息,点击确认进行创建~
提示:(想了想这里按照项目名称来创建 ,此处创建 demo-todo-list,关于上面 spring-boot-demo 的删除操作多此一举了)

字符集:utf8mb4 – UTF-8 Unicode
排序规则:utf8mb4_general_ci

image.png
12、双击打开创建的 demo-todo-list 数据库
image.png
13、新建表
image.png
14、完成数据库设计(设计层面,先一切从简)
image.png
15、sys_user 表sql:

CREATE TABLE `sys_user` (   `id` int NOT NULL AUTO_INCREMENT COMMENT '用户id',   `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名',   `password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码',   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; 

16、保存表,并且表名设计为 sys_user
image.png
17、此时 sys_user 表就创建完成了
image.png

五、Service 实现业务

1、新建 service 软件包
image.png
2、新建 UserService 选择“接口”进行创建
image.png
3、新建 impl 软件包
image.png
4、impl 包中新建 UserServiceImpl 类文件
image.png
5、此时文件路径如下:
image.png
6、编写 service/UserSerive 接口
image.png
代码如下:

package com.chuxin.demotodolist.service;  public interface UserService {     // 增加     String add();     // 删除     String delete();     // 修改     String edit();     // 查看     String getList(); } 

7、实现 service.impl.UserServiceImpl 业务代码
image.png

六、Mapper 层操作 mybatis

1、新建 mapper 软件包
image.png
2、新建 UserMapper 接口
image.png
3、实现 UserMapper 增删改查
image.png
代码如下:

package com.chuxin.demotodolist.mapper;  import com.chuxin.demotodolist.entity.User; import org.apache.ibatis.annotations.*;  import java.util.List;  @Mapper public interface UserMapper {     // 增     @Insert("insert into sys_user (name,password) values (#{name},#{password})")     Integer add(User user);     // 删     @Delete("delete from sys_user where id=#{id}")     Integer delete(Integer id);     // 改   后期我才发现这里没有增加修改的条件 不过为了研究就先这样了     @Update("update sys_user set name=#{name},password=#{password}")     Integer edit(User user);     // 查     @Select("select * from sys_user")     List<User> getList(); }  

4、改造 service/UserSerive 接口文件
image.png
5、代码如下:

package com.chuxin.demotodolist.service;  import com.chuxin.demotodolist.entity.User;  import java.util.List;  public interface UserService {      // 增加     Integer add(User user);      // 删除     Integer delete(Integer id);      // 修改     Integer edit(User user);      // 查看     List<User> getList(); }  

6、改造 impl 包中新建 UserServiceImpl 类文件
image.png
7、代码如下:

package com.chuxin.demotodolist.service.impl;  import com.chuxin.demotodolist.entity.User; import com.chuxin.demotodolist.mapper.UserMapper; import com.chuxin.demotodolist.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List;  @Service public class UserServiceImpl implements UserService {     @Autowired     private UserMapper userMapper;     // 增加     @Override     public Integer add(User user) {         return userMapper.add(user);     }     // 删除     @Override     public Integer delete(Integer id) {         return userMapper.delete(id);     }     // 修改     @Override     public Integer edit(User user) {         return userMapper.edit(user);     }     // 查看     @Override     public List<User> getList() {         return userMapper.getList();     } } 

8、改造 controller 下 UserController 文件类
image.png
代码如下:

package com.chuxin.demotodolist.controller;  import com.chuxin.demotodolist.entity.User; import com.chuxin.demotodolist.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List;  @RestController @RequestMapping("/user") public class UserController {     @Autowired     private UserService userService;     // 增加     @PostMapping("/add")     private Integer add(@RequestBody User user) {         return userService.add(user);     }     // 删除     @PostMapping("/delete")     public Integer delete(@RequestBody Integer id) {         return userService.delete(id);     }     // 修改     @PostMapping("/edit")     public Integer edit(@RequestBody User user) {         return userService.edit(user);     }     // 查看     @GetMapping("/getList")     public List<User> getList() {         return userService.getList();     } }  

七、项目启动~

1、启动项目
image.png
2、提示 Lombok 相关操作,点击 “启动注解处理”
image.png
3、终端启动报错
image.png
4、将 application.properties 修改为 application.yaml 文件
image.png
5、application.yaml 修改完成~
image.png
6、为什么要修改为 yaml 文件,主要出于两个方面的原因:

当然两个文件用那个都是可以的,我觉得没有必要纠结,习惯那个用那个

  • yaml 用的人比较多
  • yaml 更加清晰,更好维护

7、解决办法,application.yaml 文件修改如下:
image.png
代码如下:

# spring config 配置 spring:   # 当前项目名称   application:     name: demo-todo-list      # 数据库相关操作   datasource:     # 数据库连接使用 jdbc     driver-class-name: com.mysql.cj.jdbc.Driver     # 连接地址     url: jdbc:mysql://localhost:3306/demo-todo-list?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai     # 用户名     username: root     # 密码     password: 123456 

8、再次启动,运行成功
image.png

八、接口测试

接口测试使用的 Apifox ,可以在线使用 Web 省去安装桌面端步骤
image.png

1、增加

1.1、点击发送,调用新增用户接口 http://localhost:8080/user/add
image.png
1.2、查看数据库,用户新增成功,但是插入数据失败
image.png
1.3、启动调试模式
image.png
1.4、清除打印日志
image.png
1.5、添加断点
image.png
1.6、再次点击发送
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
1.7、断点中 name 和 password 存在值
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
1.8、查看数据库,新增成功,(问题是代码没改动,不知道为什么又好了)
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
1.9、为了后续流程,取消断点调试模式
image.png
1.10、重新运行项目
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2、查询

1、点击发送,调用查询用户接口 http://localhost:8080/user/getList
image.png
2、数据查询成功
image.png

3、删除

1、点击发送,调用删除用户接口 http://localhost:8080/user/delete
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
2、删除失败,接口 400 了
image.png
3、调用接口前删除日志,方便查看日志信息,此时终端已经报错
image.png
4、报错信息如下:
image.png
错误信息如下:

Resolved [org.springframework.http.converter.HttpMessageNotReadableException:  JSON parse error:  Cannot deserialize value of type `java.lang.Integer` from Object value (token `JsonToken.START_OBJECT`)] 

5、找到问题所在,这是因为:

使用@RequestBody 接收的是个对象,而我们在接口传参时用的格式是:
{ id: 4 }
所以这里 id 是一个对象{id: 4} 调用userService.delete(id) 希望传入的是整数类型
我们现在传递的是 {id:1} 所以就报错

image.png
6、改造如下:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
代码如下:

package com.chuxin.demotodolist.controller;  import com.chuxin.demotodolist.entity.User; import com.chuxin.demotodolist.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List;  @RestController @RequestMapping("/user") public class UserController {     @Autowired     private UserService userService;       // 删除     @PostMapping("/delete")     public Integer delete(@RequestBody User user) {         return userService.delete(user.getId());     }      }  

7、重启项目,并且启动成功之后清除日志
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
8、调用接口删除,返回1 说明数据库成功 这里的1代表在数据库中影响1行
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
9、数据库查看,删除成功
image.png

4、修改

1、在“删除”接口报错时看到了这里的sql 语句错误,没有给定修改条件,先尝试不删除试试报出的错误是什么样的
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
2、重启项目,清除日志
image.png
3、点击发送,调用修改用户接口 http://localhost:8080/user/edit
image.png
4、返回整数3,这说明数据影响了3行,不会不给条件的话 给所有的数据进行更新吧?而且程序并没有报错
image.png
5、查看 数据库,数据全部同步更新了~
image.png
6、改造 UserMapper 接口文件,增加条件,然后重启项目
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
7、重新调用接口,修改id=1 的name为 chuxin
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
8、查看数据库,修改成功
image.png

支线任务

一、项目依赖介绍

1、Lombok

用来生成实体类 Getter 和 Setter 架包

不使用 Lombok 的情况
image.png
使用 Lombok
image.png
总结: 简化代码

2、Spring Web

Spring Web 提供了强大的 Web MVC 框架,用于构建灵活和可扩展的 Web 应用程序

简单点理解就是专门做 web 端接口开发,提供了很多注解,目前常用的注解有:
controller 相关的就有:

  • @RestController
  • @RequestMapping
  • @GetMapping
  • @PostMapping
  • @RequestBody

总结:还有很多并没有列举出来,但是只是知道 Spring Web 是干什么的,也可以理解为前端的 Vue

3、MyBatis Framework

是一个优秀的持久层框架,它确实支持自定义 SQL、存储过程以及高级映射。它通过提供映射文件(或注解)来配置 SQL 映射规则,将 Java 对象与 SQL 查询结果进行映射,提供了灵活的数据库操作方式

提供了很多注解:

  • @Insert 更新
  • @Delete 删除
  • @Update 更新
  • @Select 查询

image.png
总结:方便 mysql 数据库操作

4、MySQL Driver

Java 应用程序中连接和操作 MySQL 数据库的驱动程序,它实现了 JDBC(Java Database Connectivity)API 规范。MySQL Driver 提供了连接 MySQL 数据库、执行 SQL 查询和更新等功能,是 Java 开发中与 MySQL 数据库交互的基础

当前架包会在 application.yaml 进行配置
image.png
总结:Spring Boot 作为 Web 框架,实际项目中可能存在不使用 mysql 有可能会使用其他的数据库,每个数据库都有自己的标准,所以就会让数据库厂商自己开发数据库驱动架包提供给开发者使用,这样厂商自己做兼容不比 Java 去做兼容好的多,这样也好发展生态
所以流程是:controller -> service -> mapper-> mybatis -> jdbc.Driver -> 操作mysql数据库
此时如果换数据库的话 只需要把 jdbc.Driver 换成其他对应的数据库的数据驱动~ 想让我Java来干这么多数据库的连接兼容门都没有,想都不要想

5、pom.xml 相关依赖如下:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">   <modelVersion>4.0.0</modelVersion>    <!-- 父工程 spring web -->   <parent>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-parent</artifactId>     <version>3.3.1</version>     <relativePath/> <!-- lookup parent from repository -->   </parent>    <!--  -->   <groupId>com.chuxin</groupId>   <artifactId>demo-todo-list</artifactId>   <version>0.0.1-SNAPSHOT</version>   <name>demo-todo-list</name>   <description>demo-todo-list</description>    <!-- java jdk 版本17 -->   <properties>     <java.version>17</java.version>   </properties>    <dependencies>      <!-- Spring Web 依赖 -->     <dependency>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-web</artifactId>     </dependency>      <!--  mybatis -->     <dependency>       <groupId>org.mybatis.spring.boot</groupId>       <artifactId>mybatis-spring-boot-starter</artifactId>       <version>3.0.3</version>     </dependency>      <!-- MySQL Driver -->     <dependency>       <groupId>com.mysql</groupId>       <artifactId>mysql-connector-j</artifactId>       <scope>runtime</scope>     </dependency>      <!-- lombok -->     <dependency>       <groupId>org.projectlombok</groupId>       <artifactId>lombok</artifactId>       <optional>true</optional>     </dependency>      <!-- Spring Web 单元测试依赖 -->     <dependency>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-test</artifactId>       <scope>test</scope>     </dependency>      <!-- mybatis 单元测试依赖 -->     <dependency>       <groupId>org.mybatis.spring.boot</groupId>       <artifactId>mybatis-spring-boot-starter-test</artifactId>       <version>3.0.3</version>       <scope>test</scope>     </dependency>   </dependencies>     <!-- 项目打包相关依赖 -->   <build>     <plugins>       <plugin>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-maven-plugin</artifactId>         <configuration>            <!-- 排除lombok -->           <excludes>             <exclude>               <groupId>org.projectlombok</groupId>               <artifactId>lombok</artifactId>             </exclude>           </excludes>         </configuration>       </plugin>     </plugins>   </build>  </project>  

总结:此文件相当于前端的 package.json 文件,后续会重新增加一篇文件进行深入学习

二、项目架包安装依赖报错

1、如果部分依赖下载失败,此时控制台会抛出错误:
image.png
2、点击“刷新”按钮,重新下载依赖,先排除一下看是否是网络的问题
image.png
3、再次点击 “Maven”刷新之后 发现还是报错,按照图中 “第2步” 操作,点击进行强制更新~
image.png
4、点击强制更新之后,发现 Maven 报错:Could not acquire lock(s)
image.png
5、在网上找到类似的问题,大致解决的方式如下:

  • 在网上找到的第一个方案说的大致原因是:
    • 另一个 Maven 进程正在运行,占用了所需的文件锁 Maven 进程意外终止,但文件锁未被释放
  • 解决方案:
    • 感觉看着不像是这个问题,不过我先试试吧,方案是:重启 idea

重启 idea 之后,点击 Maven 刷新 按钮,确实不报错了!
image.png

三、启动项目,编译报错,配置Mysql

1、启动项目,终端控制台编译报错,这是因为我们集成了 Mysql Driver 架包,而 Spring Boot 是一个约定大于配置,使用了 Mysql Driver 架包就需要要配置相应的 Spring Boot 配置,所以在启动的时候会报错
image.png
2、将 application.properties 修改为 application.yaml 文件
image.png
3、为什么要修改为 yaml 文件,主要出于两个方面的原因:

当然两个文件用那个都是可以的,我觉得没有必要纠结,习惯那个用那个

  • yaml 用的人比较多
  • yaml 更加清晰,更好维护

4、解决办法,application.yaml 文件修改如下:
image.png
代码如下:

# spring config 配置 spring:   # 当前项目名称   application:     name: demo-todo-list      # 数据库相关操作   datasource:     # 数据库连接使用 jdbc     driver-class-name: com.mysql.cj.jdbc.Driver     # 连接地址     url: jdbc:mysql://localhost:3306/demo-todo-list?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai     # 用户名     username: root     # 密码     password: 123456 

5、再次启动,运行成功
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四、Service 层概念是做什么的?

1、Java 中 Service 层一般用于 编写业务代码
image.png
2、implements 文件是干什么的
image.png
3、那它有什么好处呢?我们可以尝试把现有的增删改差删除掉
image.png
4、目前能想到的场景就是:

如果当前内部的业务写了有超过1000行,然后想在业务中增加一个方法 并且需要重构其中业务,代码假如又不是自己写的,而且又不知道当前 Service 中那些方法被外部其他类调用了,如果不敢直接在这个文件中重构,如果新增一个类进行重构,那么这个时候 接口 就很好的帮我们解决了
通过继承之后 我们至少知道要实现几个方法 并且方法的传参 显而易见

image.png

五、@Service 和 @Override 是干啥的

传统开发中 用一个类 需要new 这样的在业务很复杂的时候改动起来就很麻烦 然后Spring boot 就有了ioc 就像一个池子 把项目中用到的所有的类通过 @Component 注入到池子中再通过 @Autowired取出来 这样在用的地方就不需要new了

所以:@service 它的作用是将类实例化和组件化,交给 ioc 容器进行生命周期管理
先小总结一下:很像 Vuex 状态管理,用一个池子将项目所有用到的类管理起来 在内部就实例化了再通过 @Autowired进行取值

1、@Service 其实就是一个注解,主要的是免除在其他类中使用时不用进行 new 实例化操作
image.png
2、内部值得一提的注解 @Component
image.png
3、配合 @Autowired 在池子中取出来,简化了 new 实例化,
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
总结:作为前端我太熟了,不就是直接在 Vue.prototype 上挂载属性和属性方法嘛,这样在内部使用时就不需要老是导入

3、@Override 实现父类中的方法

@Service 注解用于标识一个类作为 Spring 中的服务层组件,而 @Override 注解用于标识方法覆盖了父类或接口中的方法。这两个注解都是在不同的上下文中用来增强代码的可读性、可维护性和安全性的工具。

image.png
总结:有点像 ts 中给定了 interface 就需要实现它,只是 Spring Boot 中覆写需要用 @Override

六、Mapper 层概念用处?

在 Spring Boot 中,@Mapper 注解通常用于标记一个接口,指示 MyBatis 或者其他类似的持久层框架来扫描并生成对应的实现类

1、定义数据访问接口,这样就可以定义一个 Java 接口,其中声明了需要执行的 SQL 操作,如插入、更新、删除、查询等操作方法,但不需要实现这些方法的具体逻辑

package com.chuxin.demotodolist.mapper;  import com.chuxin.demotodolist.entity.User; import org.apache.ibatis.annotations.*;  import java.util.List;  @Mapper public interface UserMapper {     // 增     @Insert("insert into sys_user (name,password) values (#{name},#{password})")     Integer add(User user);     // 删     @Delete("delete from sys_user where id=#{id}")     Integer delete(Integer id);     // 改     @Update("update sys_user set name=#{name},password=#{password} where id=#{id}")     Integer edit(User user);     // 查     @Select("select * from sys_user")     List<User> getList(); }  

2、和Service一样会注入到 Spring 容器中:生成的实现类会被作为 Spring Bean 注入到 Spring 容器中,可以在其他组件(如 Service 层)中直接通过依赖注入来使用,而不需要手动编写实现类
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

七、pom.xml 项目依赖文件

<!-- 这里一般不会变 xml 的格式 --> <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">   <modelVersion>4.0.0</modelVersion>       <!--继承父工程 好处:自动帮我们管理包的版本-->   <parent>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-parent</artifactId>     <version>3.3.1</version>     <relativePath/> <!-- lookup parent from repository -->   </parent>      <!-- 结合maven仓库来看,groupId 就是一个目录位置,artifactId 是打包后的包名 -->   <!-- 工程包名 -->   <groupId>com.chuxin</groupId>     <!-- 项目名 -->   <artifactId>demo-todo-list</artifactId>    <!-- 项目版本 -->   <version>0.0.1-SNAPSHOT</version>    <!-- 名称 -->   <name>demo-todo-list</name>    <!--项目描述-->   <description>demo-todo-list</description>      <!-- Java版本 现在基本上用8  我在学习阶段无所谓 -->   <properties>     <java.version>17</java.version>   </properties>    <!--项目依赖-->   <dependencies>       <!-- spring boot web 启动依赖  这个就好比是前端的 vue  -->     <dependency>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-web</artifactId>     </dependency>      <!--  mybatis 依赖架包 -->     <dependency>       <groupId>org.mybatis.spring.boot</groupId>       <artifactId>mybatis-spring-boot-starter</artifactId>       <version>3.0.3</version>     </dependency>      <!-- MySQL Driver 数据驱动 -->     <dependency>       <groupId>com.mysql</groupId>       <artifactId>mysql-connector-j</artifactId>       <scope>runtime</scope>     </dependency>      <!-- lombok 注解生成插件 少写getter/setter -->     <dependency>       <groupId>org.projectlombok</groupId>       <artifactId>lombok</artifactId>       <optional>true</optional>     </dependency>      <!-- Spring Web 单元测试依赖 -->     <dependency>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-test</artifactId>       <scope>test</scope>     </dependency>      <!-- mybatis 单元测试依赖 -->     <dependency>       <groupId>org.mybatis.spring.boot</groupId>       <artifactId>mybatis-spring-boot-starter-test</artifactId>       <version>3.0.3</version>       <scope>test</scope>     </dependency>   </dependencies>     <!-- 项目打包相关依赖 -->   <build>     <plugins>       <plugin>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-maven-plugin</artifactId>         <configuration>            <!-- 排除lombok -->           <excludes>             <exclude>               <groupId>org.projectlombok</groupId>               <artifactId>lombok</artifactId>             </exclude>           </excludes>                    </configuration>       </plugin>     </plugins>   </build>  </project>  

代码仓库

spring-boot-demo/demo-todo-list at master · chuxin-cs/spring-boot-demo

往期内容

🌱 目录

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!