全栈开发(四):使用springBoot3+mybatis-plus+mysql开发restful的增删改查接口

 1.创建user文件夹 作为增删改查的根包

     路径  src/main/java/com.example.demo/user

2.文件夹里文件作用介绍

1.User(实体类)

package com.example.demo.user;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;@Data // Lombok注解,自动生成getter、setter、toString、equals和hashCode等方法
@NoArgsConstructor
@AllArgsConstructor
@TableName("user") // 指定该实体类对应的数据库表名为"user"
public class User {@TableId(type = IdType.AUTO) // 主键设置为自增private Integer id; // 主键字段,对应数据库中的"id"列@TableField("name") // 明确字段与数据库列的映射关系private String name; // 用户名字段,对应数据库中的"name"列@TableField("age")private Integer age; // 年龄字段,对应数据库中的"age"列@TableField("description")private String description; // 用户描述字段,对应数据库中的"description"列
}

2.condition

UserQueryCondition

UserQueryCondition 类的主要作用是作为查询用户时的条件类,用于封装查询条件。它通常用于在接收查询参数时,将这些参数封装成对象传递给服务层或数据库查询层,以实现查询操作。具体来说,它的功能包括:

  1. 封装查询参数

    • current:当前的页码,默认为1。用于分页查询时指定查询结果的页码。
    • pageSize:每页显示的数据条数,默认为10。用于分页查询时指定每页要显示的记录数。
    • name:用户的名称,用于按名称进行模糊或精确查询。
    • age:用户的年龄,用于按年龄查询。
    • description:用户的描述信息,作为查询条件之一,用于按用户描述筛选数据。
  2. 提供数据传输对象(DTO)功能

    • 该类可以在控制器层接受前端传来的查询条件参数,也可以作为参数传递给服务层或数据访问层,从而避免在方法中传递过多参数,使代码更加简洁。
  3. 分页功能

    • 通过 currentpageSize 这两个字段,配合分页逻辑,能够实现用户信息的分页查询。开发者可以通过这两个字段计算出需要查询的具体范围(如数据库的 LIMIT 子句中的 offsetlimit),从而提高查询性能,防止一次性返回大量数据。
  4. 简化条件查询

    • 通过封装成类对象,所有查询条件可以一次性通过该类对象传递,不需要在方法中传递多个单独的查询参数,简化了方法调用的参数列表。
package com.example.demo.user.condition;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserQueryCondition {private int current = 1;       // 当前页码,默认值为1private int pageSize = 10;     // 每页显示数量,默认值为10private String name;private Integer age;private String description;
}

@Data@NoArgsConstructor@AllArgsConstructor 是 Lombok 提供的注解,用于简化 Java 类的编写。它们的作用分别如下:

  1. @Data

    • 自动生成该类的常用方法,如:
      • getters(获取属性值的方法)
      • setters(设置属性值的方法)
      • toString()(生成该类的字符串表示)
      • equals()hashCode()(用于比较和集合操作)
    • 这个注解为类提供了所有必要的工具方法,大大简化了开发时的样板代码。
  2. @NoArgsConstructor

    • 自动生成一个无参构造方法(没有参数的构造器)。
    • 这个构造方法可以在不传递任何参数的情况下创建该类的实例。
    • 使用场景:当需要先创建一个空对象,然后逐步设置其属性时(比如通过 setter 方法)。
  3. @AllArgsConstructor

    • 自动生成一个包含所有字段的有参构造方法。
    • 这个构造方法会根据类中的所有字段生成参数,方便在创建对象时一次性初始化所有属性。
    • 使用场景:当想直接在实例化对象时就传递所有字段的值。

 3.response

 1.UserCRUDResponse   

作用和上面的condition差不多,不多赘述

package com.example.demo.user.response;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserCUDResponse {private String message;   // 响应信息(如成功或失败消息)private boolean success;
}

2.UserQueryResponse

package com.example.demo.user.response;import com.example.demo.user.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserQueryResponse {private List<User> data;     // 用户数据列表private long total;          // 总记录数private String message;      // 响应信息(如成功或失败消息)private boolean success;
}

4.UserMapper

UserMapper 接口的作用是作为用户数据表的数据库操作接口,使用 MyBatis-Plus 提供的 BaseMapper 接口,来对 User 实体类对应的数据库表进行基本的 CRUD(创建、读取、更新、删除)操作。这个接口通过继承 BaseMapper<User>,不需要开发者自己编写 SQL,就可以轻松实现对 User 数据的数据库操作。

