当前位置: 首页 > news >正文

全栈开发(四):使用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.mrgr.cn/news/34564.html

相关文章:

  • 代码随想录算法训练营Day11
  • JDK7u21 HashMap版
  • C++之STL—vector容器进阶篇
  • Spring源码学习:SpringMVC(2)DispatcherServlet初始化【子容器9大组件】
  • go解决引入私有包报错“Repository owner does not exist“的两种方式
  • 难题妙解——前K个高频单词
  • Vue从入门到精通:全方位掌握Vue.js开发技能
  • CF 461 B Appleman and Tree 题解(树形 dp+排列组合)
  • MySQL和SQL的区别简单了解和分析使用以及个人总结
  • 手写数字识别案例分析(torch,深度学习入门)
  • 看Threejs好玩示例,学习创新与技术(React-three-fiber)
  • 有空格输入
  • Java设计模式——工厂模式扩展
  • Vue3(二)计算属性Computed,监视属性watch,watchEffect,标签的ref属性,propos属性,生命周期,自定义hook
  • gtk安装和测试
  • 半导体芯闻--20240923
  • Vue使用Vue Router路由:通过URL传递与获取参数
  • excel怎么转换json
  • Java刷题知识总结(一)
  • mapty项目架构