MyBatis-Plus核心配置与自动填充机制详解
博客文章归档功能的实现与优化: 博客文章归档功能
Spring Boot JWT Token 认证配置的内容:Spring Boot JWT Token 认证配置
📚 目录(点击跳转对应章节)
一、MyBatis-Plus插件配置:分页插件的实现
二、自动填充处理器:MetaObjectHandler的深度应用
三、为什么这些配置如此重要?
四、常见问题与解决方案
五、总结
前言
在动手搭建个人博客网站的开发过程中,MyBatis-Plus(简称 MP)作为 MyBatis 的增强框架,帮我大幅简化了数据库层的重复操作,省去了不少写基础 CRUD、通用配置的时间。这篇文章是我对博客开发中 MP 核心配置的复盘总结,重点拆解两个高频使用的关键配置:MyBatis-Plus 插件配置和自动填充处理器,会结合实际开发中的代码示例,讲清楚它们的工作原理,以及我在博客开发中的实践。

一、MyBatis-Plus插件配置:分页插件的实现
依赖配置:
xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
版本按照自己的情况选择,最好不要选3.5.9,选择这个版本我老是遇到莫名的错误,我选择的是3.5.7,且这个mp的依赖支持springboot3.0+
核心配置类:MybatisPlusConfig.java
java
package com.xuan.common.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnClass(MybatisPlusInterceptor.class)
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
关键知识点解析
1. 条件配置的必要性:@ConditionalOnClass
- 作用 :确保配置类仅在类路径中存在
MybatisPlusInterceptor类时生效(即MyBatis-Plus依赖已引入)。 - 为什么重要 :避免在未引入MyBatis-Plus依赖的项目中导致启动失败。例如,当项目仅使用JPA时,此配置不会加载,避免了
ClassNotFoundException。 - 技术原理 :Spring Boot的条件注解机制,在
@ConditionalOnClass指定的类存在时才初始化Bean。
2. 插件拦截器:MybatisPlusInterceptor
- 核心作用:作为MyBatis-Plus的拦截器总线,用于注册和管理各类插件(如分页、性能分析、乐观锁等)。
- 设计逻辑 :通过
addInnerInterceptor方法将具体插件添加到拦截器链中,插件执行顺序由添加顺序决定。
3. 分页插件:PaginationInnerInterceptor
- 关键配置 :
new PaginationInnerInterceptor(DbType.MYSQL)DbType.MYSQL:指定数据库类型,确保生成的分页SQL符合MySQL语法(如LIMIT)。- 为什么需要指定数据库类型 :不同数据库的分页语法差异大(MySQL用
LIMIT,Oracle用ROWNUM),此配置确保分页SQL的兼容性。
- 执行顺序:文档强调"分页插件需放在最后",因为其他插件(如SQL解析)可能修改SQL结构,分页需在最终SQL生成后执行。
4. 配置流程解析
- Spring Boot启动时,检查
MybatisPlusInterceptor类是否存在(由@ConditionalOnClass控制)。 - 若存在,创建
MybatisPlusInterceptorBean。 - 添加
PaginationInnerInterceptor,指定MySQL数据库类型。 - MyBatis-Plus在执行SQL时自动应用此拦截器,实现分页功能。
最佳实践 :在
application.yml中无需额外配置分页参数,因插件已通过代码实现。如需自定义分页参数(如默认页码、每页数量),可在PaginationInnerInterceptor构造函数中传入。

