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

news2024/9/24 0:00:12

 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;       // 当前页码,默认值为1
    private int pageSize = 10;     // 每页显示数量,默认值为10
    private 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 {

    @Autowired
    private UserMapper userMapper;

    @Override
    public 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);
    }

    @Override
    public 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);
        }
    }

    @Override
    public UserCUDResponse deleteUserById(Long id) {
        // 使用MyBatis Plus的deleteById方法删除用户
        int rows = userMapper.deleteById(id);  // 返回受影响的行数
        if (rows > 0) {
            // 删除成功返回信息
            return new UserCUDResponse("删除成功", true);
        } else {
            // 删除失败返回信息
            return new UserCUDResponse( "删除失败,用户不存在", false);
        }
    }

    @Override
    public 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 分页插件
    @Bean
    public 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 {

    @Autowired
    private UserService userService;

    @GetMapping
    public 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);
    }

    @PutMapping
    public UserCUDResponse updateUser(@RequestBody User user) {
        // 调用Service层的修改方法
        return userService.updateUserById(user);
    }
}

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

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

相关文章

利用影刀实现批量发布文章的RPA流程(附视频演示)

前言 大家好&#xff0c;我是小智。在这篇文章中&#xff0c;我将分享一个实战案例&#xff0c;展示如何利用影刀实现批量发布文章的RPA流程。这里主要介绍其中一个简单步骤&#xff0c;其它步骤将通过视频演示。有使用方面的疑问可以留言。 影刀是一款强大的自动化工具&#x…

Matlab|考虑柔性负荷的综合能源系统低碳经济优化调度

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序主要实现的是考虑柔性负荷的综合能源系统低碳经济优化调度&#xff0c;模型参考《考虑柔性负荷的综合能源系统低碳经济优化调度》&#xff0c;求解方法采用的是混合整数规划算法&#xff0c;通过matlabc…

医学数据分析实训 项目四 回归分析--预测帕金森病病情的严重程度

文章目录 项目四&#xff1a;回归分析实践目的实践平台实践内容 预测帕金森病病情的严重程度作业&#xff08;一&#xff09;数据读入及理解&#xff08;二&#xff09;数据准备&#xff08;三&#xff09;模型建立&#xff08;四&#xff09;模型预测&#xff08;五&#xff0…

如何使用cmd命令查看本机电脑的主机名?

1、按键盘win R 键&#xff0c;输入cmd&#xff0c;然后按一下【回车】 2、输入ping -a localhost , 然后按下【回车】 3、如下Ping 后面的DESKTOP-ALB9JF7即是本机电脑的【主机名】

浮动静态路由

浮动静态路由 首先我们知道静态路由的默认优先级是60&#xff0c;然后手动添加一条静态路由优先级为80的路由作为备份路由。当主路由失效的备份路由就会启动。 一、拓扑图 二、基本配置 1.R1: <Huawei>system-view [Huawei]sysname R1 [R1]interface GigabitEthernet…

linux的ssh命令使用介绍

目录 一、SSH的基本概念 二、SSH的工作原理 1、建立连接 2、密钥交换 3、认证 4、加密通信 三、SSH的主要功能 1、远程登录 2、文件传输 3、端口转发 四、SSH的安全性 五、SSH的应用场景 六、SSH的实现软件 一、SSH的基本概念 SSH主要用于登录远程服务器和执行命令、传输文…

使用Conda配置python环境到Pycharm------Window小白版

使用Conda配置python环境到Pycharm 一、Conda安装和环境配置1.1 安装Conda软件1.2 判断是否安装成功1.3 创建Conda虚拟环境 二、 pycharm的安装2.1 Pycharm使用手册2.2 安装pycharm 三、 pycharm导入Conda环境 一、Conda安装和环境配置 anaconda官网 1.1 安装Conda软件 运行…

TryHackMe 第4天 | Pre Security (三)

该学习路径讲解了网络安全入门的必备技术知识&#xff0c;比如计算机网络、网络协议、Linux命令、Windows设置等内容。过去两篇已经对计算机网络和网络协议进行了简单介绍&#xff0c;本篇博客将记录 Linux命令 部分。 Linux 系统的优点就是其轻量级&#xff0c;有些 Linux 系…

通过spring-boot创建web项目