具体功能如下:

  1. 继承 BaseMapper 提供的通用 CRUD 功能

    • MyBatis-Plus 中的 BaseMapper<T> 是一个通用的 Mapper 接口,封装了常见的数据库操作方法。通过继承 BaseMapper<User>UserMapper 自动获得以下基本方法:
      • insert(T entity):插入一条记录。
      • deleteById(Serializable id):根据主键 ID 删除一条记录。
      • updateById(T entity):根据主键 ID 更新记录。
      • selectById(Serializable id):根据主键 ID 查询一条记录。
      • selectList(Wrapper<T> queryWrapper):查询多条记录。

    这些方法的 SQL 语句已经由 MyBatis-Plus 自动生成并执行,开发者不需要自己写。

  2. 与数据库交互

    • 通过 @Mapper 注解,MyBatis 会在程序启动时扫描该接口,将它注册为 MyBatis 的 Mapper,并生成相应的代理对象,处理与数据库的交互。具体来说,它会将 UserMapper 接口的方法调用,映射为对应的 SQL 语句,并将 SQL 结果映射为 User 对象。
  3. 可以扩展自定义 SQL 操作

    • 虽然 BaseMapper 提供了常见的 CRUD 方法,但如果项目中需要进行更复杂的查询或自定义 SQL 操作,UserMapper 还可以通过定义接口方法并配合 XML 文件或注解,编写自定义 SQL。例如,可以使用 @Select@Insert 等注解直接在接口中编写 SQL,或在 XML 文件中定义复杂的查询逻辑。
package com.example.demo.user;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper extends BaseMapper<User> {
}

5.UserServiceImpl 

UserServiceImplUserService 接口的具体实现类,它负责实际执行用户相关的业务逻辑操作。它通过调用数据访问层(如 UserMapper)来实现 UserService 接口定义的方法,处理具体的增删改查等业务逻辑。

主要作用:

  1. 实现业务逻辑

    • UserServiceImpl 实现了 UserService 接口中定义的各个方法,负责用户的实际操作,比如查询用户、添加用户、删除用户、更新用户等业务逻辑。
  2. 调用数据访问层

    • 通过注入 UserMapperUserServiceImpl 调用 MyBatis-Plus 提供的数据访问层方法,与数据库进行交互,完成对用户数据的操作。UserMapper 提供了基本的 CRUD 操作,而 UserServiceImpl 可以将这些操作结合业务逻辑进行封装。
  3. 为控制层提供服务

    • 控制器层(UserController)会调用 UserServiceImpl 中的方法来执行具体的业务操作。控制层只负责处理 HTTP 请求,而具体的业务逻辑由 UserServiceImpl 处理,控制层和数据访问层通过服务层(UserServiceImpl)解耦。
package com.example.demo.user;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.user.condition.UserQueryCondition;
import com.example.demo.user.response.UserCUDResponse;
import com.example.demo.user.response.UserQueryResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Optional;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic UserQueryResponse getAllUsersWithCount(UserQueryCondition condition) {IPage<User> userPage = new Page<>(condition.getCurrent(), condition.getPageSize());QueryWrapper<User> queryWrapper = new QueryWrapper<>();// 根据条件构建查询Optional.ofNullable(condition.getName()).ifPresent(name -> queryWrapper.like("name", name));Optional.ofNullable(condition.getAge()).ifPresent(age -> queryWrapper.eq("age", age));Optional.ofNullable(condition.getDescription()).ifPresent(description -> queryWrapper.like("description", description));// 执行分页查询userPage = userMapper.selectPage(userPage, queryWrapper);// 返回结果return new UserQueryResponse(userPage.getRecords(), userPage.getTotal(), "查询成功", true);}@Overridepublic UserCUDResponse addUser(User user) {try {int result = userMapper.insert(user);if (result > 0) {return new UserCUDResponse( "新增成功", true);} else {return new UserCUDResponse("新增失败,未插入任何记录", false);}} catch (Exception e) {// 捕获异常并返回错误信息return new UserCUDResponse("新增失败,错误信息:" + e.getMessage(), false);}}@Overridepublic UserCUDResponse deleteUserById(Long id) {// 使用MyBatis Plus的deleteById方法删除用户int rows = userMapper.deleteById(id);  // 返回受影响的行数if (rows > 0) {// 删除成功返回信息return new UserCUDResponse("删除成功", true);} else {// 删除失败返回信息return new UserCUDResponse( "删除失败,用户不存在", false);}}@Overridepublic UserCUDResponse updateUserById(User user) {// 使用MyBatis Plus的updateById方法更新用户int result = userMapper.updateById(user); // 返回受影响的行数if (result > 0) {return new UserCUDResponse("用户信息更新成功", true);} else {return new UserCUDResponse("用户信息更新失败", false);}}
}

 config/MybatisPlusConfig

