全栈开发(四):使用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
类的主要作用是作为查询用户时的条件类,用于封装查询条件。它通常用于在接收查询参数时,将这些参数封装成对象传递给服务层或数据库查询层,以实现查询操作。具体来说,它的功能包括:
封装查询参数:
current
:当前的页码,默认为1。用于分页查询时指定查询结果的页码。pageSize
:每页显示的数据条数,默认为10。用于分页查询时指定每页要显示的记录数。name
:用户的名称,用于按名称进行模糊或精确查询。age
:用户的年龄,用于按年龄查询。description
:用户的描述信息,作为查询条件之一,用于按用户描述筛选数据。提供数据传输对象(DTO)功能:
- 该类可以在控制器层接受前端传来的查询条件参数,也可以作为参数传递给服务层或数据访问层,从而避免在方法中传递过多参数,使代码更加简洁。
分页功能:
- 通过
current
和pageSize
这两个字段,配合分页逻辑,能够实现用户信息的分页查询。开发者可以通过这两个字段计算出需要查询的具体范围(如数据库的LIMIT
子句中的offset
和limit
),从而提高查询性能,防止一次性返回大量数据。简化条件查询:
- 通过封装成类对象,所有查询条件可以一次性通过该类对象传递,不需要在方法中传递多个单独的查询参数,简化了方法调用的参数列表。
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 类的编写。它们的作用分别如下:
@Data
:
- 自动生成该类的常用方法,如:
getters
(获取属性值的方法)setters
(设置属性值的方法)toString()
(生成该类的字符串表示)equals()
和hashCode()
(用于比较和集合操作)- 这个注解为类提供了所有必要的工具方法,大大简化了开发时的样板代码。
@NoArgsConstructor
:
- 自动生成一个无参构造方法(没有参数的构造器)。
- 这个构造方法可以在不传递任何参数的情况下创建该类的实例。
- 使用场景:当需要先创建一个空对象,然后逐步设置其属性时(比如通过 setter 方法)。
@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
数据的数据库操作。具体功能如下:
继承
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 自动生成并执行,开发者不需要自己写。
与数据库交互:
- 通过
@Mapper
注解,MyBatis 会在程序启动时扫描该接口,将它注册为 MyBatis 的 Mapper,并生成相应的代理对象,处理与数据库的交互。具体来说,它会将UserMapper
接口的方法调用,映射为对应的 SQL 语句,并将 SQL 结果映射为User
对象。可以扩展自定义 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
UserServiceImpl
是UserService
接口的具体实现类,它负责实际执行用户相关的业务逻辑操作。它通过调用数据访问层(如UserMapper
)来实现UserService
接口定义的方法,处理具体的增删改查等业务逻辑。主要作用:
实现业务逻辑:
UserServiceImpl
实现了UserService
接口中定义的各个方法,负责用户的实际操作,比如查询用户、添加用户、删除用户、更新用户等业务逻辑。调用数据访问层:
- 通过注入
UserMapper
,UserServiceImpl
调用 MyBatis-Plus 提供的数据访问层方法,与数据库进行交互,完成对用户数据的操作。UserMapper
提供了基本的 CRUD 操作,而UserServiceImpl
可以将这些操作结合业务逻辑进行封装。为控制层提供服务:
- 控制器层(
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
)。主要作用:
抽象业务逻辑:
UserService
是对用户相关的业务逻辑操作的抽象,不直接操作数据库,而是通过调用数据访问层(比如UserMapper
)来实现业务逻辑。它将业务层与持久层解耦。为控制层提供接口:
UserController
可以调用UserService
中定义的方法,将具体的业务操作(如用户的增删改查)委托给服务层。控制器只负责处理请求和响应,而业务逻辑则在服务层处理。接口定义:
UserService
只是定义了方法签名,而具体的业务逻辑如何执行,通常会在其实现类中进行处理。通过定义接口,可以有多个实现类,并在不同情况下选择不同的实现方式。方法解析:
getAllUsersWithCount(UserQueryCondition condition)
:
- 根据查询条件
UserQueryCondition
,获取所有用户数据和总记录数。该方法返回UserQueryResponse
对象,通常包含用户列表和总记录数,用于分页查询。
addUser(User user)
:
- 该方法负责添加新用户。接收
User
对象作为参数,返回UserCUDResponse
,表示操作的结果(例如操作是否成功、用户的ID等)。
deleteUserById(Long id)
:
- 根据用户 ID 删除用户。接受一个
id
参数,调用底层的删除逻辑,返回UserCUDResponse
表示删除操作的结果。
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
的主要作用:主要功能:
处理 HTTP 请求:
UserController
定义了多个处理方法(例如getAllUsers
、addUser
、deleteUserById
和updateUserById
),用于响应不同的 HTTP 请求类型(GET、POST、DELETE、PUT)。接收和解析请求参数:
- 控制器可以接收客户端传来的请求参数(如查询条件、用户数据等),并通过注解(如
@RequestBody
、@PathVariable
和@Validated
)进行解析和验证。调用服务层:
- 控制器负责调用服务层(如
UserService
)的方法来执行业务逻辑。例如,当接收到添加用户的请求时,控制器会调用UserService
的addUser
方法来执行具体的添加操作。构建响应:
- 控制器将服务层返回的结果(如用户数据、操作结果等)构建成 HTTP 响应返回给客户端。这可能包括状态码、响应体等。
统一接口前缀:
- 通过
@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);}
}