别再写重复的CRUD了!用MyBatis-Plus + SpringBoot 3.x,10分钟搞定用户管理模块
SpringBootMyBatis-PlusCRUDJava开发
于 2026-05-29 11:36:28 修改 ·本内容遵循CC 4.0 BY-SA版权协议
告别CRUD重复劳动:MyBatis-Plus与SpringBoot 3.x的高效开发实践
在Java后端开发领域,CRUD(增删改查)操作占据了日常工作的很大比重。对于经验丰富的开发者而言,这些基础功能的重复实现不仅枯燥乏味,更是对宝贵时间的巨大浪费。本文将展示如何利用MyBatis-Plus 3.4.3与SpringBoot 3.x的强大组合,在10分钟内构建一个完整的用户管理模块,同时分享实际项目中的最佳实践和避坑指南。
1. 环境准备与项目初始化
1.1 创建SpringBoot 3.x项目
使用Spring Initializr快速初始化项目时,需要注意几个关键选择:
BASH
2
curl https://start.spring.io/starter.zip \
3
-d dependencies=web,mybatis-plus,lombok,mysql \
7
-d groupId=com.example \
8
-d artifactId=user-management \
关键依赖说明:
- SpringBoot 3.1.0:要求Java 17+环境
- MyBatis-Plus 3.4.3:提供强大的CRUD封装
- Lombok:简化实体类编写
- MySQL Driver:数据库连接驱动
1.2 数据库配置优化
在application.yml中配置数据库连接时,推荐使用Druid连接池并添加性能优化参数:
YAML
3
type: com.alibaba.druid.pool.DruidDataSource
4
url: jdbc:mysql://localhost:3306/user_db?useSSL=false&serverTimezone=Asia/Shanghai
12
validation-query: SELECT 1
提示:SpringBoot 3.x默认不再自动配置HikariCP,需要显式声明使用Druid
2. 核心代码实现
2.1 实体类设计
利用MyBatis-Plus注解简化实体类定义:
JAVA
4
@TableId(type = IdType.AUTO)
7
@TableField("username")
8
private String username;
10
@TableField(fill = FieldFill.INSERT)
11
private LocalDateTime createTime;
13
@TableField(fill = FieldFill.INSERT_UPDATE)
14
private LocalDateTime updateTime;
17
private Integer version;
关键注解说明:
@TableField(fill = FieldFill.xxx):自动填充策略
@Version:乐观锁实现
@TableLogic:逻辑删除标记(可选)
2.2 Mapper层实现
MyBatis-Plus的强大之处在于其BaseMapper提供的通用方法:
JAVA
2
public interface UserMapper extends BaseMapper<User> {
4
@Select("SELECT * FROM sys_user WHERE username LIKE CONCAT('%',#{username},'%')")
5
List<User> searchByUsername(String username);
2.3 Service层最佳实践
采用继承ServiceImpl的方式可以同时获得通用CRUD和自定义方法:
JAVA
1
public interface UserService extends IService<User> {
2
Page<User> queryByCondition(QueryUserDTO dto);
6
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
7
implements UserService {
10
public Page<User> queryByCondition(QueryUserDTO dto) {
12
.like(StringUtils.isNotBlank(dto.getUsername()), User::getUsername, dto.getUsername())
13
.between(dto.getStartTime() != null && dto.getEndTime() != null,
14
User::getCreateTime, dto.getStartTime(), dto.getEndTime())
注意:lambdaQuery()是MyBatis-Plus 3.x新增的链式查询API,比传统条件构造器更直观
3. 高级特性应用
3.1 自动填充策略
实现MetaObjectHandler来处理创建时间和更新时间:
JAVA
2
public class MyMetaObjectHandler implements MetaObjectHandler {
4
public void insertFill(MetaObject metaObject) {
5
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
9
public void updateFill(MetaObject metaObject) {
10
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
3.2 乐观锁实现
在配置类中注册乐观锁插件:
JAVA
2
public class MybatisPlusConfig {
4
public MybatisPlusInterceptor mybatisPlusInterceptor() {
5
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
6
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
3.3 分页查询优化
配置分页插件并实现DTO转换:
JAVA
3
public MybatisPlusInterceptor paginationInterceptor() {
4
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
5
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
11
public class QueryUserDTO {
12
private String username;
13
private LocalDateTime startTime;
14
private LocalDateTime endTime;
16
public Page<User> toPage() {
17
return new Page<>(1, 10);
4. 接口设计与Swagger集成
4.1 RESTful接口规范
遵循RESTful最佳实践的Controller实现:
JAVA
2
@RequestMapping("/api/users")
4
public class UserController {
7
private UserService userService;
10
@Operation(summary = "分页查询用户列表")
11
public R<Page<User>> list(QueryUserDTO dto) {
12
return R.success(userService.queryByCondition(dto));
16
@Operation(summary = "创建用户")
17
public R<Boolean> create(@Valid @RequestBody CreateUserDTO dto) {
18
return R.success(userService.save(dto.toEntity()));
4.2 Swagger 3.0配置
SpringBoot 3.x推荐使用SpringDoc OpenAPI:
JAVA
6
description = "基于MyBatis-Plus的用户管理接口"
9
public class SwaggerConfig {
12
public GroupedOpenApi publicApi() {
13
return GroupedOpenApi.builder()
14
.group("user-management")
15
.pathsToMatch("/api/**")
访问地址:http://localhost:8080/swagger-ui.html
5. 性能优化与生产建议
5.1 二级缓存配置
在application.yml中启用MyBatis二级缓存:
YAML
4
local-cache-scope: session
5.2 SQL执行监控
配置P6Spy实现SQL日志美化:
XML
3
<groupId>p6spy</groupId>
4
<artifactId>p6spy</artifactId>
5
<version>3.9.1</version>
配置spy.properties:
PROPERTIES
1
module.log=com.p6spy.engine.logging.P6LogFactory
2
driverlist=com.mysql.cj.jdbc.Driver
3
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
4
customLogMessageFormat=%(executionTime)ms | %(category) | connection %(connectionId) | %(sqlSingleLine)
5.3 常见问题排查
问题1:插入数据时ID不自动递增
解决方案:确保实体类@TableId注解配置正确,数据库字段设置为自增
问题2:更新操作不触发自动填充
解决方案:检查@TableField(fill = FieldFill.UPDATE)注解和MetaObjectHandler实现
问题3:分页查询结果不正确
解决方案:确认已正确配置分页插件,且Page对象参数传递正确
在实际项目中,我们团队发现将MyBatis-Plus与SpringBoot 3.x结合使用时,最大的效率提升来自于lambda表达式查询和自动填充功能。特别是在处理包含多个条件的复杂查询时,lambdaQuery()的链式调用方式比传统的XML映射文件或注解方式更加直观和类型安全。