里面配置了分页插件

package com.example.demo.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MybatisPlusConfig {// 配置 MyBatis-Plus 分页插件@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}

 

6.UserService

UserService 是一个服务层接口,定义了与用户相关的业务逻辑操作。它抽象出了一些对用户信息的常见操作,比如查询、添加、删除和更新等,供 UserController 等其他层调用。具体来说,它定义了业务方法的签名,而具体的实现通常会在一个类中实现这些接口方法(比如 UserServiceImpl)。

主要作用:

  1. 抽象业务逻辑

    • UserService 是对用户相关的业务逻辑操作的抽象,不直接操作数据库,而是通过调用数据访问层(比如 UserMapper)来实现业务逻辑。它将业务层与持久层解耦。
  2. 为控制层提供接口

    • UserController 可以调用 UserService 中定义的方法,将具体的业务操作(如用户的增删改查)委托给服务层。控制器只负责处理请求和响应,而业务逻辑则在服务层处理。
  3. 接口定义

    • UserService 只是定义了方法签名,而具体的业务逻辑如何执行,通常会在其实现类中进行处理。通过定义接口,可以有多个实现类,并在不同情况下选择不同的实现方式。

方法解析:

  1. getAllUsersWithCount(UserQueryCondition condition)

    • 根据查询条件 UserQueryCondition,获取所有用户数据和总记录数。该方法返回 UserQueryResponse 对象,通常包含用户列表和总记录数,用于分页查询。
  2. addUser(User user)

    • 该方法负责添加新用户。接收 User 对象作为参数,返回 UserCUDResponse,表示操作的结果(例如操作是否成功、用户的ID等)。
  3. deleteUserById(Long id)

    • 根据用户 ID 删除用户。接受一个 id 参数,调用底层的删除逻辑,返回 UserCUDResponse 表示删除操作的结果。
  4. updateUserById(User user)

    • 该方法用于根据用户 ID 更新用户信息。接受一个 User 对象(通常包含用户 ID 和需要更新的字段),返回 UserCUDResponse 表示更新操作的结果。
package com.example.demo.user;import com.example.demo.user.condition.UserQueryCondition;
import com.example.demo.user.response.UserCUDResponse;
import com.example.demo.user.response.UserQueryResponse;public interface UserService {UserQueryResponse getAllUsersWithCount(UserQueryCondition condition);UserCUDResponse addUser(User user); // 新增方法UserCUDResponse deleteUserById(Long id);UserCUDResponse updateUserById(User user); // 通过用户 ID 修改用户信息}

7.UserController

UserController 是一个 Spring Boot 的控制器类,负责处理与用户相关的 HTTP 请求。它作为应用程序的入口之一,接收来自客户端的请求,并将请求委托给相应的服务层进行处理。下面是 UserController 的主要作用:

主要功能:

  1. 处理 HTTP 请求

    • UserController 定义了多个处理方法(例如 getAllUsersaddUserdeleteUserByIdupdateUserById),用于响应不同的 HTTP 请求类型(GET、POST、DELETE、PUT)。
  2. 接收和解析请求参数

    • 控制器可以接收客户端传来的请求参数(如查询条件、用户数据等),并通过注解(如 @RequestBody@PathVariable@Validated)进行解析和验证。
  3. 调用服务层

    • 控制器负责调用服务层(如 UserService)的方法来执行业务逻辑。例如,当接收到添加用户的请求时,控制器会调用 UserServiceaddUser 方法来执行具体的添加操作。
  4. 构建响应

    • 控制器将服务层返回的结果(如用户数据、操作结果等)构建成 HTTP 响应返回给客户端。这可能包括状态码、响应体等。
  5. 统一接口前缀

    • 通过 @RequestMapping("/api/user"),控制器定义了一个统一的接口前缀,使得所有与用户相关的 API 都以 /api/user 开头,方便管理和使用。
package com.example.demo.user;import com.example.demo.user.condition.UserQueryCondition;
import com.example.demo.user.response.UserCUDResponse;
import com.example.demo.user.response.UserQueryResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api/user") // 统一接口前缀
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic UserQueryResponse getAllUsers(@Validated UserQueryCondition condition  // 使用 UserQueryCondition 作为查询条件) {// 直接传入查询条件到服务层return userService.getAllUsersWithCount(condition);}@PostMapping  // 使用 POST 请求添加用户public UserCUDResponse addUser(@RequestBody User user) {return userService.addUser(user);}// 删除用户接口,根据用户ID删除@DeleteMapping("/{id}")public UserCUDResponse deleteUser(@PathVariable Long id) {return userService.deleteUserById(id);}@PutMappingpublic UserCUDResponse updateUser(@RequestBody User user) {// 调用Service层的修改方法return userService.updateUserById(user);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计之:基于微信小程序的疫苗预约系统的设计与实现(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

2024全球超模大赛(北京|山东|内蒙三城联动)顺利举办

近日&#xff0c;2024 全球超模大赛&#xff08;北京|山东|内蒙&#xff09;三城联动暨新国潮文化赛事主题发布会在紫薇美力集团国贸鲁采赋盛大举行。此次发布会旨在鼓励优质模特共同传播中国传统文化&#xff0c;让其在全球范围内绽放光彩&#xff0c;展现中国人的骄傲与风采&…

【我的 PWN 学习手札】House of Botcake —— tcache key 绕过

参考自看雪课程&#xff1a;PWN探索篇 前言 我们知道&#xff0c;自对 tcachebin 添加了 key 进行了 double free 检查后&#xff0c;利用起来薛微有些困难。double free 绕过检查机制&#xff0c;实则是因为释放时会检查 tcachebin 对应 size 的所有 free chunk。那么如果第二…

【牛客网刷题记录】【java】链表

&#xff08;1&#xff09;反转链表 链接 可以说是最经典的链表题目之一&#xff0c;并且很多人经常会记不得怎么做。 但大致思路是比较简单的&#xff0c;重点就是如何用指针对链表进行反转的同时还不能丢失链表。不可避免的就是需要一个指针指向已经反转的部分&#xff08;p…

2024个人简历模板免费可编辑,可能是整理最全的简历(支持Word格式下载)

提供各行业简历模板WORD可编辑格式下载&#xff0c;涵盖求职简历模板、大学生简历模板、个人简历模板、留学简历模板、英文简历模板、免费简历模板、工作简历模板、保研简历模板、暑期实习简历、寒假实习简历、校招简历等。 都是word格式&#xff0c;直接下载就能用。 网盘链…

【CNKI/CPCI检索,本周召开】2024现代教育、人文与艺术国际会议(MEHA2024)

会议日期&#xff1a;2024年9月27-29日 会议地点&#xff1a;中国-郑州市 【主办单位】 国际应用科学与技术协会(IAAST) 【主讲嘉宾】 【论文出版与检索】 一、大会将围绕会议主题进行论文征集与遴选&#xff0c;所有投稿都必须经过2-3位组委会专家审稿。所有录用论文将发表…

无法访问zenodo.org解决方案-window系统

1.zenodo功能 科研数据库Zenodo&#xff1a;用于存储和分享科学研究成果&#xff1a;用户可以将科研论文、数据集、软件代码、预印本、技术报告等各种科研成果上传至Zenodo平台&#xff0c;进行存储和分享。 2.查询zenodo.org的ip地址 用站长之家网站&#xff1a;http://ip.…

【已解决】键盘输入数字-使用JAVA语言实现键盘输入的数字再通过快速排序算法输出

文章目录 一、前言任务描述相关知识分治策略&#xff1a;编程要求测试说明 二、具体代码实现总结 一、前言 —快速排序 任务描述 在待排序的n个元素中任取一个元素&#xff08;通常取第一个元素&#xff09;作为基准&#xff0c;把该元素放入最终位置后&#xff0c;整个数据序…

C++(学习)2024.9.23

目录 运算符重载 1.概念 2.友元函数运算符重载 3.成员函数运算符重载 4.特殊运算符重载 1.赋值运算符重载 2.类型转换运算符重载 5.注意事项 std::string字符串类&#xff1a; 模板与容器 模板 1.函数模板 2.类模板 类内实现 类内声明类外实现 容器 1.标准模板库…

uniapp框架下scroll-view使用注意事项

在开发蓝牙调试app的过程&#xff0c;需要显示接收到的蓝牙硬件信息&#xff0c;主要需求是要求新收到的信息能够显示到显示区域。 如上图所示&#xff0c;第一个框为接受信息显示框&#xff0c;显示框在每次接收到信息化后自动向上滚动&#xff0c;以便显示最近收到的信息。 …

python爬虫案例——腾讯网新闻标题(异步加载网站数据抓取,post请求)(6)

文章目录 前言1、任务目标2、抓取流程2.1 分析网页2.2 编写代码2.3 思路分析前言 本篇案例主要讲解异步加载网站如何分析网页接口,以及如何观察post请求URL的参数,网站数据并不难抓取,主要是将要抓取的数据接口分析清楚,才能根据需求编写想要的代码。 1、任务目标 目标网…

总结拓展十一:S4 HANA和ECC区别

第一节 S/4 HANA系统简介 SAP系统的产品线 R/1版本——主要财务模块R/3版本——基本实现全模块ECC6.0——2005年推出&#xff08;ECC是2004年推出&#xff09;HANA——数据库产品——属于内存数据库BW on HANA——HANA与数据分析相结合 拓展&#xff1a; 数据库类型&#x…

EEPROM手册阅读笔记

目录 一、特征描述二、功能描述三、总线特性四、设备寻址五、写入操作1.字节写入2.页写入 六、读取操作1.当前地址读取2.随机读取3.顺序读取 一、特征描述 1.Microchip Technology Inc. 24AA04/24LC04B &#xff08;24XX04*&#xff09; 是一款 4 Kbit 电气可擦除 PROM。该器件…

初学者怎么入门大语言模型(LLM)?看完这篇你就懂了!

当前2024年&#xff0c;LLM领域发展日新月异&#xff0c;很多新的实用技术层出不穷&#xff0c;个人认为要跟上LLM的发展&#xff0c;需要掌握以下内容&#xff0c;并需要不断地跟踪学习。 入门LLM前置基础 深度学习基础知识&#xff1a;推荐李宏毅的深度学习课程Python和num…

STM32(三)GPIO输出、LED及蜂鸣器操作

一、GPIO 1.GPIO介绍 2.GPIO结构 stm32寄存器有32位&#xff0c;GPIO是16位&#xff0c;是stm32的低16位。 3.GPIO模式 4.GPIO应用电路 二、LED操作 1.操作GPIO的三个步骤 &#xff08;1&#xff09;使用RCC开启GPIO时钟 &#xff08;2&#xff09;使用GPIO初始函数初始化…

动态规划算法:10.路径问题_地下城游戏_C++

目录 题目链接&#xff1a;174. 地下城游戏 - 力扣&#xff08;LeetCode&#xff09; 一、题目解析 题目&#xff1a;​编辑 解析&#xff1a; 二、算法原理 1、状态表示 2、状态转移方程 状态转移方程推理&#xff1a; 3、初始化 dp表初始化: 特殊位置初始化&#…

【AcWing】基础算法

目录 1、快速排序 1.1 快速排序 1.2 第k个数 2、归并排序 2.1 归并排序 2.2 逆序对的数量 3、二分 3.1 数的范围 3.2 数的三次方根 4、高精度 4.1 高精度加法 4.2 高精度减法 4.3 高精度乘法 4.4 高精度除法 5、前缀和与差分 5.1 前缀和 5.2 子矩阵的和 5.3 …

基于jsp的图书馆管理系统的设计与实现 (含源码+sql+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于jsp的图书馆管理系统8拥有两种角色&#xff0c;分别为管理员和学生&#xff0c;具体功能如下&#xff1a; 管理员&#xff1a;图书管理、用户管理、违规处理、权限管理、个人信息修改…

某恩加密数据爬虫逆向分析

目标网站 aHR0cHM6Ly93d3cuZW5kYXRhLmNvbS5jbi9pbmRleC5odG1s 一、抓包分析 响应数据加密 二、逆向分析 下断点&#xff0c;刷新页面 一直往下跟栈&#xff0c;发现是在这进行的加密 内部实现逻辑 本地数据获取 本文章仅提供技术分享交流学习&#xff0c;不可对目标服务器造…

OpenAI最新GPT-o1-preview测评

OpenAI最新GPT-o1-preview测评 测试之后感觉这个相对GPT4o&#xff0c;能力上升了一个大的台阶&#xff0c;思考能力极强的最强GPT模型 之前用GPT4o测试过类似的题目&#xff0c;做的效果极差&#xff0c;答案直接就是错&#xff0c;这次GPT-o1-preview居然做对了&#xff0c;逻…