依赖的软件 maven 1. 官网下载zip 文件&#xff0c;比如apache-maven-3.9.9-bin.zip 2. 解压到某个盘符&#xff0c;必须保证父亲目录的名字包含英文&#xff0c;数字&#xff0c;破折号&#xff08;-&#xff09; 3. 设置环境变量M2_HOME, 并将%M2_HOME%\bin添加到windown…

Linux:Bash中的文件描述符详解

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的所有进程&#xff0c;都拥有自己的文件描述符(File Descriptor, FD)&#xff0c;它是操作系统在管理进程和文件时的一种抽象概念。每个文件描述符由一个非负整…

2012-2019全球地表平均夜光年度数据

数据详情 2012-2019全球地表平均夜光年度数据 数据属性 数据名称&#xff1a;全球地表平均夜光年度数据 数据时间&#xff1a;2012-2019 空间位置&#xff1a;全球 数据格式&#xff1a;tif 空间分辨率&#xff1a;1500米 时间分辨率&#xff1a;年 坐标系&#xff1a;…

【自学笔记】支持向量机(3)——软间隔

引入 上一回解决了SVM在曲线边界的上的使用&#xff0c;使得非线性数据集也能得到正确的分类。然而&#xff0c;对于一个大数据集来说&#xff0c;极有可能大体呈线性分类趋势&#xff0c;但是边界处混杂&#xff0c;若仍采用原来的方式&#xff0c;会得到极其复杂的超平面边界…

高效高质量SCI论文撰写及投稿

第一章、论文写作准备即为最关键 1、科技论文写作前期的重要性及其分类 2、AI工具如何助力学术论文 3、研究主题确定及提高创新性 兴趣与背景&#xff1a;选择一个您感兴趣且有背景知识的研究领域。 创新性&#xff1a;选题和研究设计阶段如何提高学术创新性的方法。 研究缺…

FreeMarker 禁止自动转义标签-noautoesc

&#x1f496;简介 FreeMarker 是一个用 Java 语言编写的模板引擎&#xff0c;它被设计用来生成文本输出&#xff08;HTML 网页、电子邮件、配置文件等&#xff09;。在 FreeMarker 中&#xff0c;默认情况下&#xff0c;当你在模板中输出变量时&#xff0c;如果这些变量包含 …

应用密码学第一次作业(9.23)

一、Please briefly describe the objectives of information and network security,such as confidentiality, integrity, availability , authenticity , and accountability The objectives of information and network security include: Confidentiality: Protecting se…

在线思维导图怎么制作?只需要台这些组合分析法!

思维导图经历了漫长的进化&#xff0c;现已成为信息组织、记忆和头脑风暴的重要工具。其制作方式主要有手绘和软件两种&#xff0c;随着互联网的发展&#xff0c;软件制作因其便捷性和易于保存逐渐占据主导。如今&#xff0c;在线工具使得用户能够免费创建思维导图。本文将以即…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建Redis集群

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建Redis集群 Redis 集群是一种分布式的 Redis 解决方案&#xff0c;能够在多个节点之间分片存储数据&#xff0c;实现水平扩展和高可用性。与传统的主从架构不同&#xff0c;Redis 集群支持数据自动分片、主节点故…

基于SpringBoot+Vue+MySQL的教学资料管理系统

系统展示 管理员后台界面 教师后台界面 系统背景 在当今信息化高速发展的时代&#xff0c;教育机构面临着日益增长的教学资料管理需求。为了提升教学管理的效率&#xff0c;优化资源的配置与利用&#xff0c;开发一套高效、便捷的教学资料管理系统显得尤为重要。基于SpringBoot…

通信工程学习:什么是MANO管理编排

MANO&#xff1a;管理编排 MANO&#xff1a;Management and Network Orchestration&#xff08;管理和网络编排&#xff09;在网络功能虚拟化&#xff08;NFV&#xff09;架构中扮演着至关重要的角色。MANO是一个由多个功能实体组合而成的层次&#xff0c;这些功能实体负责管理…

嘉宾云集旌城 只为大赛而来 2024ISGC国际烈酒(中国)大奖赛在德阳落下帷幕

秋高气爽、古蜀之源&#xff0c;迎来第六届国际烈酒&#xff08;中国&#xff09;大奖赛&#xff1b;五谷丰登、重装之都&#xff0c;齐聚百名国际烈酒大奖赛评委。 9月18日&#xff0c;由德阳市人民政府、国家葡萄酒及白酒露酒产品质量检验检测中心、上海合作组织多功能经贸平…