自学内容网 自学内容网

全栈开发(四):使用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;       // 当前页码,默认值为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);
    }
}


原文地址:https://blog.csdn.net/qq_53479087/article/details/142469722

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!