个人博客网站搭建day5--MyBatis-Plus核心配置与自动填充机制详解(漫画解析)

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. 配置流程解析
  1. Spring Boot启动时,检查MybatisPlusInterceptor类是否存在(由@ConditionalOnClass控制)。
  2. 若存在,创建MybatisPlusInterceptor Bean。
  3. 添加PaginationInnerInterceptor,指定MySQL数据库类型。
  4. 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 :在插入数据前自动填充字段(如createTimeupdateTimeisDelete)。
  • updateFill :在更新数据前自动填充字段(如updateTime)。
  • 机制 :MyBatis-Plus在执行insert/update操作时,自动调用此处理器,无需在Service层手动设置。
2. 严格填充方法:strictInsertFillstrictUpdateFill
  • 核心作用 :确保填充字段在实体类中存在,若不存在则抛出异常(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. 自动填充:消除重复代码

  • 业务代码中无需再写:

    java 复制代码
    entity.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:自动填充字段未生效?

  • 原因
    1. 实体类缺少createTime/updateTime字段。
    2. 字段名与MetaObjectHandler中指定的名称不一致。
  • 解决方案
    • 检查实体类字段名(如private LocalDateTime createTime;)。
    • 确保与strictInsertFill中的字段名完全一致(区分大小写)。

问题3:逻辑删除字段isDelete的默认值?

  • 业务建议 :根据业务规则调整默认值(如isDelete = 1表示已删除)。

  • 代码修改

    java 复制代码
    this.strictInsertFill(metaObject, "isDelete", Integer.class, 1); // 1=已删除

五、总结

MyBatis-Plus的插件配置自动填充机制是提升开发效率的核心功能:

  1. 插件配置 通过MybatisPlusInterceptorPaginationInnerInterceptor实现分页,需注意数据库类型配置与插件顺序。
  2. 自动填充 通过MetaObjectHandler实现createTimeupdateTimeisDelete的自动注入,避免重复代码,确保数据一致性。

这些配置不仅符合Spring Boot 3.4.2的最佳实践,还显著降低了维护成本。在实际项目中,建议:

  • 根据数据库类型(MySQL/Oracle/PostgreSQL)调整DbType
  • 通过strictInsertFill/strictUpdateFill确保字段安全。
  • 为逻辑删除字段设计合理的默认值。

技术提示 :在复杂业务场景中,可扩展MetaObjectHandler添加更多自动填充逻辑(如createByupdateBy),进一步提升代码质量。

  • createBy:仅在数据首次插入时自动填充,用于永久记录该条数据的创建者。
  • updateBy:在数据插入和每次更新时都会自动填充,用于实时记录该条数据的最后修改者。
相关推荐
weixin_446260851 小时前
win11本地部署openclaw实操第4集-wsl方式实现飞书机器人功能
java·机器人·飞书
啊卡无敌1 小时前
工作中常用的软件架构设计方法
java
2301_792185881 小时前
快速熟悉后缀为yml的文件
java·linux·数据库
夕除1 小时前
js--25
java
Penge6661 小时前
Go中间件:递归组装与反向迭代组装
后端
钦拆大仁1 小时前
Java中的泛型
java·开发语言
计算机学姐1 小时前
基于SpringBoot的服装购物商城销售系统【协同过滤推荐算法+数据可视化统计】
java·vue.js·spring boot·mysql·信息可视化·mybatis·推荐算法
初次攀爬者1 小时前
Redis脑裂问题处理——基于min-replicas-to-write配置
redis·后端
程序员阿明2 小时前
spring security6+spring boot 3.5.9最新版本集成oauth2.1
android·spring boot·spring