二、自动填充处理器:MetaObjectHandler的深度应用
核心实现类:MyMetaObjectHandler.java
java
package com.xuan.common.handle;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("开始插入填充...");
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "isDelete", Integer.class, 0);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("开始更新填充...");
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
关键知识点解析
1. 自动填充的触发时机
insertFill:在插入数据前自动填充字段(如createTime、updateTime、isDelete)。updateFill:在更新数据前自动填充字段(如updateTime)。- 机制 :MyBatis-Plus在执行
insert/update操作时,自动调用此处理器,无需在Service层手动设置。
2. 严格填充方法:strictInsertFill与strictUpdateFill
- 核心作用 :确保填充字段在实体类中存在,若不存在则抛出异常(
Field not found)。 - 参数解析 :
metaObject:MyBatis的元对象,用于操作实体类属性。字段名:如"createTime"。字段类型:如LocalDateTime.class。默认值:如LocalDateTime.now()。
- 为什么用严格填充:避免因实体类字段拼写错误导致填充失败,提高代码健壮性。
3. 字段填充逻辑详解
| 字段 | 填充时机 | 值 | 业务意义 |
|---|---|---|---|
createTime |
插入时 | LocalDateTime.now() |
记录数据创建时间 |
updateTime |
插入/更新 | LocalDateTime.now() |
记录数据最后修改时间 |
isDelete |
插入时 | 0 |
逻辑删除标志(0=未删除,1=已删除) |
关键细节 :
isDelete默认值设为0,符合常见逻辑删除设计(如is_delete = 0表示有效数据)。
4. 日志记录与调试
- 使用
@Slf4j记录填充操作日志(如log.info("开始插入填充..."))。 - 价值:在开发阶段快速定位填充问题,避免因字段未填充导致的业务逻辑错误。
5. Spring组件注册:@Component
- 使
MyMetaObjectHandler成为Spring管理的Bean,MyBatis-Plus会自动扫描并注册此处理器。 - 替代方案 :也可通过
@Configuration+@Bean注册,但@Component更简洁。

三、为什么这些配置如此重要?
1. 分页插件:提升查询效率
- 传统分页需手动编写
LIMIT语句,易出错且重复。 - MyBatis-Plus分页 :只需在Service层调用
Page对象,框架自动注入分页SQL,代码简洁高效。
2. 自动填充:消除重复代码
-
业务代码中无需再写:
javaentity.setCreateTime(LocalDateTime.now()); entity.setUpdateTime(LocalDateTime.now()); -
收益:减少80%的重复代码,避免因遗漏导致时间字段错误。
3. 与Spring Boot 3.4.2的兼容性
- 代码完全遵循Spring Boot 3.4.2的自动配置规范:
- 使用
@Configuration和@Bean替代XML配置。 - 通过条件注解确保依赖安全。
- 依赖
lombok简化日志和实体类。
- 使用

四、常见问题与解决方案
问题1:分页插件未生效?
- 原因 :未在MyBatis-Plus配置中注册
MybatisPlusInterceptor。 - 解决方案 :确保
MybatisPlusConfig被Spring扫描(如放在@ComponentScan包下),或通过@Import引入。
问题2:自动填充字段未生效?
- 原因 :
- 实体类缺少
createTime/updateTime字段。 - 字段名与
MetaObjectHandler中指定的名称不一致。
- 实体类缺少
- 解决方案 :
- 检查实体类字段名(如
private LocalDateTime createTime;)。 - 确保与
strictInsertFill中的字段名完全一致(区分大小写)。
- 检查实体类字段名(如
问题3:逻辑删除字段isDelete的默认值?
-
业务建议 :根据业务规则调整默认值(如
isDelete = 1表示已删除)。 -
代码修改 :
javathis.strictInsertFill(metaObject, "isDelete", Integer.class, 1); // 1=已删除

五、总结
MyBatis-Plus的插件配置 和自动填充机制是提升开发效率的核心功能:
- 插件配置 通过
MybatisPlusInterceptor和PaginationInnerInterceptor实现分页,需注意数据库类型配置与插件顺序。 - 自动填充 通过
MetaObjectHandler实现createTime、updateTime、isDelete的自动注入,避免重复代码,确保数据一致性。
这些配置不仅符合Spring Boot 3.4.2的最佳实践,还显著降低了维护成本。在实际项目中,建议:
- 根据数据库类型(MySQL/Oracle/PostgreSQL)调整
DbType。 - 通过
strictInsertFill/strictUpdateFill确保字段安全。 - 为逻辑删除字段设计合理的默认值。
技术提示 :在复杂业务场景中,可扩展
MetaObjectHandler添加更多自动填充逻辑(如createBy、updateBy),进一步提升代码质量。
createBy:仅在数据首次插入时自动填充,用于永久记录该条数据的创建者。updateBy:在数据插入和每次更新时都会自动填充,用于实时记录该条数据的最后修改者。
